在介绍图像着色原理之前,先介绍一下opencv的颜色空间
目前基于opencv实现图像原理中定义的颜色空间分为三种:
RGB
RGB就是常说的光学三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色),取值范围在[0,255]。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式。
import cv2 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 image='color.jpg' img=cv2.imread(image,cv2.IMREAD_COLOR) b,g,r=cv2.split(img) img2=cv2.merge([r,g,b]) img_b=img[:,:,0] img_g=img[:,:,1] img_r=img[:,:,2] plt.figure(figsize=(12,8)) plt.subplot(2,2,1) plt.imshow(img2) plt.title('原始图像') plt.axis('off') plt.subplot(2,2,2) plt.imshow(img_b) plt.title("B") plt.axis('off') plt.subplot(2,2,3) plt.imshow(img_g) plt.title("G") plt.axis('off') plt.subplot(2,2,4) plt.imshow(img_r) plt.title("R") plt.axis('off') plt.show()
为了解决matplotlib中文乱码问题
#window plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体 #mac plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
opencv读取图片是BGR格式,matplotlib展示要RGB格式,所以需要对图像进行通道转换
HSV
色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)
import cv2 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 image='color.jpg' img=cv2.imread(image,cv2.IMREAD_COLOR) b,g,r=cv2.split(img) img2=cv2.merge([r,g,b]) img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) img_h=img_hsv[:,:,0] img_s=img_hsv[:,:,1] img_v=img_hsv[:,:,2] plt.figure(figsize=(12,8)) plt.subplot(2,2,1) plt.imshow(img2) plt.title('原始图像') plt.axis('off') plt.subplot(2,2,2) plt.imshow(img_h) plt.title("H") plt.axis('off') plt.subplot(2,2,3) plt.imshow(img_s) plt.title("S") plt.axis('off') plt.subplot(2,2,4) plt.imshow(img_v) plt.title("V") plt.axis('off') plt.show()
Lab
Lab颜色模型由三个要素组成
L:代表亮度,范围在[0,100],0时代表黑色,100时代表白色
a:a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值),范围是从负数变到正数,对应颜色从绿色变到红色,取值[-128,+127],其中值为0时,为灰色。
b :b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值),范围是从负数变到正数,对应颜色从蓝色变到黄色,取值[-128,+127],其中值为0时,为灰色。
import cv2 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题 image='color.jpg' img=cv2.imread(image,cv2.IMREAD_COLOR) b,g,r=cv2.split(img) img2=cv2.merge([r,g,b]) img_lab=cv2.cvtColor(img,cv2.COLOR_BGR2LAB) img_l=img_lab[:,:,0] img_a=img_lab[:,:,1] img_b=img_lab[:,:,2] plt.figure(figsize=(12,8)) plt.subplot(2,2,1) plt.imshow(img2) plt.title('原始图像') plt.axis('off') plt.subplot(2,2,2) plt.imshow(img_l) plt.title("L") plt.axis('off') plt.subplot(2,2,3) plt.imshow(img_a) plt.title("A") plt.axis('off') plt.subplot(2,2,4) plt.imshow(img_b) plt.title("B") plt.axis('off') plt.show()