系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测
众所周知,对于彩色图像来说不仅仅有RGB空间,还有很多种色彩空间,例如HSV、HSI等。对于OpenCV来说,其读入图像都是BGR格式的,这里注意,不是RGB格式的,但是仅仅只是换了顺序。
由于在图像处理中,很多算法都不是基于RGB彩色空间进行的,所以需要对图像的色彩空间进行转换。各种色彩空间的转换就叫做彩色空间互换。
常见的彩色空间有RGB、Gray和HSV。对于它们,常见的转换有RGB到Gray,RGB到HSV等。
RGB
RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。红绿蓝代表可见光谱中的三种基本颜色或称为三原色,每一种颜色按其亮度的不同分为256个等级。当色光三原色重叠时,由于不同的混色比例能产生各种中间色,例如,三原色相加可产生白色,如图:
其在笛卡尔坐标系中,对应的颜色空间如图:
RGB2Gray
从RGB空间转换到Gray,可以通过下面的公式实现:
Gray = R * 0.299 + G * 0.587 + B * 0.114
公式中的系数为什么是这三个呢?研究表明,人眼对红绿蓝的权重接近3:6:1,会看起来更舒服,这就是上述公式叫做心理学模型的原因。
HSV
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。可以用于偏光矫正、去除阴影、图像分割等。
RGB2HSV
或
HSV2RGB
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()