Python+OpenCV图像处理(三)——彩色空间互换


系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测

目录

    • 三、彩色空间互换
      • 3.1 简介
      • 3.2 彩色空间转换原理
        • 3.2.1RGB转Gray
        • 3.2.2HSV与RGB互转
      • 3.3 OpenCV+Python实现


三、彩色空间互换

3.1 简介

众所周知,对于彩色图像来说不仅仅有RGB空间,还有很多种色彩空间,例如HSV、HSI等。对于OpenCV来说,其读入图像都是BGR格式的,这里注意,不是RGB格式的,但是仅仅只是换了顺序。
由于在图像处理中,很多算法都不是基于RGB彩色空间进行的,所以需要对图像的色彩空间进行转换。各种色彩空间的转换就叫做彩色空间互换。

3.2 彩色空间转换原理

常见的彩色空间有RGB、Gray和HSV。对于它们,常见的转换有RGB到Gray,RGB到HSV等。

3.2.1RGB转Gray

RGB

RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。红绿蓝代表可见光谱中的三种基本颜色或称为三原色,每一种颜色按其亮度的不同分为256个等级。当色光三原色重叠时,由于不同的混色比例能产生各种中间色,例如,三原色相加可产生白色,如图:

Python+OpenCV图像处理(三)——彩色空间互换_第1张图片

其在笛卡尔坐标系中,对应的颜色空间如图:

Python+OpenCV图像处理(三)——彩色空间互换_第2张图片   Python+OpenCV图像处理(三)——彩色空间互换_第3张图片

RGB2Gray

从RGB空间转换到Gray,可以通过下面的公式实现:

Gray = R * 0.299 + G * 0.587 + B * 0.114

公式中的系数为什么是这三个呢?研究表明,人眼对红绿蓝的权重接近3:6:1,会看起来更舒服,这就是上述公式叫做心理学模型的原因。

3.2.2HSV与RGB互转

HSV

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。可以用于偏光矫正、去除阴影、图像分割等。

Python+OpenCV图像处理(三)——彩色空间互换_第4张图片   Python+OpenCV图像处理(三)——彩色空间互换_第5张图片

RGB2HSV

Python+OpenCV图像处理(三)——彩色空间互换_第6张图片

Python+OpenCV图像处理(三)——彩色空间互换_第7张图片

HSV2RGB

Python+OpenCV图像处理(三)——彩色空间互换_第8张图片

3.3 OpenCV+Python实现

OpenCV中色彩空间转换可以通过cv2.cvtColor(src, flag)实现,其中第一个参数src是输入的图像,第二个参数flag是转换类型,通过下面的指令可以得到所有的flag。

#%%

import cv2 
flags=[i for i in dir(cv2) if i.startswith('COLOR_')]
print (flags)

输出:[‘COLOR_BAYER_BG2BGR’, ‘COLOR_BAYER_BG2BGRA’, ‘COLOR_BAYER_BG2BGR_EA’……

彩色空间互换实现

#%%

import cv2
bgr1 = cv2.imread('lena.jpg', 1)
bgr2gray1 = cv2.cvtColor(bgr1, cv2.COLOR_BGR2GRAY)
bgr2hsv1 = cv2.cvtColor(bgr1, cv2.COLOR_BGR2HSV)

img2 = cv2.imread('gogo.png', 1)

fx = 0.66
fy = 0.66
bgr2 = cv2.resize(img2, dsize=None, fx=fx, fy=fy, interpolation = cv2.INTER_NEAREST)

bgr2hsv2 = cv2.cvtColor(bgr2, cv2.COLOR_BGR2HSV)

hsv2bgr2 = cv2.cvtColor(bgr2hsv2, cv2.COLOR_HSV2BGR)

#OpenCV中没有直接从hsv到gray的方法
#hsv2gray2 = cv2.cvtColor(hsv2gray2, cv2.COLOR_HSV2GRAY)
#若要实现,只能两步即hsv->bgr->gray
hsv2bgr2_1 = cv2.cvtColor(bgr2hsv2, cv2.COLOR_HSV2BGR)
bgr2gray2_2 = cv2.cvtColor(hsv2bgr2_1, cv2.COLOR_BGR2GRAY)


cv2.imshow('scr_1', bgr1)
cv2.imshow('bgr2gray_1', bgr2gray1)
cv2.imshow('bgr2hsv_1', bgr2hsv1)

#cv2.imshow('acr_2', bgr2)
cv2.imshow('hsv_2', bgr2hsv2)

cv2.imshow('hsv2bgr_2', hsv2bgr2)
cv2.imshow('hsv2bgr2gray_2', bgr2gray2_2)

cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(cv,opencv,计算机视觉,python)