我们知道数字图像本质上是像素网格,每个像素都有一个值。但是,一个数字,或者几个数字,如何表示我们所看到的广阔色彩范围呢?解决之道在于颜色空间。颜色空间是一种用于以数字方式组织和定义颜色的特定系统。可以将其视为计算机用来描述色彩的语言。不同的任务和设备适合采用不同的颜色表示方式,因此存在多种颜色空间。计算机视觉中常用的三种主要类型包括:灰度、RGB和HSV。灰度最简单的颜色空间是灰度。灰度图像中的每个像素不存储颜色信息,而只表示强度或亮度。对于8位图像,它持有一个单一值,通常范围从0(表示黑色)到255(表示白色)。介于两者之间的所有值对应于不同深度的灰色。表示方式: 单通道(强度)。范围(8位): 0(黑色)到255(白色)。使用场景: 灰度处理能大幅简化图像数据。将图像从三个颜色通道(如RGB中)减少到一个,能使处理更快、计算成本更低。对于颜色不是主要考虑因素的任务,例如某些类型的特征检测(如我们稍后会看到的边缘检测)或光学字符识别(OCR),灰度图像通常足以应对。许多复杂算法首先会将彩色图像转换为灰度图像。RGB(红、绿、蓝)这可能是最常见的颜色空间,因为它广泛应用于数码相机、扫描仪和计算机显示器(如您现在使用的)。RGB模型是一种相加式颜色系统。这意味着颜色是通过混合不同强度的红、绿、蓝光而生成的。表示方式: 三通道(红、绿、蓝)。范围(每个通道8位): 每个通道(R、G、B)通常范围从0到255。颜色混合:(0, 0, 0) 表示黑色(无光)。(255, 255, 255) 表示白色(三色强度最大)。(255, 0, 0) 表示纯红色。(0, 255, 0) 表示纯绿色。(0, 0, 255) 表示纯蓝色。混合这些原色会产生次生色,例如黄色 (255, 255, 0)、青色 (0, 255, 255) 和洋红色 (255, 0, 255)。graph G { layout=neato; node [shape=circle, style=filled, label="", width=0.6, height=0.6]; edge [penwidth=2]; Red [pos="0,1.15!", fillcolor="#ff8787", label="红"]; Green [pos="-1,-0.577!", fillcolor="#8ce99a", label="绿"]; Blue [pos="1,-0.577!", fillcolor="#74c0fc", label="蓝"]; Yellow [pos="-0.5,0.288!", fillcolor="#ffe066", label="黄", width=0.4, height=0.4]; Cyan [pos="0.5,-0.0!", fillcolor="#66d9e8", label="青", width=0.4, height=0.4]; Magenta [pos="0.5,0.288!", fillcolor="#faa2c1", label="洋红", width=0.4, height=0.4]; White [pos="0,-0.1!", fillcolor="#dee2e6", label="白", width=0.4, height=0.4]; Red -- Yellow [color="#adb5bd"]; Green -- Yellow [color="#adb5bd"]; Green -- Cyan [color="#adb5bd"]; Blue -- Cyan [color="#adb5bd"]; Blue -- Magenta [color="#adb5bd"]; Red -- Magenta [color="#adb5bd"]; Yellow -- White [color="#adb5bd"]; Cyan -- White [color="#adb5bd"]; Magenta -- White [color="#adb5bd"]; }RGB颜色模型结合了红 (R)、绿 (G) 和蓝 (B) 光。混合R和G得到黄 (Y),G和B得到青 (C),B和R得到洋红 (M)。将三者结合则产生白 (W)。虽然是标准模型,但RGB值对光照变化可能很敏感。同一物体在不同光照下,其R、G、B值可能会有很大不同,这对于某些计算机视觉任务来说可能是一个挑战。HSV(色相、饱和度、明度)HSV颜色空间以一种通常被认为对人类更直观的方式表示颜色,因为它将颜色信息(是什么颜色)与其强度或亮度分离开来。它通常被可视化为一个圆柱体。色相 (H): 这表示颜色本身。可以将其看作色轮上的位置。它通常表示为0到360度之间的角度,尽管像OpenCV这样的库通常将此范围映射到0-179(以适应8位值)或0-255。红色可能在0度左右,绿色在120度左右,蓝色在240度左右。饱和度 (S): 这表示颜色的“纯度”或“强度”。饱和度为0表示颜色是灰度(灰色、黑色或白色的阴影),而最大饱和度则表示色相定义的颜色最纯粹的形式。它通常表示为百分比(0-100%)或一个范围(例如,0-255)。褪色的颜色饱和度低;鲜艳的颜色饱和度高。明度 (V): 这表示颜色的亮度或明暗程度。明度为0始终是黑色,无论色相或饱和度如何。随着明度增加,颜色变得更亮,直至达到其最大强度。它也通常表示为百分比(0-100%)或一个范围(例如,0-255)。表示方式: 三通道(色相、饱和度、明度)。范围(典型OpenCV 8位):H: 0-179S: 0-255V: 0-255使用场景: 当您需要在不同光照条件下根据颜色识别物体时,HSV在计算机视觉中特别有用。由于色相通道相对独立于亮度(明度)和褪色(饱和度)来分离颜色类型,因此您通常可以定义一个色相值范围,以比使用固定RGB范围更可靠地检测特定颜色。例如,在图像中找到特定颜色的球,使用HSV中的色相范围可能比试图考虑因阴影或高光引起的所有可能RGB变化更容易。为什么存在多种颜色空间?不同的颜色空间适用于不同的目的:灰度: 简化数据,在颜色不重要或用于特定算法时有用。RGB: 显示器和图像捕捉的标准,与硬件工作方式直接相关。HSV: 更符合人类感知,对基于颜色的分割和分析很有用,通常对光照变化更具效果。理解这些基本的颜色空间非常重要,因为选择正确的颜色空间或了解如何在它们之间转换,是许多计算机视觉流程中常见的首要步骤。像OpenCV这样的库提供了函数,可以轻松地在这些不同表示之间转换图像,让您能够针对您的特定应用发挥每个空间的优点。在接下来的章节中,我们将了解文件格式和分辨率等其他图像属性。