opencv-python之色彩空间转换

色彩空间转换

  • GRAY色彩空间
  • XYZ色彩空间
  • YCrCb色彩空间
  • HSV色彩空间
  • 空间转换函数
    • RGB与GRAY
    • RGB与XYZ
    • RGB与YCrCb
    • RGB与HSV

GRAY色彩空间

GRAY色彩空间通常指八位灰度图,其矩阵形状为 m × n m\times n m×n,值在 [ 0 , 255 ] [0,255] [0,255]间,代表由黑到白。

RGB色彩空间转化到GRAY色彩空间的处理方式是:
G r a y = 0.299 R + 0.587 G + 0.114 B Gray=0.299R+0.587G+0.114B Gray=0.299R+0.587G+0.114B
也可以简化为
G r a y = R + G + B 3 Gray=\frac{R+G+B}{3} Gray=3R+G+B
GRAY色彩空间转化到RGB色彩空间的处理方式是:
R = G r a y G = G r a y B = G r a y R=Gray\\ G=Gray\\ B=Gray R=GrayG=GrayB=Gray

XYZ色彩空间

XYZ色彩空间由国际照明委员会(CIE)提出,该色彩空间更便于计算。

RGB色彩空间转化到XYZ色彩空间的处理方式是:
[ X Y Z ] = [ 0.412453 0.357580 0.180423 0.212671 0.715160 0.072169 0.019334 0.119193 0.950227 ] [ R G B ] \begin{bmatrix}X\\Y\\Z\end{bmatrix}= \begin{bmatrix}0.412453&0.357580&0.180423\\ 0.212671&0.715160&0.072169\\ 0.019334&0.119193&0.950227\\ \end{bmatrix} \begin{bmatrix}R\\G\\B\end{bmatrix} XYZ = 0.4124530.2126710.0193340.3575800.7151600.1191930.1804230.0721690.950227 RGB
XYZ色彩空间转化到RGB色彩空间的处理方式是:
[ R G B ] = [ 3.240479 − 1.537150 − 0.498535 − 0.969256 1.875992 0.041556 0.055648 − 0.204043 1.057311 ] [ X Y Z ] \begin{bmatrix}R\\G\\B\end{bmatrix}= \begin{bmatrix}3.240479&-1.537150&-0.498535\\ -0.969256&1.875992&0.041556\\ 0.055648&-0.204043&1.057311\\ \end{bmatrix} \begin{bmatrix}X\\Y\\Z\end{bmatrix} RGB = 3.2404790.9692560.0556481.5371501.8759920.2040430.4985350.0415561.057311 XYZ

YCrCb色彩空间

人眼视觉系统对颜色的敏感度要弱于对亮度的敏感度。

RGB色彩空间中,R,G,B三个分量具有同等地位,但忽略了亮度信息的表达。

在YCrCb色彩空间中,Y表示光源亮度,色度信息保存在Cr和Cb分量中,其中,Cr表示红色分量,Cb表示蓝色分量。

R,G,B三个分量中,绿色分量对颜色亮度影响最大,蓝色分量影响最小。

