AIHGF

Python - OpenCV 图像颜色空间转换 cv2.cvtColor 函数
图像处理时,有些图像可能在 RGB 颜色空间信息不如转换到其它颜色空间更清晰. 这里整理下关于颜色空间的知识,以及...
扫描右侧二维码阅读全文
01
2018/08

Python - OpenCV 图像颜色空间转换 cv2.cvtColor 函数

图像处理时,有些图像可能在 RGB 颜色空间信息不如转换到其它颜色空间更清晰.
这里整理下关于颜色空间的知识,以及 python-opencv 的实现.

图像处理中有多种色彩空间,例如 RGB、HLS、HSV、HSB、YCrCb、CIE XYZ、CIE Lab等,经常要遇到色彩空间的转化,以便生成mask图等操作.

1. OpenCV 颜色转换 - cv2.cvtColor() 函数

import matplotlib.pyplot as plt 
import cv2

img_BGR = cv2.imread('test.jpg') # BGR 
plt.subplot(3,3,1); plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')

img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
plt.subplot(3,3,2); plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')

img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
plt.subplot(3,3,3); plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')

img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
plt.subplot(3,3,4); plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')

img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
plt.subplot(3,3,5); plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')

img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
plt.subplot(3,3,6); plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')

img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
plt.subplot(3,3,7); plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')

img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
plt.subplot(3,3,8); plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')

img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
plt.subplot(3,3,9); plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')
plt.show()

OpenCV - Changing Colorspaces
Python cv2.cvtColor() Examples

2. 颜色空间

主要参考:
- 数字图像处理 颜色空间RGB、HSI、CMYK、YUV的相互转换
- opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学

颜色空间也称彩色模型(彩色空间,彩色系统),主要是在某些标准下用通常可接受的方式对彩色加以说明.
本质上,彩色模型是坐标系统和子空间的阐述. 位于系统的每种颜色都有单个点表示.
在彩色图像处理中,选择合适的彩色模型是很重要的.
从应用的角度来看,众多彩色模型可以分为两类:

  • [1] - 面向诸如彩色显示器或彩色打印机之类输出显示场合使用的硬设备.
  • [2] - 面向视觉感知或者说以彩色处理分析为目的的应用,如动画中的彩色图形,各种图像处理的算法等.(这里主要是图像处理.)

RGB

RGB (Red红色,Green 绿色,Blue 蓝色),是根据人眼识别的颜色而定义的空间,可用于表示大部分颜色,也是图像处理中最基本、最常用、面向硬件的颜色空间,是一种光混合的体系.


RGB 颜色模式用三维空间中的一个点表示一种颜色,每个点有三个分量,分别表示红、绿、蓝的亮度值,亮度值限定为 [0, 1].
在RGB模型的立方体中,
[1] - 原点对应的颜色为黑色,它的三个分量值都为0;
[2] - 距离原点最远的顶点对应的颜色为白色,三个分量值都为1.
[3] - 从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线.
[4] - 立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色.

HSI

HSI 颜色空间可以用一个圆锥空间模型来描述,能清晰表现色调(Hue)、饱和度(Saturation, Chroma)和亮度(Intensity, Brightness)的变化情形.

色相H(Hue) - 表示颜色的相位角. 红、绿、蓝分别相隔120度;互补色分别相差180度,即颜色的类别.
饱和度S(Saturation) - 色彩的强度或纯度. 表示成所选颜色的纯度和该颜色最大的纯度之间的比率,范围:[0, 1],即颜色的深浅程度.
亮度I(Intensity) - 表示颜色的明亮程度,通常以 0% (黑色) 到 100% (白色) 的百分比来衡量(人眼对亮度很敏感).


HSI色彩空间和RGB色彩空间只是同一物理量的不同表示法,它们之间可以进行相互转换:

HSI颜色模式中的色调使用颜色类别表示,饱和度与颜色的白光光亮亮度刚好成反比,代表灰色与色调的比例,亮度是颜色的相对明暗程度.

Last modification:October 9th, 2018 at 09:31 am

4 comments

  1. 静茹秋叶

    请问为什么GRAY的那个图像不是灰度图啊

    1. AIHGF
      @静茹秋叶

      可能是 matplotlib 可视化渲染的问题,img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY);print(img_GRAY.shape) 可以看到 GRAY 是单通道的灰度图了. 可以采用 PIL 库可视化一下:img_pil = Image.fromarray(img_GRAY); img_pil.show() 也可以看到是灰度图.

      1. oukohou
        @AIHGF

        matplotlib默认以彩色图显示图像,不是RGB三通道的会自行渲染成RGB格式,可以在参数里设置:
        plt.imshow(c,cmap=plt.cm.gray)

        1. AIHGF
          @oukohou

          学习了,感谢!

Leave a Comment