前面了解了灰度图片在python里的表示方式,也是图片的数据结构,它是采用numpy的ndarray来存储,是一个二维的数据结构。那么彩色图片是怎么样表示呢?难道也是采用二维数组吗?在理解表示方式之前,先来看一下彩色图片的基本特征。下雨之后,如果天空中有太阳,往往会形成一道亮丽的彩虹风景,这样就看到了五颜六色。如果学习过初中的物理,就知道这是太阳光经过水珠的折射,把白光进行分解了。基于这个原理,科学家不断地研究,寻找颜色的秘密,以及它的本质。比如白光可以有这么多种颜色组成的,反过来,说明一点,只要找到几种基本的颜色,就可以组合成其它颜色。经过不断试验,发现红色(R)、绿色(G)和蓝色(B)就可以组合出其它颜色,只是每种颜色分量不一样。如果三种颜色份量一样,组合出来的就是白色。旧式的CRT彩色电视机就是采用这个原理,目前LED的显示器也是采用这个原理。那么彩色图片转换为数字化时,也可以采用这个原理。在灰度图片里,每个像素只要使用一个字节就可以表示了,如果彩色图片也采用一个字节来表示,每种颜色表示只能2位或3位来表示,这样颜色非常有限,表示的色彩就失真很多。在以前旧式的电脑是有用这种方式来表示的,随着技术的进步,内存和储存的容量扩大,目前都是每一种颜色采用一个字节来表示,三种颜色共用3个字节来表示,也是24位来表示。比如(0,0,0)表示黑色,(255,255,255)表示白色,(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色。
下面通过一个小程序来看一下在python的OpenCV里是怎么样表示,代码如下:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
#图片的路径
imgname = "img1.jpg"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
print(image)
print(image.shape)
print(type(image))
#分离三个颜色通道
b = image[: , :, 0]
g = image[: , :, 1]
r = image[: , :, 2]
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)
#显示图像
cv2.imshow("image", image)
#等待用户输入,然后删除所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
运行程序之后,可以看到下面的结果输出:
从上面结果可以看到三种颜色的图片,每种颜色的图片数值不一样。
同时也可以看到ndarray的结构为(288, 300, 3),也就是说288表示行,300表示列,3表示颜色的三维数组,它的组成如下:
[[[217 138 129] 表示一列中的一个像素点
[219 140 131]
[222 143 134]
...
[196 123 119]
[194 123 119]
[193 122 118]] 到这里表示一行元素
下一行元素的开始
[[216 137 128]
[218 139 130]
[221 142 133]
...
[196 123 119]
[193 122 118]
[193 122 118]]
由于函数返回的图像以[B G R]的排列表示颜色分量,因此image[: , :, 0]语句是获取蓝色分量的通道数据,image[: , :, 1]语句是获取绿色分量的通道数据,image[: , :, 2]语句是获取红色分量的通道数据,如果要修改不同的颜色,就可以操作相应颜色的通道,就可以改变图片的颜色了。
https://blog.csdn.net/caimouse/article/details/51749579