1.GRAY
灰度图片是单通道,用0-255来表示每个像素的颜色。
2.RGB/BGR
彩色图片是三通道【H-W-3】(在opencv里面,以3个2维矩阵进行存储)
(1)人眼
RGB三原色起源于上世纪初1809年Thomas Young提出视觉的三原色学说,随后Helmholtz在1824年也提出了三原色学说:即:视网膜存在三种视锥细胞,分别含有对红、绿、蓝三种光线敏感的视色素,当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋,这样的信息传至大脑中枢,就产生某一种颜色的感觉。
(2)显示器
在显示器发明之后,从黑白显示器发展到彩色显示器,人们开始使用发出不同颜色的光的荧光粉(CRT,等离子体显示器),或者不同颜色的滤色片(LCD),或者不同颜色的半导体发光器件(OLED和LED大型全彩显示牌)来形成色彩,无一例外的选择了Red,Green,Blue这3种颜色的发光体作为基本的发光单元。通过控制他们发光强度,组合出了人眼睛能够感受到的大多数的自然色彩。
(3)计算机
计算机显示彩色图像的时候也不例外,最终显示的时候,要控制一个像素中Red,Green,Blue的值,来确定这个像素的颜色。计算机中无法模拟连续的存储从最暗到最亮的量值,而只能以数字的方式表示。于是,结合人眼睛的敏感程度,使用3个字节(3*8位)来分别表示一个像素里面的Red,Green 和Blue的发光强度数值,这就是常见的RGB格式。
(4)为什么OpenCV读取的图片默认是BGR格式?
OpenCV在1999年由Intel建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,另外对于图片,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图BMP的格式就是BGR。正是基于BGR在当时被广泛使用,于是早期OpenCV开发者就选择BGR颜色格式,这也就成为了一种规范一直用到现在。
(5)通道拆分
方法一:
import cv2
if __name__ == "__main__":
# 读取彩色照片
img = cv2.imread(r'C:\Users\Nobody\Desktop\img1.png',1)
# b,g,r拆分
img_b = img[:, :, 0]
img_g = img[:, :, 1]
img_r = img[:, :, 2]
# 显示照片
cv2.imshow('imgb',img_b)
cv2.imshow('imgg', img_g)
cv2.imshow('imgr', img_r)
# 保存照片
cv2.imwrite(r'C:\Users\Nobody\Desktop\img1_b.png',img_b)
cv2.imwrite(r'C:\Users\Nobody\Desktop\img1_g.png', img_g)
cv2.imwrite(r'C:\Users\Nobody\Desktop\img1_r.png', img_r)
方法二:
img_b,img_g,img_r=cv2.split(img)
输出:
(6)通道合并
# b,g,r合并
new_img = cv2.merge([img_b, img_g, img_r])
cv2.imshow('new_img', new_img)
cv2.imwrite(r'C:\Users\Nobody\Desktop\new_img.png', new_img)
输出:
(7)查看B、G、R通道
import cv2
if __name__ == "__main__":
# 读取彩色照片
img = cv2.imread(r'C:\Users\Nobody\Desktop\img1.png',1)
# b,g,r拆分
# img_b,img_g,img_r=cv2.split(img)
# 查看B
img_b=img.copy()
img_b[:,:,1]=0
img_b[:,:,2]=0
# 查看G
img_g = img.copy()
img_g[:, :, 0] = 0
img_g[:, :, 2] = 0
# 查看R
img_r = img.copy()
img_r[:, :, 0] = 0
img_r[:, :, 1] = 0
# 显示照片
cv2.imshow('imgb',img_b)
cv2.imshow('imgg', img_g)
cv2.imshow('imgr', img_r)
cv2.waitKey()
输出:
3.HSV
更类似于人类感觉颜色的方式。
H:色相(Hue)
S:饱和度(Saturation)
V:亮度(Value)
由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
(1)色相
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:青色为180°,品红为300°,黄色为60°。
(2)饱和度
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
(3)明度
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
(4)取值范围
通常的取值范围为:H: 0— 180,S: 0— 255,V: 0— 255
用度数表示H时,H:0-360,S:0-1,V:0-1
(5)代码示例
import cv2
if __name__ == "__main__":
# 读取彩色照片
img = cv2.imread(r'C:\Users\Nobody\Desktop\img1.png',1)
hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv_img)
cv2.imwrite(r'C:\Users\Nobody\Desktop\hsv.png',hsv_img)
cv2.waitKey()
其它色彩空间处理参考: