《一念关山》中有一句台词“没有经过多路验证过的情报,就是胡扯”,放在算法上也是同理,没有经过多种测试的算法,也是胡扯。本篇接上一篇《Demosaic(一)》,试一下demosaic不同算法的具体效果。
1. 挑选一幅测试图像
demosaic算法要处理的是raw图,如果是sensor抓回来的raw图,则图像中不可避免的会有噪声或者绿通道不平衡这样的问题,插值后的图像没有做过ccm和gamma,颜色也很难看,无论是人眼观察,还是用信噪比作为客观评价标准,都能难判断自己设计出的插值算法是否足够好。
对于初学者来说,当然是越简单越容易上手(永远不要在新手村给自己制造麻烦)。发动一下逆向思维,raw图的本质就是抽点,既然是抽点那自己动手就能做出来,只要对一幅图像进行抽点,它就会变成一张raw图。
我挑选的是下面的这幅图像,这也是诸多demosaic算法会挑中的图像,选中它是有原因的,上一篇的结尾提到过demosaic容易出现的问题,1.边界锯齿,2.伪彩,3.摩尔纹,4.紫边。这四大问题中,除了紫边和镜头及曝光有关,其他的三个问题都会在下面这幅图像中体现出来。
解释一下为什么选中它:首先,这幅图像中存在大量的强边界,比如栅栏、屋顶什么的,还有弱边界云朵,如果插值不够优秀,那么一定会出现边界锯齿。其次,这幅图像中的RGB三色都有,且存在清晰的颜色边界,如果插值错误,则伪彩一定出现。最后,这幅图像中的栅栏很有规律,疏密有致,这些栅栏会告诉我们,奈奎斯特准则是怎么批量制造摩尔纹的。
图1是用输入图像按照RGGB格式抽点获得的raw图,专门放大了栅栏处的细节,本来它是一幅灰度图,但是为了说明raw图的特点,raw图中显示出了颜色。
图1 挑选一幅图像做成raw图
2. 先从最简单的开始——双线性插值
即使不看论文,也能想到用双线性插值算法把各通道缺少的像素计算出来,用下面的这几个步骤。三个分量各自为阵,R和B的情况一样,G分量已知像素个数多,先插值G,G插值中心点的位置如图2(a)所示,写成公式如(1):
(1)
图2 双线性插值示意图
R缺少的数据要多一点,除了插值中心点,还需要插值上下和左右的像素,插值公式如(2)所示,需要注意的是,尽量用已知的像素来做插值,不要用插值后的像素做下一次插值,被插值出的像素不一定是准确的,如果再拿来做一次插值,还会引入新的问题。
(2)
按照上面两个步骤插值出的效果如下图3所示,图像是被还原了,但是从局部放大来看,和原图像相比,边界锯齿、伪彩和摩尔纹都出现了,不过这也是预料之中的。
图3 双线性插值效果
所以随随便便的插值一下是满足不了需求的,接下来就要尝试色差恒定原理了,它把三通道联系在了一起,让插值可以使用的像素个数更多。
3. 三通道互相帮助——色差恒定
色差就是色度信号(R和B分量)与亮度信号(G分量)的差,在图像很小的范围内,当前像素的色差与其周围点的色差是一样的,即色差就是色度信号(R和B分量)与亮度信号(G分量)的差,即:
(3)
这个公式里面用到了G分量,按照demosaic的插值原则,要先把G分量插值出来,就用最简单的双线性插值先把G分量做出来,然后套用公式(3),看看会获得什么结果。
观察一下图4中R分量可以利用的已知像素,发现其要插值的位置分成中心点、水平和垂直三种,对于不同的插值位置,有不同的像素信息可以使用,这就说明公式(3)大有可为。
图4 R分量的三个插值位置
对于中心点像素来说,周围有4个已知像素可以利用,如图5所示,就是说R(i,j)-G(i,j)=周围4个R均值-周围4个G均值,把公式化简一下,就得到了公式(4),同理B分量也是一样的,公式如(5)所示。
图5 中心点插值示意
(4)
(5)
对于水平方向来说,左右有2个已知像素可以利用,如图6所示,R(i,j)-G(i,j)=左右2个R均值-左右2个G均值,把公式化简一下,就得到了公式(6),同理B分量也是一样的,公式如(7)所示。
图6 水平插值示意
(6)
(7)
对于垂直方向来说,上下有2个已知像素可以利用,如图7所示,R(i,j)-G(i,j)=上下2个R均值-上下2个G均值,把公式化简一下,就得到了公式(8),同理B分量也是一样的,公式如(9)所示。
图7 垂直插值示意
(8)
(9)
按照上述公式做出的结果如图8所示,会发现图像整体的清晰度好了一些,栅栏这里看起来的边缘会锐利一些,伪彩也变淡了一些,但是边缘仍然有很多锯齿,说明需要方向插值,根据上篇文章的介绍的demosaic插值原则,这里要从已知信息更多的G分量入手,坚持不懈的继续改进。
图8 加入色差恒定的对比
4. 让边界好看一点——梯度判断
之前写了一阶导和二阶导以及边缘检测的各种算子,就使用一阶导来检测G通道的方向,然后再按照梯度方向插值,得到的效果如图9所示:
图9 加入梯度方向插值的对比
边缘果然好了不少,虽然还是有锯齿,但是和之前相比已经顺眼了很多,把G分量显示出来,G分量如图10所示,G分量的边界锯齿确实好了很多。
图10 G分量详情
这就说明改进方向对了,这个效果是一阶导检测边缘做出来的,实际上能检测边缘的方法很多,可以慢慢对比慢慢尝试,或者多种边缘检测结合,总能逐渐找到一个效果良好的。
以上就是demosaic算法逐渐上手的过程,也是一个不断探索的过程,用心去做会发现很好玩。此外,在真实的ISP中,从sensor进来的图像一定存在噪声,demosaic算法还需要考虑抗噪性能,一些性能不够好的sensor还会存在绿通道不匹配的问题,在做demosaic之前还需要先做绿通道平衡,当然这些都是更高的要求了。
如果想挑战更高的要求,我这里给出一些好用的建议,想挑战噪声的,加入一下随机高斯噪声,想挑战G通道不平衡的,把G像素分成Gb和Gr,分别给这两个通道加入不同的额外值,注意加的值不宜过大。
5. demosaic效果——别人的效果
demosaic是一个已经成熟的并且广泛应用的算法,matlab软件里面也自带一个demosaic函数,直接给输入图像就能得到结果,命令是output=demosaic(input, bayer_pattern),得到的结果如图11所示:
图11 matlab中的函数demosaic效果
用matlab的效果和双线性插值+色差恒定的效果对比,发现matlab的函数效果要好一点,感觉g分量做了少许方向滤波,但是又做的不太彻底,并且色差恒定肯定没有考虑方向。
另外,上面的所有结果都没解决摩尔纹的问题,也就是图11中圆圈标记出的地方,摩尔纹算是demosaic算法的难点了。
6. 摩尔纹的解法——加入低通滤波器
摩尔纹常常是出现在一些重复性很高且排列紧密的纹路之间。例如,在密布的栏杆、服饰上的条纹以及各种有密集纹路的图像中。这些图像经过去马赛克处理后常常会出现莫名其妙的水波样条纹,这些条纹就被称为摩尔纹。如图 10所示的红框中就是摩尔纹。摩尔纹的产生是差拍原理的一种表现,从数学上讲,两个频率接近的等幅正弦波叠加,合成信号的幅度将按照两个频率之差变化。在颜色插值重建的过程中有时会出现摩尔纹,尤其是在密集的纹理区域。观察 bayer 格式的图像我们可以看到,R、G、B 三种相同颜色的像素点在行,列两个方向上都是间隔一个像素点,如果待重建的图像中物体的维度等于一个像素点的宽度,根据 bayer 格式的色彩滤波阵列的亚采样特性,颜色插值重建极有可能会计算出有误的颜色数据,从而出现摩尔纹。一般的数字成像系统为降低插值重建后图像中的摩尔纹出现的概率,将低通滤波器配置在彩色滤波阵列之前,目的是为了滤除掉图像中较高空间频率部分,通过降低图像锐度的方法来减少摩尔纹的发生概率。
我自己做了一个demosaic的效果,直接和原图做对比,效果如图12所示,边缘和原图几乎相差无几,摩尔纹确实有缓解,但是并没有完全清除(蓝圈标记的地方还是有一点),也许是我低通做的不够好,不过本专栏前几篇文章介绍了好几个低通滤波器,大家不妨自己动手试一下,看哪个效果更好,我也再试着改进一下算法。
图12 我的demosaic效果
7. 图像评价标准
图像的评价标准一般都有主观评价和客观评价两种,主观评价就是靠人眼来看,这个不同的人感受肯定会不一样,所以需要客观的评价标准,PSNR就是其中的一个。峰值信噪比(PSNR:Peak Signal to Noise Ratio),表示峰值信号的能量与噪声的平均能量的比值,通常都用分贝(dB)来表示。
在计算信噪比之前,首先要得到图像的均方差即就是实际图像与包含噪声的图像之差的能量均值。有两个分辨率为 m×n 的图像,其中 I 表示原始图像,K 表示处理后的图像则有公式(10):
(10)
峰值信噪比的计算公式如下(11)所示:
(11)
因为图像的最小单元是像素,所以最终存储的也都是像素点的像素值,为了方便matlab处理,图像都归一化到了0~1范围内。对于去马赛克处理完成的图像来说计算得到的 PSNR 值越大表示插值重建的图像色彩恢复越好,图像越清晰;PSNR值越小表示插值重建的图像色彩重建不完全并且图像中可能存在颜色错误,有图像失真的现象存在。
计算一下上面几个结果的PSNR值如下表所示(精确到小数点后2位),可以看见一个算法逐渐被改进的过程,每当解决掉一个小问题,PSNR值都会提高那么一些,也符合主观判断的结果。
| 双线性 | 加入色差恒定 | 加入梯度 | matlab | 楼主 |
PSNR | 55.49 | 61.09 | 61.99 | 65.97 | 74.62 |