色彩空间

几天前我的朋友马克告诉我关于构建一个基于计算机视觉的自动化魔方求解器的想法,我很好奇。他试图使用颜色分割来查找立方体的当前状态。虽然他的颜色分段代码在晚上在他的房间里工作得很好,但是在白天他的房间外面,他的颜色分解代码却崩溃了!

他问我求助,我立即明白他哪里出了问题。像许多其他业余电脑视觉爱好者一样,他在做色彩分割时没有考虑不同照明条件的影响。我们在许多计算机视觉应用中遇到了这个问题,这些计算机视觉应用涉及肤色检测,交通灯识别等基于颜色的分割。

 

文章的结构安排如下:

  1. 首先,我们将看到如何在OpenCV中读取图像并将其转换为不同的颜色空间,并查看每个颜色空间的不同通道为我们提供的新信息。
  2. 我们将应用Mark所做的简单的颜色分割算法,并思考它的弱点。
  3. 然后,我们将跳入一些分析,并使用一个系统的方式来选择:
    • 正确的色彩空间。
    • 分割的正确阈值。
  4. 查看结果
 

不同的颜色空间

在本节中,我们将介绍计算机视觉中使用的一些重要色彩空间。 我们不会在Wikipedia上找到它们背后的理论。 相反,我们会发展一个基本的直觉,并学习一些重要的属性,这些属性将在以后作出决定时很有用。

In [ ]:
os.chdir(os.path.join(os.getcwd(), '..'))
print(os.getcwd())
In [ ]:
import env
from mvlib import *
 

让我们加载同一个立方体的2个图像。 它将默认以BGR格式加载。 第一张照片是在阳光明媚的室外环境下拍摄的,第二张照片是在正常照明条件下拍摄的。image.png

In [ ]:
bright = read_image(f"ColorSpaces/images/rub08.jpg")
dark = read_image(f"ColorSpaces/images/rub01.jpg")

# dev_imshow(bright)
# dev_imshow(dark)
In [ ]:
def show_color_space(img, color_space):
    list_channels = split_image(img)
    dev_imshow(img, "原图", color_space)
    for image in list_channels:
        dev_imshow(image, color_space="RGB")

def show_group(color_space, channel_swapping):
    im_bright = channel_swapping(bright)
    show_color_space(im_bright, color_space)

    im_dark = channel_swapping(dark)
    show_color_space(im_dark, color_space)
 

RGB颜色空间

RGB色彩空间具有以下属性

  • 这是一个加色空间,通过红,绿和蓝色值的线性组合获得颜色。
  • 三个通道通过撞击表面的光量相关联。

让我们把这两幅图像分解成它们的R,G和B分量,并观察它们以获得更多的色彩空间。

In [ ]:
show_group("RGB", bgr2rgb)
 

image.png

如果你看蓝色的通道,可以看到在室内照明条件下,第二张图像中的蓝色和白色的部分看起来相似,但是在第一张图像中有明显的差别。 这种不均匀性使得在这个色彩空间中基于颜色的分割非常困难。 此外,两个图像的值之间存在总体差异。 下面我们总结了与RGB颜色空间相关的固有问题:

  • 显着的感知不均匀性。
  • 色度(颜色相关信息)和亮度(强度相关信息)数据的混合。
 

LAB色彩空间

Lab色彩空间有三个组件。

  1. L - 亮度(强度)。
  2. a - 从绿色到品红色的一种颜色成分。
  3. b - 颜色分量从蓝色到黄色。

Lab色彩空间与RGB色彩空间大不相同。 在RGB色彩空间中,色彩信息被分成三个通道,但相同的三个通道也编码亮度信息。 另一方面,在Lab色彩空间中,L通道独立于色彩信息,仅对亮度进行编码。 另外两个通道编码颜色。

它具有以下属性:

  • 感知上统一的颜色空间,接近我们如何看待颜色。
  • 独立于设备(捕获或显示)。
  • 在Adobe Photoshop中广泛使用。
  • 通过一个复杂的变换方程与RGB色彩空间相关联。
In [ ]:
show_group("LAB", bgr2lab)
 

让我们看看Lab色彩空间中的两个图像分成三个通道。

image.png

  • 从图中可以清楚地看出,照度的变化主要影响L分量。
  • 包含颜色信息的A和B成分没有经历大的变化。
  • 在B分量中,绿色,橙色和红色(它们是A分量的极值)的相应值没有改变,类似地,蓝色和黄色(它们是B分量的极值)的相应值在A分量中也没有太大变化。
 

YCrCb色彩空间

YCrCb颜色空间是从RGB颜色空间导出的,并具有以下三个组件。

  1. Y - 伽马校正后从RGB获得的亮度或亮度(Luma )分量。
  2. Cr = R - Y(红色分量距离Luma有多远)。
  3. Cb = B - Y(蓝色分量距离Luma的有多远)。

此颜色空间具有以下属性:

  • 将亮度和色度分量分离成不同的通道。
  • 主要用于电视传输的压缩(Cr和Cb组件)。
  • 设备依赖。
In [ ]:
show_group("YUV", bgr2yuv)
 

下面显示了YCrCb色彩空间中分成两个通道的两幅图像:

image.png

  • 对于照度变化,可以针对强度和颜色分量对LAB进行类似的观察。
  • 与LAB相比,红色和橙色之间的感知差异甚至在户外图像中更小。
  • 所有3个部件中的白色都发生了变化。
 

HSV色彩空间

HSV色彩空间有以下三个组成部分:

  1. H - 色调(主波长)。
  2. S - 饱和度(纯度/颜色的阴影)。
  3. V值(强度)。

我们列举一些属性:

  • 最好的事情是,它只使用一个通道来描述颜色(H),使得指定颜色非常直观。
  • 设备依赖。
In [ ]:
show_group("HSV", bgr2hsv)
 

两幅图像的H,S和V分量如下所示:

image.png

  • 在这两组图像中,H分量非常相似,即使在光照变化下,颜色信息也是完整的。
  • S组件在两幅图像中也非常相似。
  • V分量捕捉到的光线量因此会随着光照的变化而变化。
  • 红色的室外和室内图像的价值之间存在着巨大的差异。 这是因为色调表现为一个圆形,红色是在起始角度。所以,可能需要[300,360]和[0,60]之间的值。
posted @ 2019-08-28 16:47  daw1213  阅读(240)  评论(0编辑  收藏  举报