這裏雖然題目是圖像的基礎操做,下面也是關於一些圖像的像素操做,但其實在OpenCV3中,圖像用的是numpy裏的ndarray類型存儲的,因此這裏的一些操做與numpy
聯繫更密切一點。在OpenCV中最經常使用的圖像有RGB圖像(彩色)和灰度圖(包括二值圖)。
RGB圖像是一個長*寬*3的array
類型數組,例如:
這是一個2*2的彩色圖片,它的array數組是:
[
[ [0,0,255],[0,0,0] ],
[ [255,0,0],[0,255,0] ]
]
灰度圖只一個長*寬的array
類型的數組,它不像彩色圖有RGB三通道,灰度圖只有一個單通道,表示灰度,範圍是[0-255],0表示灰度最大,爲黑色,255表示灰度最小,爲白色。例如:
這是一個2*2的灰度圖片,它的array
數組是:
[
[ 80, 0 ],
[ 199,120 ]
]python
這裏咱們以彩色RGB圖像爲例,講述獲取和修改像素值。
首先咱們要讀入一幅圖像算法
import cv2 import numpy as np img=cv2.imread(r'opencv_logo.jpg') cv2.imshow('logo',img) cv2.waitKey(0) cv2.destroyAllWindows()
運行結果以下:
這裏顯示的是OpenCV的大logo,接下來讓咱們試着操做圖片中的像素吧。ui
pixel1=img[200,200] print(pixel1) pixel2_blue=img[200,200,0] print(pixel2_blue)
將上面的代碼複製到一開始寫的代碼中。
輸出結果:
注意:有些IDE中可能沒有顯示出輸出結果,這時須要去掉代碼的後三行。spa
cv2.imread
返回的就是一個array
數組,對RGB圖像來說,對本例子來說,是個300*312*3的數組。img[200,200]
,索引第一個數字表示行,第二個數字表示列,返回200行,200列處的像素值,是個3通道的值;img[200,200,0]
,前兩個數字同樣,最後一個0表示三通道中的第一個藍色通道的值(OpenCV彩色圖像是用BGR形式表示的,這裏須要注意一下)。.net
一樣,咱們也可修改像素值,3d
img[200,200] = [0,255,0] #img[200,200,0] = [0],這行註釋掉,以後將上面一行註釋掉,運行這一行
運行一下程序:
同窗們可能注意到藍色弧形那邊有一個小點顏色被改變了,仔細看!code
若是是獲取和修改單通道的值,推薦另一種寫法:blog
print(img.item(200,200,2)) #獲取單通道的值 img.itemset((200,200,2),100) #修改單通道的值
注意:img.item和img.itemset只能獲取和修改RGB單通道的值,或者灰度圖的值。教程
這可能不明顯,接下來讓咱們大面積的修改顏色吧。
img[180:220,180:220] = [0,255,0]
結果:
這下明顯多了。這裏用到了python中切片的概念,不懂得同窗能夠看看python和numpy的簡單教程。這裏修改了180-220行和180-220列這樣一個矩形方塊的顏色,將它設爲綠色。
import cv2 import numpy as np img=cv2.imread(r'opencv_logo.jpg') print(img.shape) #輸出(300,312,3) print(img.size) #輸出280800 print(img.dtype) #輸出uint8
img.shape
能夠獲取圖像的形狀。返回值是一個包含行數,列數,通道數的元組。灰度圖只返回行數,列數這樣一個元組。因此能夠用這個來判斷圖片類型,是彩色圖仍是灰度圖。
img.size
返回圖像array
數組總的元素個數,對於彩色三通道圖,就是行數*列數*3,對於灰度圖就是行數*列數。
img.dtype
返回圖像的數據類型,也就是array
數組的數據類型。
有時須要對 BGR 三個通道分別進行操做。這時須要把 BGR 拆分紅單個通道。有時須要把獨立通道的圖片合併成一個 BGR 圖像。
import cv2 import numpy as np img=cv2.imread(r'opencv_logo.jpg') b,g,r=cv2.split(img) img=cv2.merge([b,g,r])
cv2.split(img)
返回b,g,r通道,cv2.merge([b,g,r])
合併b,g,r通道。
上述兩個方法屬於OpenCV裏的方法,比較耗時,建議直接使用numpy索引比較快。
例如:b=img[:,:,0]
上面對圖像的操做,其實本質就是對numpy.array操做,因此讀者須要熟悉一下numpy庫的一些簡單操做。
下一節主要講一下圖像上的一些算法操做。