一、色彩空间
1.1 GRAY色彩空间
- GARY色彩空间(灰度图像)通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]。不同数值表示不同程度的灰色。像素值越低,灰色越深。0表示纯黑色,255表示纯白色。
- GARY色彩空间为单通道,所以通常用二维数组表示一幅灰度图像。
1.2 RGB色彩空间
- RGB色彩空间中的所有颜色都可以通过将R(red)红色、G(green)绿色、B(blue)蓝色三个色彩通道按照一定比例混合得到。每个色彩通道值的范围都在[0,255]之间。
1.3 HSV色彩空间
- 它提出人眼的色彩知觉的三要素:H:色调(Hue)S:饱和度(Saturation)V:亮度(Value)。
色调(H):色调是色彩的基本属性,就是平常说的颜色的名称,如“赤橙黄绿青蓝紫”等。色调的取值区间为[0,360]。色调取不同值,所代表的颜色不同。 - 饱和度(S):饱和度指色彩的纯度,通俗的说就是颜色的深浅。饱和度越高色彩越纯,饱和度越低则逐渐变灰。取值范围为0~100%。在OpenCV内,取值范围为0~255。
- 亮度(V):表示色彩亮度,取值区间是0~100%。在OpenCV内,依据公式映射到0~255范围内。 当亮度值为0时,图象是纯黑色。
GRAY | RGB | HSV | |
色彩空间 | ![]() | ![]() | ![]() |
参数 | gray:0~255 | R:0~255 G:0~255 B:0~255 | H:0~255 S:0~255 V:0~255 |
量级 | 256 | 256*256*256 | 256*256*256 |
二、色彩转换
image = cv2.cvtColor(src, code)
image:色彩转换cv2.cvtColor()函数返回的目标函数。
src:要转换的图像对象。
code:色彩转换参数(进行何种色彩转换),常见的参数如下表:
参数(A为透明度通道) | 值 | 解释 |
COLOR_BGR2BGRA | 0 | BGR转换为BGRA |
COLOR_BGRA2BGR | 1 | BGRA转换为BGR |
COLOR_BGR2RGBA | 2 | BGR转换为RGBA |
COLOR_RGBA2BGR | 3 | RGBA转换为BGR |
COLOR_BGR2RGB | 4 | BGR转换为RGB |
COLOR_BGR2GRAY | 6 | BGR转换为GRAY |
COLOR_RGB2GRAY | 7 | RGB转换为GRAY |
COLOR_GRAY2BGR | 8 | GRAY转换为BGR |
COLOR_BGR2HSV | 40 | BGR转换为HSV |
COLOR_RGB2HSV | 41 | RGB转换为HSV |
COLOR_HSV2BGR | 54 | HSV转换为BGR |
COLOR_HSV2RGB | 55 | HSV转换为RGB |
# 示例:
import cv2
img = cv2.imread('Lena.png') # BGR
cv2.imshow('img_bgr',img)
img_gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) # BGR 转 GRAY
cv2.imshow('img_gray',img_gray)
img_rgb = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2RGB) # BGR 转 RGB
cv2.imshow('img_rgb',img_rgb)
img_hsv = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2HSV) # BGR 转 HSV
cv2.imshow('img_hsv',img_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、通道拆分与合并
拆分:cv2.split()
B , G , R = cv2.split(bgr_image)
bgr_image:BGR图像对象。
cv2.split():图像对象通道拆分函数。
B , G , R :图相拆分后返回的对应通道对象。
合并:cv2.merge()
image = cv2.merge([B,G,R])
[B , G , R]或(B , G , R):B , G , R 通道图像对象。(合并结果与顺序有关)
import cv2
# 拆分
img = cv2.imread('Lena.png') # BGR
cv2.imshow('BGR',img)
B , G , R = cv2.split(img)
cv2.imshow('B',B)
cv2.imshow('G',G)
cv2.imshow('R',R)
# 合并
img_rgb = cv2.merge((R,G,B))
cv2.imshow('img_rgb',img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、修改通道数值
HSV图像的H、S、V通道,以及图片透明度 A 通道(透明度) 数值的改变会对图片色彩产生较大的影响。
这里以修改 H 通道对BGR格式图片的影响为示例:
import cv2
# 拆分
img = cv2.imread('Lena.png') # BGR
cv2.imshow('BGR',img)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('img_hsv',img_hsv)
H , S , V = cv2.split(img_hsv)
# 通道数值调整
H = H[:,:] + 200 # 由于‘红、橙、黄、绿、蓝、靛、紫’的顺序,H越大BGR格式色调会变化。
# 合并
img_HSV = cv2.merge((H,S,V))
cv2.imshow('img_HSV',img_HSV) # 先合并为 HSV 格式
img_BGR = cv2.cvtColor(img_HSV,cv2.COLOR_HSV2BGR)
cv2.imshow('img_BGR',img_BGR)
cv2.waitKey(0)
cv2.destroyAllWindows()