【opencv圖像處理】圖片通道的拆分——cv2.split

如下實驗基於python==3.6.八、opencv-python==4.1.0.2五、imutils==0.5.二、numpy==1.17.0、matplotlib==3.1.1python


圖片通道的拆分

咱們都知道常規的彩色圖片通常都是三個通道RGB,Red=紅色、Green=綠色、Blue=藍色(有些圖片還有第四個通道A,Alpha=透明度)git

對於一張圖片有幾個通道,只須要經過img.shape進行查看就好了,好比咱們讀取一張圖片,而後打印它的shape值github

發現該圖片高度爲800px,寬度爲600px,一共有三個channelui

img (800, 600, 3)

如今試着將三個通道拆開,並將三個圖像分別展現出來3d

channels = cv2.split(img)
cv2.imshow("img0", channels[0])
cv2.imshow("img1", channels[1])
cv2.imshow("img2", channels[2])

可是很奇怪,爲何三張圖片都變成了灰度圖片了呢?code

其實從以前的認識中咱們已經知道了,一個通道的圖片都是灰度圖片,三個通道的圖片纔是彩色圖片,如今咱們將一張三個通道的圖片拆成了三張單個通道的圖片,在展現的時候天然就都變成了灰度圖片。blog

打印一下這三張圖片的shape值看一下,確實都是單通道的圖片

channels[0] (800, 600)
channels[1] (800, 600)
channels[2] (800, 600)

看來光分離三個通道是沒有辦法單獨查看純色的圖片的,那麼咱們就須要將這三個單通道的圖片補全成三通道的圖片get

這裏能夠將自身之外的通道都填充爲0,可使用numpy.zeros方法來初始化全爲0的圖片,而後將分離出的單通道去覆蓋響應的通道it

new_img0 = np.zeros(img.shape, dtype='uint8')
new_img0[:, :, 0] = channels[0]
cv2.imshow("img0", new_img0)

new_img1 = np.zeros(img.shape, dtype='uint8')
new_img1[:, :, 1] = channels[1]
cv2.imshow("img1", new_img1)

new_img2 = np.zeros(img.shape, dtype='uint8')
new_img2[:, :, 2] = channels[2]
cv2.imshow("img2", new_img2)

而後再從新顯示這三張圖片看看

能夠看到三個通道已經被單獨展現出來了,可是這個順序有點奇怪,並非咱們認識上的RGB,而是BGR

咱們將原圖使用matplotlib(左)顯示和opencv(右)顯示的圖片比較一下試試,果真顏色不正

咱們再使用cv2.cvtColor方法把BGR轉回RGB,再用matplotlib顯示看看(可是使用opencv顯示時顏色就不正了)

完整代碼已經上傳至github

相關文章
相關標籤/搜索