OpenCV的色彩空间(cv2.cvtColor)
本博客将介绍 OpenCV 中的三种颜色空间(RGB、HSV、Lab)及其转换,并讨论光照条件和颜色空间在计算机视觉应用中的关键作用。
关键是在编写代码之前始终考虑光照条件!一般来说,控制照明条件比编写代码来补偿以低质量捕获的图像更容易。
-
RGB色彩空间是计算机视觉中最常见的色彩空间。它简单但不直观,因为用肉眼很难准确地确定一种颜色由多少红色、绿色和蓝色组成。渲染为立方体。
-
HSV 颜色空间很直观,允许沿圆柱体而不是 RGB 立方体定义颜色。 HSV 颜色空间还为亮度/白度提供了单独的维度,从而更容易定义颜色深度。
-
RGB和HSV都不能模仿人类感知颜色的方式,而Lab颜色空间可以感知差异,从欧几里得距离判断两种颜色的相似度。
1.效果图
各通道RGB原图VS效果图如下:
HSV原版VS各通道效果图如下:
值图本质上是一个灰度图像——这是因为值控制了颜色的实际亮度,而色相和饱和度定义了实际的颜色和阴影。
Lab VS通道效果图如下:
与 HSV 示例类似,L 通道专用于显示给定像素的亮度。通道 A 和通道 b 确定像素的阴影和颜色。
2.原则
2.1 光照条件的重要性
照明可能意味着计算机视觉算法成败的区别。事实上,光甚至可能是最重要的因素。
在编写代码之前,尽可能获得理想的光照条件。控制照明条件比编写代码来补偿较低的照明条件更容易。
在处理光照条件时应追求三个目标:
-
高对比度(我们应该寻求最大化图像中感兴趣区域之间的对比度(即要检测、提取、描述、分类、操作等的“对象”)与其余部分具有足够高的对比度图像,并尽量确保环境的背景和前景之间的高对比度);
-
Scalable (光照条件应该足够一致,可以扩展);
-
稳定(具有稳定、一致和可重复的照明条件是计算机视觉应用开发的圣杯。)
2.2 opencv中的三种颜色空间/模型
颜色模型是一种在颜色空间中用数字表示颜色的抽象方法。
- RGB
RGB 表示图像中的红、绿、蓝分量,通常被视为一个立方体。
-
RGB色彩空间是加色空间的一个例子:添加的颜色越多,像素越亮,越接近白色;
-
[0255] 共256个值;红+绿u003d黄。红色 + 蓝色 u003d 粉色。红+绿+蓝u003d白。
Ru003d252, Gu003d198, Bu003d188 u003d 白肤色。
Ru003d22, Gu003d159, Bu003d230 u003d 蓝色标志。
- 单纯疱疹病毒
HSV色彩空间将其重塑为圆柱体而不是立方体,亮度是一个单独的维度
-
Hue:色调,你检查的是哪种“纯”颜色。例如,红色的所有阴影和色调都将具有相同的色调。 [0, 179]
-
Saturation:饱和度,颜色有多“白”。完全饱和的颜色将是“纯色”,例如“纯红色”。饱和度为零的颜色将是纯白色。 [0, 255]
-
值:允许您控制颜色的亮度。零值表示纯黑色,而增加该值会产生较浅的颜色。 [0, 255]
-
实验室
在 RGB 和 HSV 颜色空间中,欧几里得距离无法“测量”颜色之间的感知差异。实验室色彩空间可以模仿人类观察和解释色彩的方法。 Lab是一个3轴系统,这使得任意两种颜色之间的欧式距离具有实际的感知意义**
-
L-channel:像素的“亮度”。该值在垂直轴上下变化,从白色到黑色,在轴的中心是中性灰色。
-
a通道:从L通道的中心,在光谱的一端定义纯绿色,在另一端定义纯红色。
-
通道b:从通道L的中心,但垂直于通道a。 b 通道在光谱的一端定义纯蓝色,在光谱的另一端定义纯黄色。同样,虽然 Lab* 颜色空间不像 HSV 和 RGB 颜色空间那样直观且难以理解,但它已经在计算机视觉中得到了广泛的应用。
这是因为颜色之间的距离具有实际的感知意义,这样我们就可以克服各种光照条件的问题。它也被用作强大的彩色图像描述符。
2.3 色彩空间的主要用途
-
RGB:够简单,主要用来在显示器上显示颜色;
-
HSV:当您有兴趣根据颜色跟踪图像中的对象时,使用 HSV 很容易定义颜色范围。
-
Lab:提供感知均匀性,可以模仿人类观察和解释颜色的方法,使两种任意颜色之间的距离具有实际意义。 L * a * b 颜色空间可以在涉及颜色管理、颜色传输或跨多个设备的颜色一致性时提供出色的彩色图像描述符。
-
灰度:不是颜色空间,而是在颜色无关的应用中,比如在检测人脸或构建物体分类器时忽略颜色,使用图像的灰度表示——这样可以节省内存,提高计算效率.
3.源代码
# 加载图像并演示如何使用 RGB、HSV 和 L*a*b * 颜色空间。
#用法
python 颜色_spaces.py
导入必要的包
导入参数解析
导入 cv2
导入 imutils
构造命令行参数并解析
--Image 输入图片路径
ap u003d argparse.ArgumentParser()
ap.add_argument("-i", "--image", typeu003dstr, defaultu003d"ml3.jpg",
helpu003d"输入图像的路径")
args u003d vars(ap.parse_args())
加载图像并显示
图像 u003d cv2.imread(args["图像"])
图像 u003d imutils.resize(图像,宽度 u003d 200)
cv2.imshow("RGB", 图像)
遍历每个单独的通道并显示
#RGB是最常用的色彩空间,但并不是最直观的色彩空间。
颜色的“白色”或“亮度”是每个红色、绿色和蓝色分量的加法组合。
for (name, chan) in zip(("B", "G", "R"), cv2.split(image)):
cv2.imshow(姓名,陈)
等待按键关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
HSV 颜色空间将 RGB 颜色空间转换为圆柱体而不是立方体。亮度是一个单独的维度
-Hue: 色调,你正在检查哪种“纯”颜色。例如,红色的所有阴影和色调都将具有相同的色调。 [0, 179]
-Saturation:饱和度,颜色有多“白”。完全饱和的颜色将是“纯色”,例如“纯红色”。饱和度为零的颜色将是纯白色。 [0, 255]
-Value:允许您控制颜色的亮度。零值表示纯黑色,而增加该值会产生较浅的颜色。 [0, 255]
将图像转换为HSV色彩空间并显示
hsv u003d cv2.cvtColor(图像,cv2.COLOR_BGR2HSV)
cv2.imshow(“HSV”,HSV)
遍历每个单独的 H、S、V 通道并显示
for (name, chan) in zip(("H", "S", "V"), cv2.split(hsv)):
cv2.imshow(姓名,陈)
按下关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
L * a * b 颜色空间
计算红绿之间的欧几里得距离;红色和紫色; RGB色彩空间中的红色和海军蓝:
导入数学
red_green u003d math.sqrt(((255 - 0) ** 2) + ((0 - 255) ** 2) + ((0 - 0) ** 2))
red_purple u003d math.sqrt(((255 - 128) ** 2) + ((0 - 0) ** 2) + ((0 - 128) ** 2))
red_navy u003d math.sqrt(((255 - 0) ** 2) + ((0 - 0) ** 2) + ((0 - 128) ** 2))
打印(红色\绿色,红色\紫色,红色\海军)
计算RGB和HSV颜色空间中的欧几里得距离不能断定红色在某种意义上比绿色更接近紫色而不是绿色?,
欧几里得距离无法“测量”RGB 和 HSV 颜色空间中颜色之间的感知差异。
这就是 L*a*b * 颜色空间发挥作用的地方——它的目标是模仿人类观察和解释颜色的方式。
L*a*b * 颜色空间中两种任意颜色之间的欧式距离具有实际的感知意义。
感知意义的加入使得L*a*b*色彩空间不如RGB和HSV直观易懂,但在计算机视觉中被广泛使用。本质上,L*a*b * 颜色空间是一个 3 轴系统:
-L-channel:像素的“亮度”。该值在垂直轴上下变化,从白色到黑色,在轴的中心是中性灰色。
-a-channel:从 L 通道的中心开始,在光谱的一端定义纯绿色,在另一端定义纯红色。
- 通道 b:同样来自通道 L 的中心,但垂直于通道 a。 b 通道在光谱的一端定义纯蓝色,在光谱的另一端定义纯黄色。
同理,虽然L*a*b*色彩空间不像HSV和RGB色彩空间那样直观难懂,但在计算机视觉中得到了广泛的应用。
#这是因为颜色之间的距离具有实际的感知意义,这样我们就可以克服各种光照条件的问题。它也被用作强大的彩色图像描述符。
将图像转换为L*a*b空间并显示
实验室 u003d cv2.cvtColor(图像,cv2.COLOR_BGR2LAB)
cv2.imshow("L*a*b*", 实验室)
遍历每个通道并显示
for (name, chan) in zip(("L*", "a*", "b*"), cv2.split(lab)):
cv2.imshow(姓名,陈)
等待按键关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
显示灰度图,灰度图不是颜色空间
鉴于眼睛对颜色的敏感度,眼睛的感受器和视锥细胞不同,所以对绿色和红色的感知比蓝色更好。绿色的感知量是红色的近2倍,红色的感知量是蓝色的2倍以上,
因此,当转换为灰度时,每个RGB通道的权重是不均匀的,
Y u003d 0.299 \times R + 0.587 \times G + 0.114 \times B
当颜色不相关时,通常使用图像的灰度表示(例如检测人脸或构建物体分类器时,物体的颜色是不相关的)。因此,丢弃颜色可以节省内存并提高计算效率。
灰色 u003d cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY)
cv2.imshow("原创", 图片)
cv2.imshow("灰度", 灰色)
cv2.waitKey(0)
参考资源
- https://www.pyimagesearch.com/2021/04/28/opencv-color-spaces-cv2-cvtcolor/
更多推荐
所有评论(0)