软件环境
本系列文章中所提到的接口及代码在以下环境中得到过验证:
Python == 3.8.5
opencv-contrib-python == 4.5.5.64
前言
在进行图像处理的过程中经常需要对图像的色彩空间进行转换,本文将对色彩空间的转换做一定的介绍。
色彩空间也称颜色模型、颜色空间、色彩模型等,它是图像在计算机内部的一种存储方式。常见的色彩空间包括RGB、GRAY、XYZ、YCrCb、HSV等。每种色彩空间都有其擅长的问题解决领域。所以在解决具体色彩问题时就需要进行特定的色彩类型空间转换。
API接口
cv.cvtColor( src, code[, dst[, dstCn]] ) -> dst
官方文档对各个输入参数的解释:
在使用过程中,一般情况下只需关注src,即输入图像的数组,还有code。code常见的取值如下:
转换代码 | 说明 |
---|---|
cv2.COLOR_BGR2RGB | 将BGR色彩空间转换为RGB色彩空间 |
cv2.COLOR_BGR2GRAY | 将BGR色彩空间转换为GRAY色彩空间 |
cv2.COLOR_BGR2YCrCb | 将BGR色彩空间转换为YCrCb色彩空间 |
cv2.COLOR_BGR2HSV | 将BGR色彩空间转换为HSV色彩空间 |
色彩空间转换案例
1、将BGR色彩空间转换为RGB色彩空间
RGB色彩空间使用R(Red,红)、G(Green,绿)、B(Blue,蓝)3种基本颜色表示图像像素。RGB色彩空间中,图像的每一个像素用一个三元组表示,三元组中的3个值依次表示红色、绿色和蓝色,依次对应R、G、B通道。
需要注意的是,OpenCV中默认使用BGR色彩空间,它按照B、G、R通道顺序表示图像。
import cv2
# BGR to RGB
img = cv2.imread('test.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()
从结果可以看出,图像的蓝色通道与红色通道出现了很明显的对调,儿绿色通道没有很明显的改变。
2、将BGR色彩空间转换为GRAY色彩空间
GRAY色彩空间通常指8位灰度图像,其颜色取值范围为[0,255],共256个灰度级。从BGR色彩空间转换为GRAY色彩空间的计算公式为:
- Gray = 0.299R + 0.587G + 0.114B
其中,R、G、B为RGB色彩空间中R、G、B通道的图像。
import cv2
# BGR to GRAY
img = cv2.imread('test.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('BGR', img)
cv2.imshow('GRAY', img_gray)
k = cv2.waitKey(0)
if k == 27:
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('img_gray.png', img_gray)
cv2.destroyAllWindows()
3、将BGR色彩空间转换为YCrCb色彩空间
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(单精度图像)
import cv2
# BGR to YCrCb
img = cv2.imread('test.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()
4、将BGR色彩空间转换为HSV色彩空间
HSV色彩空间使用色调(Hue,也称色相)、饱和度(Saturation)、亮(Value)度表示图像。
- 色调H表示颜色,用角度表示,取值范围为[0°,360°],从红光开始逆时针方向计算。
- 饱和度S表示颜色接近光谱色的程度,或表示光谱色中混入白光的比例。光谱色中白光的比例越低,饱和度越高,颜色越深、艳。光谱色中白光比例为0时,饱和度达到最高。饱和度的取值范围为[0,1]。
- 亮度V表示颜色的明亮的程度,是人眼可感受到的明暗程度,其取值范围为[0,1]。
import cv2
# BGR to HSV
img = cv2.imread('test.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()
一般情况下进行彩色图像阈值化处理时经常将图像转换为HSV色彩空间
参考
https://blog.youkuaiyun.com/weixin_43843069/article/details/121789093
https://docs.opencv.org/4.x/d8/d01/group__imgproc__color__conversions.html#ga397ae87e1288a81d2363b61574eb8cab