颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV(六角锥体模型,这个模型中颜色的参数分别是色调H、饱和度S、明度V)、HSI等颜色制式,对此OpenCV提供了cvtColor()函数来实现这些功能,这个函数用来进行颜色空间的转换。随着OpenCV版本的升级,对于颜色空间种类的支持也越来越多,涉及不同颜色空间之间的转换,比如RGB和灰度的互转、RGB和HSV的互转等。
cvtColor函数声明如下:
cvtColor(src, code[, dst[, dstCn]]) -> dst
其中,参数src表示输入图像,即要进行颜色空间变换的原图像,可以是数组;code表示颜色空间转换代码,即在此确定将什么制式的图片转换成什么制式的图片;dst表示输出与src相同大小和深度的图像,即进行颜色空间变换后存储图像;dstCn表示目标图像通道数,默认取值为0,表示从src和代码自动获得通道的数量。
函数cvtColor的作用是将一个图像从一个颜色空间转换到另一个颜色空间,但是当从RGB向其他类型转换时,必须明确指出图像的颜色通道。值得注意的是,在OpenCV中,默认的颜色制式排列是BGR而非RGB。因此,对于24位颜色图像来说,前8位是蓝色,中间8位是绿色,最后8位是红色。
需要注意的是,cvtColor函数不能直接将RGB图像转换为二值图像,需要借助threshold函数。另外,如果对8位图像使用cvtColor()函数进行转换,将会丢失一些信息。
我们常用的颜色空间转换有两种:BGR转为灰度图和BGR转为HSV。下面来看一个例子,将图像转换为灰度图和HSV。
【例5.1】 将图片转换为灰度图和HSV
import cv2 #将图片转换为灰度图 src_image = cv2.imread("test.jpg") gray_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2GRAY) #将图片转换为HSV hsv_image = cv2.cvtColor(src_image, cv2.COLOR_BGR2HSV) cv2.imshow("src_image", src_image) cv2.imshow("gray_image", gray_image) cv2.imshow("hsv_image", hsv_image) cv2.waitKey(0)
首先读取工程目录下的图片test.jpg,然后调用cvtColor函数将原图转为灰度图,再调用cvtColor函数将原图转为HSV图,最后将3幅图片显示出来。
运行工程,结果如图5-1所示。
图5-1