如下實驗基於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