python+opencv入门-色彩空间及其变换

python+opencv入门-色彩空间及其变换

任务描述

理解色彩空间,并使用OpenCV进行色彩空间转换。

相关知识

你需要掌握:1. 什么是色彩空间;2.如何转换色彩空间。

色彩空间

色彩空间(Color space)是对色彩的组织方式,是坐标系统和子空间的阐述,位于系统的每种颜色都有单个点表示。
目前,色彩空间已经有上百种表示方式,被采用的大多数色彩空间都是面向硬件或面向应用的,大部分只是局部的改变或专用于某一领域。下面我们介绍一些常用的色彩空间。

RGB色彩空间

我们知道,可以使用红色、绿色和蓝色这三种原色生成不同的颜色,这些颜色可以组成了一个色彩空间,称为RGB(Red Green Blue)色彩空间。
RGB是依据人眼识别的颜色定义出的空间,可表示大部分颜色。它是最通用的面向硬件的色彩空间。该色彩空间用于彩色监视器和一大类彩色视频摄像。
在该色彩空间中,将蓝色的量定义为X坐标轴、红色的量定义为Y坐标轴、绿色的量定义为Z坐标轴,就可以得到一个三维空间。所以每种颜色在这个三维空间中都有唯一的一个点与其对应。
完整的RGB色彩空间图如下:
RGB色彩空间图
OpenCV中默认的色彩空间是BGR。BGR与RGB的区别只是三个颜色信道的位置发生了变化,实际上原理相同。
为什么是BGR而不是RGB呢?原因在于当时主流的摄像头制造商和软件供应商都普遍使用这种BGR格式,所以所以一开始时OpenCV采用的就是BGR,然后沿用至今。

HSV与HSL色彩空间

在科学研究一般不采用RGB色彩空间,它将色调,亮度,饱和度三个量放在一起表示,很难分开,这样难以对其进行数字化的调整。所以为了更好的数字化处理颜色,提出了HSV,HSL两个色彩空间。
HSV色彩空间中,H是色调(hue),S是饱和度(saturation), V是明度(value)。
HSL色彩空间中,H是色调(hue),S是饱和度(saturation),L是亮度(lightness)。

灰度空间

在OpenCV的灰度空间中,和一般的色彩空间相同,每一个颜色都有三个量,但是只有第一个亮度有值,所以表示为(亮度,0,0)。
其中,亮度是根据如下灰度公式计算而得:

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

为什么人脸识别需要先对图片进行灰度处理?

识别人脸,最关键的因素是梯度,梯度代表着边缘,用灰度图计算梯度,可以简化矩阵, 提高运算速度。
而颜色信息,很容易受到光照等因素的影响,同类的物体颜色有很多变化,所以颜色本身难以提供关键信息。

色彩空间转换

在OpenCV中有超过150种色彩空间转换的方法。但是我们经常用到的是以下两种:
1.BGR空间到Gray空间 的转换;
2. BGR空间到HSV空间 的转换。
使用的函数为:cv2.cvtColor()。
它的函数声明为:

cv2.cvtColor(图片对象,转换类型)

其中,转换类型,对于BGR到Gray的转换,使cv2.COLOR_BGR2GRAY类型。
同样的,对于BGR到HSV的转换,使用cv2.COLOR_BGR2HSV类型。
示例如下:

# 将图片的色彩空间由BGR转换为HSV
# 执行后output_img的色彩空间变成了HSV
output_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

我们也可以通过以下代码获取到OpenCV提供的所有转换类型:

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

编程要求

将图片的色彩空间转换为灰度空间;
将处理后的图片保存到路径step2/out/girl-gray.jpg下。

import cv2
# 加载图片
filename = "step2/image/girl.jpg"
img = cv2.imread(filename)
#********** Begin **********#
# 将图片的色彩空间由BGR转换GRAY

#********** End **********#
save_image_path = "step2/out/girl-gray.jpg"
#********** Begin **********#
# 保存图片

#********** End **********#

= ======================answe= ======= ===============

import cv2
# 加载图片
filename = "step2/image/girl.jpg"
img = cv2.imread(filename)
#********** Begin **********#
# 将图片的色彩空间由BGR转换GRAY
output_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#********** End **********#
save_image_path = "step2/out/girl-gray.jpg"
#********** Begin **********#
# 保存图片
cv2.imwrite(save_image_path,output_img)
#********** End **********#

猜你喜欢

转载自blog.csdn.net/m0_46742690/article/details/106438392