轉載請注明出處:danscarlett的博客園
在Python-OpenCV中,因為有numpy這種強大的基礎工具,單通道的灰度圖像(一個8位無符號整型的矩陣)就用numpy的array表示。
如果是多通道情況,最常見的就是紅綠藍(RGB)三通道,則第一個維度是高度,第二個維度是高度,第三個維度是通道。
下圖是一幅3×3圖像在計算機中表示的例子:

右上角的矩陣里,每個元素都是一個3維數組,分別代表這個像素上的三個通道的值。
最常見的RGB通道中,第一個元素就是紅色(
Red)的值,第二個元素是綠色(Green)的值,第三個元素是藍色(Blue),最終得到的圖像如下面的(a)所示。
RGB是最常見的情況,然而在OpenCV中,默認的圖像的表示確實反過來的,也就是BGR,得到的圖像是6-1(b)。可以看到,前兩行的顏色順序都交換了,最后一行是三個通道等值的灰度圖,所以沒有影響。
OpenCV的這個特殊之處還是需要注意的,
比如在Python中,圖像都是用numpy的array表示,但是同樣的array在OpenCV中的顯示效果和matplotlib中的顯示效果就會不一樣。
下面的簡單代碼就可以生成兩種表示方式下,圖6-1中矩陣的對應的圖像,生成圖像后,放大看就能體會到區別:
1 import numpy as np 2 import cv2 3 import matplotlib.pyplot as plt 4 5 # 圖6-1中的矩陣 6 img = np.array([ 7 [[255, 0, 0], [0, 255, 0], [0, 0, 255]], 8 [[255, 255, 0], [255, 0, 255], [0, 255, 255]], 9 [[255, 255, 255], [128, 128, 128], [0, 0, 0]], 10 ], dtype=np.uint8) 11 12 # 用matplotlib存儲 13 plt.imsave('img_pyplot.jpg', img) 14 15 # 用OpenCV存儲 16 cv2.imwrite('img_cv2.jpg', img)


img_pyplot
不管是RGB還是BGR,都是高度×寬度×通道數,H×W×C的表達方式,而在深度學習中,因為要對不同通道應用卷積,所以用的是另一種方式:C×H×W,就是把每個通道都單獨表達成一個二維矩陣,如圖6-1c所示。
備注:matplptlib的安裝
在CMD中運行
python -m pip install matplotlib
就可以順利安裝。