转载请注明出处: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
就可以顺利安装。