c++解码raw文件

解码流程

看这篇就可以懂了 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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值