RGB色彩空间转化到YCrCb色彩空间的处理方式是:
Y = 0.299 R + 0.587 G + 0.114 B C r = 0.713 ( R − Y ) + δ C b = 0.564 ( B − Y ) + δ Y=0.299R+0.587G+0.114B\\ Cr=0.713(R-Y)+\delta\\ Cb=0.564(B-Y)+\delta Y=0.299R+0.587G+0.114BCr=0.713(RY)+δCb=0.564(BY)+δ
YCrCb色彩空间转化到RGB色彩空间的处理方式是:
R = Y + 1.403 ( C r − δ ) G = Y − 0.714 ( C r − δ ) − 0.344 ( C b − δ ) B = Y + 1.773 ( C b − δ ) R=Y+1.403(Cr-\delta)\\ G=Y-0.714(Cr-\delta)-0.344(Cb-\delta)\\ B=Y+1.773(Cb-\delta) R=Y+1.403(Crδ)G=Y0.714(Crδ)0.344(Cbδ)B=Y+1.773(Cbδ)
其中,
δ = { 128 8 位图像 32768 16 位图像 0.5 单精度图像 \delta=\begin{cases} 128&8位图像\\ 32768&16位图像\\ 0.5&单精度图像\end{cases} δ= 128327680.58位图像16位图像单精度图像

HSV色彩空间

RGB色彩空间是从硬件的角度进行考虑而得出的模型,而HSV色彩空间则更加面向视觉感知。

从心理学和视觉的角度,人眼的色彩知觉主要包含三个要素:色调/色相(Hue),饱和度(Saturation),亮度(Value)

  • 色调与混合光谱的主要波长有关,而主要波长的不同体现为“颜色”的差异。色调环取值为0-360,其中0,120,240代表红,绿,蓝
  • 饱和度指相对纯净度,能够描述颜色掺入白光的数量。饱和度越高,所掺白光越少。纯色饱和度高。可控制颜色的深浅。
  • 亮度指人眼感受到的光的明暗程度。可控制颜色的明暗。

RGB色彩空间转化到HSV色彩空间的处理方式是:
V = max ⁡ ( R , G , B ) S = { V − m i n ( R , G , B ) V V ≠ 0 0 V = 0 H = { 60 ( G − B ) V − min ⁡ ( R , G , B ) V = R 120 + 60 ( B − R ) V − min ⁡ ( R , G , B ) V = G 240 + 60 ( R − G ) V − min ⁡ ( R , G , B ) V = R V=\max(R,G,B)\\ S=\begin{cases} \frac{V-min(R,G,B)}{V}&V\ne 0\\ 0 &V=0\\ \end{cases}\\ H=\begin{cases} \frac{60(G-B)}{V-\min({R,G,B})}&V=R\\ 120+\frac{60(B-R)}{V-\min({R,G,B})}&V=G\\ 240+\frac{60(R-G)}{V-\min({R,G,B})}&V=R\\ \end{cases} V=max(R,G,B)S={VVmin(R,G,B)0V=0V=0H= Vmin(R,G,B)60(GB)120+Vmin(R,G,B)60(BR)240+Vmin(R,G,B)60(RG)V=RV=GV=R

空间转换函数

dst=cv2.cvtColor(src, code)
  • src为原图像,dst为目标图像
  • code为空间转换的类型,格式为cv2.XXX2XXX

RGB与GRAY

import cv2

# 载入图像
bgr0 = cv2.imread("../image/LenaRGB.bmp")
cv2.namedWindow("GRAY", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR0", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR1", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)

# 空间转化
gray = cv2.cvtColor(bgr0, cv2.COLOR_BGR2GRAY)
bgr1 = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)

# 显示与检验
cv2.imshow("GRAY", gray)
cv2.imshow("BGR0", bgr0)
cv2.imshow("BGR1", bgr1)
key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

print(bgr0[1, 1])
print(gray[1, 1])
print(bgr1[1, 1])
[125 137 226]
162
[162 162 162]

opencv-python之色彩空间转换_第1张图片

RGB与XYZ

import cv2

# 载入图像
bgr0 = cv2.imread("../image/LenaRGB.bmp")
cv2.namedWindow("XYZ", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR0", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR1", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)

# 空间转化
xyz = cv2.cvtColor(bgr0, cv2.COLOR_BGR2XYZ)
bgr1 = cv2.cvtColor(xyz, cv2.COLOR_XYZ2BGR)

# 显示与检验
cv2.imshow("XYZ", xyz)
cv2.imshow("BGR0", bgr0)
cv2.imshow("BGR1", bgr1)
key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

print(bgr0[1, 1])
print(xyz[1, 1])
print(bgr1[1, 1])
[125 137 226]
[165 155 139]
[125 137 227]

opencv-python之色彩空间转换_第2张图片

RGB与YCrCb

import cv2

# 载入图像
bgr0 = cv2.imread("../image/LenaRGB.bmp")
cv2.namedWindow("YCrCb", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR0", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR1", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)

# 空间转化
ycrcb = cv2.cvtColor(bgr0, cv2.COLOR_BGR2YCR_CB)
bgr1 = cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR)

# 显示与检验
cv2.imshow("YCrCb", ycrcb)
cv2.imshow("BGR0", bgr0)
cv2.imshow("BGR1", bgr1)
key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

print(bgr0[1, 1])
print(ycrcb[1, 1])
print(bgr1[1, 1])
[125 137 226]
[162 174 107]
[125 137 227]

opencv-python之色彩空间转换_第3张图片

RGB与HSV

import cv2

# 载入图像
bgr0 = cv2.imread("../image/LenaRGB.bmp")
cv2.namedWindow("HSV", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR0", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.namedWindow("BGR1", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)

# 空间转化
hsv = cv2.cvtColor(bgr0, cv2.COLOR_BGR2HSV)
bgr1 = cv2.cvtColor(ycrcb, cv2.COLOR_HSV2BGR)

# 显示与检验
cv2.imshow("HSV", ycrcb)
cv2.imshow("BGR0", bgr0)
cv2.imshow("BGR1", bgr1)
key = chr(cv2.waitKey())
if key == "1":
    print("图像显示结束")
    cv2.destroyAllWindows()

print(bgr0[1, 1])
print(hsv[1, 1])
print(bgr1[1, 1])
[125 137 226]
[  4 114 226]
[124 138 226]

opencv-python之色彩空间转换_第4张图片

你可能感兴趣的:(opencv-python,python,opencv,算法)