2.5 使用不同的颜色格式

2.5 使用不同的颜色格式

正如我们所见,OpenCV和iOS SDK中对于彩色和灰度图像是有不同的数据格式的,有时我们需要在这些格式之间进行转换。让我们从从代码中脱离出来,讨论一下这些格式之间的差异以及如果不执行正确的转换可能出现的问题。

2.5.1 RGB,BGR,RGBA和BGRA

您可能在很久以前在第一次使用绘图软件或者文字处理软件时选择自定义的颜色时,就知道了24位RGB颜色格式。像素的颜色由三个值序列表示,每个值范围从0到255(即,8位或1字节)。第一个值是颜色的红色分量或通道,后面是绿色,最后是蓝色。例如,黄色交通灯的颜色是(255,126,0),红色和绿色的混合物,没有蓝色。一系列的像素数据形成图像。
24位BGR格式简单地颠倒了通道顺序。例如,黄色交通灯的颜色是BGR格式的(0,126,255)。

[使用RGB或BGR,每像素24位(bpp)就足以表示微妙的颜色渐变。典型的屏幕和消费者摄像机被限制为24bpp。然而,一些高端相机和屏幕支持30bpp甚至更多。对于我们在iOS上的项目,24bpp是一个合理的限制。]

RGBA和BGRA增加了第四个通道,alpha,在两种格式数据的最后.Alpha代表的是透明度,0是全透明,255是不透明(假设每个通道8bit或者一共32比特)。当然,“透明”不是光的波长,普通照相机不记录任何数据以区分反射光(从不透明表面反射)和透射光(通过透明材料)。因此,未处理的照片可以被认为是不透明的,并且如果它包含α通道,则α值全部是255。如果我们想要选择性地混合图像的一部分,透明度或alpha就成为一个更有意义的概念。
通常,OpenCV对彩色图像使用24位BGR或32位BGRA。CvVideoCamera以BGRA格式捕获图像。然而,iOS SDK通常使用RGBA格式,因此我们必须记住执行转换,否则红色和蓝色通道会被误解。
让我们想象一下在彩色图像中交换红色和蓝色通道的效果。在左边,我们看到了Miethe迷人的乡村景色,老园丁送给年轻女士一朵玫瑰。在右边,我们看到了一个不同的幻象,蓝精灵爸爸给戈尔迪一个蓝色的纸杯蛋糕:
在这里插入图片描述
[在本书的印刷版本中,所有图像都以灰度形式出现。要查看它们的彩色版,请从Packt Publishing的网站 https://www.packtpub.com/sites/default/files/downloads/iOSApplicationDevelopmentwithOpenCV3_ColorImages.pdf 下载它们,或者阅读电子书。]

如果我们编写一个程序,错误地将RGB图像视为BGR(反之亦然),我们将会看到像右手图像一样的奇怪的结果!

2.5.2 YUV和灰度图

假设我们希望使用少于24bpp来表示图像,以便我们的图像使用更少的内存并且可以在更少的时间内进行处理。为此,我们必须牺牲24bpp在RGB或BGR中可以表示的一些微妙的颜色渐变。然而,我们也许希望保留表示亮度细微等级的能力。这里,我们遇到了RGB和BGR的关键限制。亮度取决于所有的三个通道,并且当我们在任何通道中牺牲比特数据时,我们丢失亮度的渐变!

YUV颜色模型解决了这个问题。Y通道仅仅代表亮度。U通道表示蓝色(相对于绿色),而V通道表示红色(也相对于绿色)。YUV的一些变体是planar格式,首先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。YUV的其他变体是packed格式,每个像素点的Y,U,V是连续交叉存储的,就好像RGB或BGR中的R、G和B数据的存储方式.

平面格式的一个例子是I420,它有12bpp。这包括全分辨率图像中每个像素的8位Y值以及以半分辨率采样的4位U和4位V值。

一个打包格式的例子是YUYV,它有16bpp。这包括全分辨率图像中每个像素的8位Y值以及以半分辨率采样的8位U和8位V值。注意,所有这些值都是字节大小的。每个Y字节交替地与U或V字节交织,如名称YUYV所示。

[8位Y通道捕获的亮度等级与三个通道的24位RGB或BGR图像的亮度等级相同.]

同样,在某些情况下,我们必须执行转换,否则通道数据将被误解。左侧图像显示了把I420 palanar
图像当做灰度图显示时的样子,右侧图像显示了将YUVY packed格式的图像当做RGB格式显示的样子:
在这里插入图片描述
请注意,天空和女士服装有很高的Y值。这些在右侧图像中被误解为高R值。
灰度图像相当于YUV planar图像的Y平面。通常,摄像机的固件,或者至少其驱动程序,可以有效地将捕获的视频转换为YUV planar格式。然后,如果一个应用程序只需要灰度数据,它可以读取或复制Y平面。这种方法比捕获RGB帧并将其转换为灰度的替代方案更有效。因此,当CvVideoCamera的灰度模式属性为YES时,它获取平面YUV帧,并将Y平面的副本传递给CvVideoCameraDelegate的processImage:方法。

###返回到书籍目录###
###返回到第二章目录###

猜你喜欢

转载自blog.csdn.net/GikkiAres/article/details/85256774
2.5