OpenCV教程3(python)

OpenCV教程3(python)

圖像的基礎操做

這裏雖然題目是圖像的基礎操做,下面也是關於一些圖像的像素操做,但其實在OpenCV3中,圖像用的是numpy裏的ndarray類型存儲的,因此這裏的一些操做與numpy聯繫更密切一點。在OpenCV中最經常使用的圖像有RGB圖像(彩色)和灰度圖(包括二值圖)。
RGB圖像是一個長*寬*3的array類型數組,例如:
RGB圖
這是一個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

1.獲取並修改像素值

這裏咱們以彩色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.jpg圖片連接數組

運行結果以下:
opencv_logo
這裏顯示的是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列這樣一個矩形方塊的顏色,將它設爲綠色。

2.獲取圖像的屬性
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數組的數據類型。

3.拆分及合併圖像通道

有時須要對 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]

4.總結

上面對圖像的操做,其實本質就是對numpy.array操做,因此讀者須要熟悉一下numpy庫的一些簡單操做。

下一節主要講一下圖像上的一些算法操做。

相關文章
相關標籤/搜索