原文地址:https://realpython.com/python-opencv-color-spaces/
这可能是一个深度学习和大数据的时代,在这个时代,复杂的算法通过显示数百万幅图像来分析图像,但是颜色空间对于图像分析仍然非常有用。简单的方法仍然是强大的。
在本文中,您将学习如何使用OpenCV基于Python中的颜色从图像中简单地分割对象。OpenCV是一个流行的计算机视觉库,用c/c++编写,带有Python绑定,提供了操作颜色空间的简单方法。
虽然你不需要已经熟悉OpenCV或本文中使用的其他助手包,但我们假设你至少对Python中的编码有了基本的了解。
什么是颜色空间?
在最常见的颜色空间RGB(红、绿、蓝)中,颜色以其红、绿、蓝三种成分表示。在更专业的术语中,RGB将颜色描述为三个成分的元组。每个组件可以取0到255之间的值,其中元组(0,0,0)表示黑色,(255,255,255)表示白色。
RGB被认为是一个附加颜色空间,颜色可以想象为由大量的红色、蓝色和绿色光线照射到黑色背景上而产生,以下是RGB颜色的一些例子:
RGB是五种主要颜色空间模型之一,每种模型都有许多分支。有这么多颜色空间,因为不同的颜色空间对于不同的目的是有用的。
在印刷领域,CMYK非常有用,因为它描述了从白色背景产生颜色所需的颜色组合。RGB中的0元组是黑色的,而CMYK中的0元组是白色的。我们的打印机包含青色、品红色、黄色和黑色墨盒。
在某些类型的医疗领域,装有染色组织样本的载玻片被扫描并保存为图像。它们可以在HED空间中进行分析,HED空间是应用于原始组织的染色类型——苏木精、曙红和DAB——饱和度的表示。
HSV和HSL是色调、饱和度和亮度的描述,对于识别图像中的对比度特别有用。这些颜色空间经常用于软件和网页设计中的颜色选择工具。
实际上,颜色是一个连续的现象,意味着有无限多的颜色。然而,颜色空间通过离散结构(固定数量的整数数值)来表示颜色,这是可以接受的,因为人眼和感知也是有限的。颜色空间完全能够代表我们能够区分的所有颜色。
既然我们理解了颜色空间的概念,我们可以继续在OpenCV中使用它们。
使用颜色空间进行简单分割
为了演示颜色空间分割技术,我们在real-Python材料库中提供了一个尼莫鱼图像数据集,供您下载和玩耍。小丑鱼很容易被它们明亮的橙色识别,所以它们是好的分割候选。让我们看看在一张图片中找到尼莫鱼有多精确。
你需要遵循的关键Python包是NumPy—Python中最重要的科学计算包,matplolib—绘图库,当然还有OpenCV。
颜色空间和使用opencv读取图像
首先,你需要设置你的环境。本文将假设您的系统上安装了Python 3.x。请注意,虽然OpenCV的当前版本是3.x,但是要导入的包的名称仍然是cv2,通过pip3 install opencv-python
命令进行安装(没有pip3,用pip也行)。
>>> import cv2
成功导入OpenCV后,您可以查看OpenCV提供的所有颜色空间转换,并将它们全部保存到变量中:
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
根据您的OpenCV版本,标志的列表和数量可能略有不同,但是不管怎样,会有很多标志!查看您有多少个可用的标志:
>>> len(flags)
258
>>> flags[40]
'COLOR_BGR2RGB'
COLOR_后面的第一个字符表示原始颜色空间,2后面的字符表示目标颜色空间。此标志表示从BGR(蓝色、绿色、红色)到RGB的转换。正如你所看到的,这两个颜色空间非常相似,只有第一个和最后一个通道交换。
你需要matplotlib.pyplot来查看图像,需要NumPy来处理一些图像。如果尚未安装Matpl