最近实习的公司要求提供几个用于插值的函数接口,用于对CCD直接提供的拜尔数据进行插值成为彩色图像,并封装为dll。具体的实现代码应公司规定无法带出或上传,在此总结一下实现几种算法的思路并简略描述其效果。
首先从相机CCD的硬件结构先说明一下需要插值的原因,因为CCD上的每一个点只能接受的是光强度的信息,所以CCD的每一个像素点上覆盖了一片滤光片,使得每个像素点只能对一种颜色感光。所以CCD初始获得的信息都是如上图所示,这种每个像素只有一个通道的Bayer数据,而我们看到的彩色图像都是经过插值得到的。以每个2*2的方阵为一个单位,由于人眼对绿光比较敏感,所以有两个绿色像素,一个红色像素和一个蓝色像素。由于CCD开始取值的点(即位于(1,1)点的像素取的有颜色和位置)存在差异,因此需要提供RGGB(a),BGGR(b),GBRG(c),GRBG(d)四种格式的接口。
对于市场上的产品,这类插值算法一般在相机自身的硬件平台内完成,但开发和测试的时候我们经常能拿到数据的拜尔图。这次要写这个接口也是因为原本硬件平台的插值算法存在一定问题,导致了密集线对的显示存在拉链效应和伪彩。
(如下图,图片来自 https://blog.csdn.net/QCC_navigate/article/details/78430925)
1.邻近插值
(1) 绿色分量重建
整个平面内一般一半的点是有像素的,而且全都间隔排列。对没有像素存在的点,全部取其左边位置的绿色像素强度。
(2) 红色和蓝色分量重建
对每一个红色和蓝色的像素,将右边、下面、右下角的值都赋值为它的值。
该方法在实际处理中,对竖直的密集线对表现比较好,只有少量噪点;而水平的密集线对基本呈现密集的点状图案,无法看出线条,类似于前面说的伪彩色现象。
2.基于边界梯度的插值