1、安裝
如果你是第一次使用OpenCV Python開發包,想要安裝OpenCV Python只要執行如下命令行即可:
pip install opencv-python
如果你還想使用OpenCV Python的擴展模塊,執行如下命令行即可:
pip install opencv-contrib-python
如果你已經安裝了OpenCV以前的3.x版本只需要執行對應的升級安裝命令行如下(假設你已經安裝opencv-python 3.x)
pip install –upgrade opencv-python
如果在安裝的時候遇到python命令不識別或者pip命令行不識別,請執行如下的命令行實現安裝:
python –m pip install opencv-python
或者
python –m pip install opencv-contrib-python
2、圖像與原始字節之間的轉換
從概念上講,一個字節能表示0到255的整數。目前,對於多有的實時圖像應用而言,雖然有其他的表示形式,但一個像素通常由每個通道的一個字節表示。
一個OpenCV圖像是.array類型的二維或三維數組。8位的灰度圖像是一個含有字節值的二維數組。一個24位的BGR圖像是一個三維數組,它也包含了字節值。
可使用表達式訪問這些值,如image[0,0]或image[0,0,0]。第一個值代表像素的y坐標啊或行,0表示頂部;第二個值是像素的x坐標或列,0表示最左邊;
第三個值(如果可用的話)表示顏色通道。如,對於一個左上角有白色像素的8位灰度圖像而言,image[0,0]的值為255. 對於一個左上角有藍色像素的24位BGR圖像而言,image[0,0]是[255,0,0]。
可以用另外一個表示,如image[0,0]或image[0,0]=128,還可表示成image.item((0,0))或image.setitem((0,0),128)。對於單像素操作,第二種表示方式更有效。
若一幅圖像的每個通道為8位,則可將其顯示轉換為標准的一維Python bytearray格式:byteArray = bytearray(image)
反之,bytearray含有恰當順序的字節,可以通過顯示轉換和重構,得到numpy.array形式的圖像:
garyImage = numpy.array(garyByteArray ).reshape(height, width)
bgrImage = numpy.array(bgrByteArray ).reshape(height, width, 3)
下面介紹將含有隨機字節的bytearray轉換為灰度圖像和BGR圖像:
import cv2 import numpy as np import os # 創建一個120000個隨機字節的數組 randomByteArray = bytearray(os.urandom(120000)) #os.urandom(n) 返回n個隨機byte值的string,作為加密使用 flatNumpyArray = np.array(randomByteArray) # 將數組轉換為400 x 300的灰度圖像 garyImage = flatNumpyArray.reshape(300, 400) cv2.imwrite('randomGary.png', garyImage) # 將數組轉換為400 x 300的彩色圖像 bgrImage = flatNumpyArray.reshape(100, 400, 3) cv2.imwrite('randomColor.png', bgrImage)
運行該程序,將會在程序所在目錄中生成兩張灰度圖像(如下所示)。尺寸分別為400 x 100,400 x 400
使用Python標准的os.urandom()函數可隨機生成原始字節,隨后會把該字節轉換為NumPy數組。需要注意的是,諸如numpy.random.randint(0, 256, 120000).reshape(400, 300)
語句也能直接(並且更高效地)隨機生成NumPy數組。使用os.urandom()函數的原因是該語句有助於展示原始字節的轉換。
3、 使用numpy.array訪問圖像數據
加載OpenCV圖像最簡單的方式是使用imread()函數,該函數會返回一幅圖像,這幅圖像是一個數組(根據imread()函數輸入參數的不同,該圖像可能是二維數組,也可能是三維數組)。
y.array結構針對數組操作有很好的優化,它允許某些塊(bulk)操作,這些操作在通常的Python中不可用這些特定的.array操作在OpenCV的圖像處理中會很方便。利用numpy.array
函數來轉換數組比用普通的Python數組轉換要快得多。
waitKey()的參數為等待鍵盤觸發的時間,單位為毫秒,其返回值為-1(表示沒有鍵被按下)
img = cv2.imread('flower.png') img[0,0] = [255, 255, 255] cv2.imshow('flower', img) cv2.waitKey()
在圖像左上方會出現一個白點。
假設想要改變一個特定像素的藍色值,numpy.array提供了item()方法。該函數有3個參數:x(或左)位置,y(或頂部)位置以及(x,y)位置的數組索引(注意,
在BGR圖像中,某一位置的數據是按B,G,R的順序保存的三元數組),該函數能返回索引函數的值。另一個方法是通過itemset()函數可設置指定像素在指定通道的值(
itemset()有兩個參數:一個三元組(x,y和索引)和要設定的值)。如下例子將坐標(150,120)的當前藍色值127變為255
img = cv2.imread('flower.png') print(img.item(150, 120, 0)) # 206 打印當前坐標點的藍色值 img.itemset((150, 120, 0), 255) print(img.item(150, 120, 0)) #255
建議使用內置的濾波器和方法來處理整個圖像,上述方法只適合於處理特定的小區域。
下面介紹操作通道:將指定通道(B,G,R)的所有值置為0.(注:通過循環來處理Python數組的效率非常低,應該盡量避免這樣的操作。使用數組索引可以高效地操作像素。
像素操作是一個高代價的低效操作,特別是在視頻數據處理時,會發現要等很久才能得到結果。可用索引(indexing)來解決該問題)
以下代碼可將圖像所有的G(綠色)值設為0
通過NumPy數組的索引訪問原始像素,還可設定感興趣區域(Region Of Interest, ROI)。一旦設定了該區域,就可以執行許多操作,例如,將該區域與變量綁定,
然后設定第二個區域,並將第一個區域的值分配給第二個區域(將圖像的一部分拷貝到該圖像的另一個位置):
此外,還可使用numpy.array來獲得圖像其他屬性。
shape:NumPy返回包含寬度、高度和通道數(如果圖像是彩色的)數組,這在調試圖像類型時很有用;如果圖像是單色或灰度的,將不包含通道值;
size:該屬性是指圖像像素的大小;
datatype:該屬性會得到圖像的數據類型(通常為一個無符號整數類型的變量和該類型占的位數,比如unit8類型)
img = cv2.imread('flower.png') print(img.shape) print(img.size) print(img.dtype)
運行結果:
(332, 332, 3)
330672
uint8
參考:https://www.cnblogs.com/xiaotongtt/p/6601951.html