本文系微信公众号和知乎专栏《MediaStack》原创文章,欢迎大家关注,随时进行交流。
您是否曾经尝试解决一个小问题却发现自己意外地解决了一个更大的问题?
问题背景
最近研发小伙伴在预研新的产品,在系统正常运行起来之后,发现一个奇怪的问题:从图片来看,可能是图像处理过程中出现了噪声,导致显示出斑点,这个问题可能会影响到用户的使用体验,如下图所示:
第一眼看到这个图感觉是不是码率,分辨率不足的问题,可能是图像压缩算法导致的,有时候压缩算法会将图像中的一些细节信息去掉,从而导致图像在细节上出现模糊或失真的现象。不过,这种情况并不会对图像影响应该是不规则的,没有规律的。如果是这样的问题我们可以尝试使用更好的压缩算法或者提高图像的分辨率来解决这个问题。在一一核对之后都是正常的,那这是什么原因呢?
问题排查
之后怀疑的点就是摄像头采集的数据格式存在异常,导致应用端抓图和显示时候出现该问题,我们将图像放大到1000%之后图像显示如下所示,类似四宫格的方式排列:斜对角灰色,另外一条边颜色更深。接触过数字图像采集过程的同学一眼就可以看出来,显然是采集数据排列方式不对。
经过仔细排查,我们发现了图像数据格式异常的原因。我们与底层SDK和驱动等同学进行了反复确认,最终得出了结论。在此过程中,我们学习到了很多有关图像处理的知识,这对于我们今后的工作非常有帮助
解决方案
当我们遇到疑难问题时,我们首先需要明确问题的实质,并找出解决方案。如果我们不知道如何解决某个问题,那么就可以参考SDK的手册或其他相关文档,以获取更多关于该问题的信息。
SDK手册通常会提供一些具体的步骤和操作指南,以帮助我们解决特定的问题。我们只需要按照手册中的步骤进行操作,就可以轻松地找到解决方案。翻阅相关文档,里面有这样一段描述彻底揭开谜底:
因为应用端小伙伴期望特殊场景时候需要黑白的图像,所以驱动小伙伴误以为Sensor需要设置成黑白。所以选择了MEDIA_BUS_FMT_Y10_1X10作为图像排列方式,所以将其改为正常的SRGGB即可。
补充知识
在数字图像和视频处理过程中,我们时不时会接触到不同的色彩空间的概念::非线性和线性RGB、YUV、XYZ……为什么需要这么多的色彩空间呢?
如下图所示:一片靓丽的风景通过相机系统将外部世界的光通过透镜或其他光学器件聚焦之后达到相机的图像传感器,经过多层转换就变成了我们手机或者相机中一张风景照。其中就会涉及从线性 RGB 空间转换到非线性 RGB 空间,以及RGB 信息转换为 YUV的过程。
相关流程可以参考如下描述:
Raw图像
相机原始图像文件包含来自数码相机、电影胶片扫描仪或其他图像扫描仪的图像传感器的未处理或最低程度处理的数据。原始文件之所以如此命名,是因为它们尚未经过处理,并且包含大量潜在的冗余数据。通常,图像由原始转换器在宽色域内部色彩空间中进行处理,在转换为可查看文件格式(例如JPEG或PNG)之前可以进行精确调整。用于存储、打印或进一步操作。不同的数字图像捕捉设备制造商使用了数十种原始格式。

RAW10
这是一种单平面、每像素 10 位、密集(每行)、未处理的格式,通常表示来自图像传感器的原始拜耳模式图像。
在这种格式的图像缓冲区中,从每行的第一个像素开始,每 4 个连续像素被打包成 5 个字节(40 位)。前 4 个字节中的每个字节包含每个像素的高 8 位,第五个字节包含 4 个像素的 2 个最低有效位,每 4 个连续像素的确切布局数据如下所示(代表像素的第 j 位Pi[j])第 i 个像素):
其他可以参考如下:https://www.kernel.org/doc/html/v5.8/userspace-api/media/v4l/subdev-formats.html
Bayer Filter
Bayer Filer以其发明者布莱斯·拜耳 (Bryce Bayer) 命名,是一种用于图像传感器的微滤光片覆盖层,允许光传感器(通常只记录光强度)也记录光波长。Bayer Filer是此类滤镜中最常见的,我们发现几乎所有现代数码相机都在使用它。该滤镜使用两部分绿色、一部分红色和一部分蓝色的马赛克图案来解释到达传感器的颜色信息。记录后,将应用数字算法对生成的拜耳图案进行插值或“去马赛克”,并将其转换为图像的成熟颜色数据。
更多Bayer Filter信息可以参考如下介绍:
https://zhuanlan.zhihu.com/p/72581663
https://en.wikipedia.org/wiki/Bayer_filter

我是一枚爱跑步的程序猿,维护公众号和知乎专栏《MediaStack》,有兴趣可以关注,一起学习音视频知识,时不时分享实战经验。
继续阅读
阅读原文