9.OpenCV的色彩空间变换
色彩空间也称颜色模型、颜色空间、色彩模型等,它是图像在计算机内部的一种存储方式。常见的色彩空间包括RGB、GRAY、XYZ、YCrCb、HSV等。每种色彩空间都有其擅长的问题解决领域。所以在解决具体色彩问题时就需要进行特定的色彩类型空间转换。
OpenCV的cv2.Color()函数用于转换色彩空间类型。
转换代码 | 说明 |
---|---|
cv2.COLOR_BGR2RGB | 将BGR色彩空间转换为RGB色彩空间 |
cv2.COLOR_BGR2GRAY | 将BGR色彩空间转换为GRAY色彩空间 |
cv2.COLOR_BGR2YCrCb | 将BGR色彩空间转换为YCrCb色彩空间 |
cv2.COLOR_BGR2HSV | 将BGR色彩空间转换为HSV色彩空间 |
RGB色彩空间使用R(Red,红)、G(Green,绿)、B(Blue,蓝)3种基本颜色表示图像像素。RGB色彩空间中,图像的每一个像素用一个三元组表示,三元组中的3个值依次表示红色、绿色和蓝色,依次对应R、G、B通道。
需要注意的是,OpenCV中默认使用BGR色彩空间,它按照B、G、R通道顺序表示图像。
# BGR to RGB
img = cv2.imread('bee.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow('BGR', img)
cv2.imshow('RGB', img_rgb)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('img_rgb.png', img_rgb)
cv2.destroyAllWindows()
GRAY色彩空间通常指8位灰度图像,其颜色取值范围为[0,255],共256个灰度级。从BGR色彩空间转换为GRAY色彩空间的计算公式为:Gray = 0.299R + 0.587G + 0.114B,其中,R、G、B为RGB色彩空间中R、G、B通道的图像。
# BGR to GRAY
img = cv2.imread('bee.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('BGR', img)
cv2.imshow('GRAY', img_gray)
k = cv2.waitKey()
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('img_gray.png', img_gray)
cv2.destroyAllWindows()
YCrCb色彩空间用亮度Y,红色Cr、蓝色Cb表示图像。从BGR色彩空间转换为YCrCb色彩空间的计算公式为:
Y = 0.299R + 0.587G + 0.114B
Cr = 0.713(R - Y) + delta
Cb = 0.564(B - Y) + delta
其中,delta = 128(8位图像)、delta = 32767(16位图像)、delta = 0.5(单精度图像)
# BGR to YCrCb
img = cv2.imread('bee.jpg')
img_YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
cv2.imshow('BGR', img)
cv2.imshow('GRAY', img_YCrCb)
k = cv2.waitKey()
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('img_YCrCb.png', img_YCrCb)
cv2.destroyAllWindows()
HSV色彩空间使用色调(Hue,也称色相)、饱和度(Saturation)、亮(Value)度表示图像。
色调H表示颜色,用角度表示,取值范围为[0°,360°],从红光开始逆时针方向计算。
饱和度S表示颜色接近光谱色的程度,或表示光谱色中混入白光的比例。光谱色中白光的比例越低,饱和度越高,颜色越深、艳。光谱色中白光比例为0时,饱和度达到最高。饱和度的取值范围为[0,1]。
亮度V表示颜色的明亮的程度,是人眼可感受到的明暗程度,其取值范围为[0,1]。
# BGR to HSV
img = cv2.imread('bee.jpg')
img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('BGR', img)
cv2.imshow('HSV', img_HSV)
k = cv2.waitKey()
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('img_HSV.png', img_HSV)
cv2.destroyAllWindows()
OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码
以上内容介绍了OpenCV-Python中几种色彩空间相互变换的基本操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。