计算机视觉工程师在确定传感器模块时经常面临一个艰难的选择
彩色还是灰度?
在大多数传感器模块上,这是一个二选一的决定;你不能同时拥有两者。从表面上看,这似乎不是一个迫切的问题。两者都可以提供可见数据,对吧? *并不完全是*。彩色和灰度都有各自独特的特性和应用。在将计算机视觉应用于任何应用时,应考虑这些特性。
为了充分探索这些概念,我们首先必须讨论从 CMOS 传感器到上层的灰度和彩色相机是如何构建的;它们是如何传递和处理信息的;以及考虑到这些限制,哪些应用可以从每种相机模式中受益。
在这篇文章的大部分内容中,我将使用我拍摄的加布里埃尔·达韦在丹佛艺术博物馆创作的 *编织 No. 36* 照片。
这张照片是用我的 Google Pixel 上的相机拍摄的。巧合的是,OpenCV 的 OAK-D 模块 拥有相同的相机传感器,即 Sony IMX378 CMOS 芯片。该芯片拥有我们将在下面讨论的许多功能:拜耳模式、去马赛克等。它执行大量的预处理,以使图像尽可能清晰,然后再被你的眼睛看到,而且它做得非常出色。
但是,对于计算机视觉工程师(以及我们 七巧板视觉 的人来说),了解它在幕后是如何工作的非常有价值,这样我们才能更好地利用不同方法的优点和缺点。因此,让我们继续……
从 CMOS 开始
让我们从电路开始。大多数消费级相机使用互补金属氧化物半导体晶体管 (CMOS) 与光电探测器配对,将光子转换成电子信号。每个这些独立的电路构成一个 *像素*;这些电路的完整网格构成一个 *像素阵列*。从光照射到阵列开始,最终将成为图像……但是,灰度和彩色传感器创建图像的方式有根本的不同。
需要注意的是,像素阵列不会对 *所有* 入射光做出反应。相反,它只对特定光波长谱做出反应。在我们的讨论中,这是可见光谱,波长范围为 380nm(紫罗兰色)至 750nm(红色)。
当来自该光谱的光照射到 CMOS 传感器上的像素井时,它会产生与 *亮度* 成正比的响应,也称为每单位面积的光强度。这种响应会触发传感器上的电信号,产生一个“亮度”值。所有这些值的聚合形成了我们所知的灰度图像!
向彩色迈进
请注意,现在,该传感器只测量一个东西:照射到该像素的可见光的亮度。因此,它只为每个像素提供一个值。这对于颜色来说是不够的,因为我们所知的“颜色”是三种不同的可见光波长谱的组合:红、绿和蓝。人类可以使用眼睛中称为 *视锥细胞* 的细胞光过滤器来做到这一点,这些光过滤器将白光分解成长波长(红色)、中波长(绿色)和短波长(蓝色)的组成部分。然后,大脑将这些组成部分处理成我们看到的颜色。
同样,任何处理颜色数据的传感器都应该做类似的事情。用 CMOS 传感器做到这一点的最常见方法是在像素井上覆盖 *彩色滤光片阵列* (CFA)。这是一个放置在传感器上的层,它用红色、绿色或蓝色光过滤器覆盖每个像素。现在,进入像素的光不再无阻碍地传播!相反,波被分解,只有与所选滤波波长匹配的光谱才能通过。
现在,当我们用这个覆盖了 CFA 的 CMOS 拍照时,我们就得到了颜色分量……但光凭这一点还不够。你自己看
让我们放大一点传感器上面捕捉到的“颜色”图像
看起来不太对劲,是吗?这是彩色和灰度之间的第一个重大(尽管很明显)差异:两种模式在相同光谱上测量不同的信息。在具有 CFA 的传感器的情况下,甚至不同的像素测量不同的信息!这也是我们使用彩色相机进行计算机视觉时遇到的最大问题;一旦我们了解颜色的推导方式,我们就会看到原因。
彩色滤光片阵列
彩色传感器上的每个像素只包含重建真实颜色所需的信息的一部分,例如,一个像素只包含 RGB 颜色中的红色“R”分量!这种分量被称为 *传感器元素*,是 CMOS 传感器所能提供的最小的传感器信息片段。我们需要所有 R、G 和 B 传感器元素才能重建像素的真实颜色。我们从哪里获得绿色“G”和蓝色“B”传感器元素?我们如何将这些信息组合起来才能重建真实的颜色?
这些问题有很多答案,它们都有自己的权衡和优势。关键在于 CFA 中使用的颜色模式。大多数现成的彩色相机使用称为 *拜耳模式* 的 CFA。在这里,每个 2×2 像素块有两个绿色滤光片、一个红色滤光片和一个蓝色滤光片。人类眼睛中介质和长波长视锥细胞都对绿光敏感,因此拜耳滤光片中绿色的表示是红色的两倍,以模拟这种效果。拜耳模式可以在 *BGGR*、*RGGB* 和 *GRBG* 变体中找到,所有这些变体都是通过从上到下逐行读取模式来命名的。
超越拜耳
尽管拜耳模式无处不在,但它并不完美。由于拜耳模式的绿色滤光片只记录了图像的一半(每 4 个像素中有 2 个),而红色和蓝色滤光片只记录了图像的四分之一(每 4 个像素中有 1 个),因此重要的颜色信息实际上在被使用之前就被丢弃了。这是大多数所有 CFA 的现实情况,因为过滤颜色的行为本身就会删除信息。不同的滤光片样式使用不同的模式来补偿不同的东西。以下是一些示例
- RCCC:红-透明-透明-透明。这是用于汽车行业的滤光片;红色是道路上的警示信号,因此它的颜色信息是唯一重要的信息。
- RGBE:红-绿-蓝-翡翠。这里的翡翠是一种类似青色的颜料。
- CYYM:青色-黄色-黄色-洋红色。虽然 RGB 是光的原色,但这些是颜料的原色。
- X-Trans:富士胶片使用的 RGB 滤光片,旨在最大程度地减少 *摩尔纹* 的产生(关于摩尔纹的更多信息将在下面介绍)。
……等等。无论滤光片类型如何,上面列出的所有 CFA 都存在与拜耳模式相同的问题:一个像素永远只能包含真实颜色的 *一部分*。如何推导出真实的颜色取决于我们。这个过程被称为 *去马赛克*。
去马赛克
去马赛克拜耳模式没有“正确”的方法。它们都试图复制人眼看到的景象,但使用 CFA 丢失的信息会阻止任何方法创建 100% 真实还原的色彩。
最基本的去马赛克方法是只取最近传感器元素的值,然后创建一个 RGB 颜色。
这被称为 *最近邻插值*,它绝对是 *糟糕* 的重建颜色方法。让我们对棋盘格拜耳模式图像使用最近邻插值
还不错……但也不好。从这里看可能没问题,但让我们把它与本文开头处的控制图像进行比较
看到那些锯齿状的边缘和模糊的颜色过渡了吗?这不好!我们可以比这更聪明。许多去马赛克算法旨在考虑更多信息,例如更远的像素或具有相似值的区域,以便对颜色组合做出更明智的决策。使用的去马赛克方法会对颜色图像质量产生 *巨大* 的影响。有关不同方法及其影响的详细讨论,请访问 此处。
去马赛克的危害
不幸的是,即使是最好的去马赛克算法也可能将各种不希望出现的伪影引入图像中。以下是一些示例
色差 - 颜色模糊,通常在图像中的锐利边缘或不连续处表现出来。是由传感器元素在锐利颜色边界上的不良插值引起的。
摩尔纹 - 重叠的图案,会在彼此之间产生干扰。通常在捕获电子屏幕时发生。通常与假色相伴。
假色 - 也是不良传感器元素插值的牺牲品。当去马赛克算法将错误的像素考虑在某个区域时,就会发生这种情况。
您可能已经有一段时间没有听说过灰度相机了?那是因为它们不需要担心这些问题!没有像素值的预处理;没有算法上的担心;没有 CFA 决策。只是简单的像素测量,聚合后作为图像发送。这意味着灰度相机不会受到任何去马赛克副作用的影响。您看到的就是您得到的,而且您很快就能得到它。
灰度相机获胜
这个特性是灰度成像的最佳特性之一,也是灰度在高速和高性能应用中受到青睐的主要原因。获得的信息是干净、简单、快速传递的。
最后一个关于“快速获取有用数据”的要点很重要。许多跟踪和映射管道受到设备到主机的数据吞吐量的瓶颈,因此让我们比较一下标准 USB 2.0 传输速率下灰度成像与彩色成像的数据吞吐量。我们可以进行一些简化的计算,以了解我们的相机选择对这一重要指标的影响。
使用 USB 2.0 传输(限速为 60MB/s):
✅ 灰度 VGA,30 帧/秒:9.2MB/s
✅ 灰度 720p,30 帧/秒:27.6MB/s
✅ 彩色 VGA,30 帧/秒:27.6MB/s ← 但这可能仍然会影响我们的管道!
❌ 彩色 720p,30 帧/秒:82.9MB/s ← 不可能。
彩色图像如何会影响我们的视觉管道?好吧,如果我们以高分辨率使用彩色图像,我们被迫将帧率降至至少 15 帧/秒(如果不是更多)。即使我们补偿了数据超载,我们也可能会仍然收到受到模糊或摩尔纹影响的图像,这将对我们的计算机视觉系统产生负面影响。底线:如果应用程序依赖于清晰的特征和快速的帧速率来保持平稳运行,那么彩色可能不是最佳选择。选择灰度传感器以实现正确的性能指标。
我们是如何得到这些数字的?
灰度:灰度图像使用 8 位信息描述每个像素值。将此乘以 640×480(VGA 图像的像素分辨率),并将该信息量每秒发送 30 次(许多应用程序的常见帧率)。我们现在正在查看每秒 73,728,000 位信息,即 9.2MB/s。还不错;USB 2.0 可以处理 60MB/s,所以我们看起来还不错。即使我们将它提升到 1280×720(720p),我们也只达到 27.6MB/s,远低于理论阈值。
彩色:一旦图像经过去马赛克处理,每个像素都将携带其完整的 RGB 颜色信息。这意味着我们每个像素有三个 8 位值,而不仅仅是一个。对于 VGA 图像执行与上述相同的计算,我们已经达到了 27.6MB/s。将其变为 720p 图像,我们上升到 82.9MB/s,远远超过了 USB 2.0 的 60MB/s 阈值。
…但彩色图像也获胜
我们已经看到彩色数据在计算和数据方面成本更高,但在适当情况下,它是值得的。具体来说,添加颜色提供了推断语义的新的令人兴奋的方式。
我们人类通常不会考虑几何形状;我们通常更关心颜色或材质,弄清楚我们如何与场景及其物体互动。这些都称为场景的语义。例如,人类依靠颜色信息来判断某种蛇是否有毒,或者某种浆果是否可食用,而不仅仅是形状。计算机可以使用与人类相同的方式使用此信息,并获得相同的效果。
可以想象,分类器和神经网络在数据更多的情况下也能做得更好。有什么比每个像素提供三倍的信息量更好的方式来生成数据呢?最重要的是,可以通过使用常见的 RGB→灰度转换来计算灰度数据。这使得网络可以使用 RGB 和亮度值,只需要进行少量的额外计算。
当然,我们上面探讨的彩色图像问题仍然存在。生成干净一致的彩色数据一直是一个挑战!把它做好可能很麻烦,但回报是丰富的数据库,可以以强大的方式提升视觉系统。对于所有其他几何形状和速度最重要的场合,灰度系统都可以提供帮助。
在许多情况下,机器人系统设计可以从使用灰度图像和彩色图像中获益。但是,如果您认为这很复杂,那您还没有看到什么!在这种多传感器情况下,会出现一系列额外的传感器挑战,例如校准和适当的传感器融合。这些挑战正是我们在 Tangram Vision 中解决的问题。我们正在努力为整个机器人和 CV 社区解决这些挑战,并且我们将继续在这里做同样的事情!
如果您想自己尝试一下,请访问 Tangram Vision 博客 的 GitLab 存储库。我们上传了我们创建这些图像的代码示例。欢迎贡献!
Brandon Minor
Tangram Vision 首席执行官兼联合创始人
Brandon Minor 是 Tangram Vision 的联合创始人兼首席执行官。Tangram Vision 创建了 Tangram Vision SDK,该 SDK 提供工具来简化添加和管理感知传感器(如 LiDAR、深度、CMOS 和 IMU)到传感器支持平台(如机器人、无人机和自动驾驶汽车)的过程。