解码流程
看这篇就可以懂了 https://zhuanlan.zhihu.com/p/51569883
文章内部附了python相关的代码
本文只关注CFA demosaicting
这步,不做白平衡,最终显示效果虽然看起来奇怪,但我额外做了自适应的白平衡效果是没问题的
debayer算法
原理看这篇即可https://blog.csdn.net/j_d_c/article/details/54019582
因为raw文件存储时是以G R B G类似这样依次存储,不像rgb图像一个位置有三个值,raw文件一个位置只有一个值,同时由于人眼对绿色比较敏感,所以G多一些,一般有四种方式
以(b)为例
比如对于这个(0,2)这个位置
需要补充R和B的值,R可以取左右两个R的平均值,B可以取上下两个B的平均值(边界处只取一个),只要遍历每个位置利用周边的值来填补缺失像素即可。
实现
我这里的数据集是BGGR存储,每次先处理BGBGBG这行,再处理GRGR这行,同时根据index的奇数偶数特性判断当前是哪个像素和需要填补哪些像素,我的实现算法很简单,纯c++实现的平均插值,关键部分给了注释
https://github.com/CarryHJR/simple-debayer
opencv相应部分
看文档https://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html 这个接口也很好玩,These are components from the second row, second and third columns,
这个参数选择是根据第二行的第二个和第三个值来选择的,有点怪怪的,对应的源代码在https://github.com/opencv/opencv/blob/master/modules/imgproc/src/demosaicing.cpp
里面提供了几种插值算法,对应平均插值法有两处,靠上面的很复杂也是opencv现在采用的,靠下面的老版本和我自己实现的类似
当前最好的debayer算法
根据http://www.siliconimaging.com/RGB%20Bayer.htm 性价比最高的就是直接平均,但会带来物体边缘处不自然的情况,现在发论文很多都是魔改这个插值的方式,效率差一些,效果看起来自然一些,我个人最看好的是英伟达实现的DFPD http://blog.cuvilib.com/2014/06/12/dfpd-debayer-on-gpu/
相关拓展阅读:
https://stanford.edu/class/ee367/reading/Demosaicing_ICASSP04.pdf
https://qastack.cn/photo/22596/what-are-the-pros-and-cons-of-different-bayer-demosaicing-algorithms
https://patents.google.com/patent/CN102663719A/zh
https://zh.wikipedia.org/wiki/%E5%8E%BB%E9%A6%AC%E8%B3%BD%E5%85%8B