基于opencv的摄像头解像力量化SFR算法实现

开篇步入正题:搜到此文章的研发人员且认为你对MTF有一点点了解,下面直接讲解SFR算法,文章最后会附代码下载地址!

先来上一张算法结果图片

基于opencv的摄像头解像力量化SFR算法实现

        1.准备未经过sharpen&gamma处理的图像,因为gamma将数据进行了非线性处理,sharpen对边缘进行了overshoot处理。最好是原始bayer数据(democode中我使用的是bayer数据转成了bmp格式图片)。提取包含斜边的区域ROI,转化为YVU,我们只用Y通道数据就够了。

(备注:当然你也可以对sharpen,gamma之后的图像进行desharpen,degamma操作之后使用也可。

    desharpen对图像overshoot逆操作,degamma对图像线性化操作。)

       

基于opencv的摄像头解像力量化SFR算法实现
SFR算法计算的韧边
基于opencv的摄像头解像力量化SFR算法实现
只允许有一个韧边,且矩心距离边缘不能小于4个,democode里面设置成了必须大于6

        2.第1步中已经选出了包含韧边的ROI。接下来就是定位黑白交界(矩形矩心),数学公式在democode中已经描述的相当明白,不再赘述。

(备注:很多同行问我,为何要定位矩心,因为定位出矩心才能对这些像素点进行线性拟合,线性拟合后才能确定黑白交界边缘准确位置)

基于opencv的摄像头解像力量化SFR算法实现
标定位roi之后,以shifts为横坐标,以temp为纵坐标题

        3.对定位出来的矩形矩心进行线性拟合,计算出斜率b, 截距a.

(注意:代码中对第2步中的图像数据进行了旋转90度操作再计算b,a。这样做的目的是为了用行数(同时方向为正)做横坐标,列数做纵坐标)

基于opencv的摄像头解像力量化SFR算法实现
实际求出的斜率曲线(橙色)

         4.超采样获取ESF。

          前面线性拟合后对每个像素点到边缘的距离重新计算获得一个double类型的位置坐  标。存放在edgex[]中。

         通过对edgex[]每个数据乘以4操作,向下取整,获得对应坐标,并将此位置对应的信号值保存在signal[]。

        因为是逐行对double类型位置x4操作取整,所以每行会积累相等整型的位置坐标,这样对这些相同位置的坐标处的信号累加取平均就会得到四倍超采样处的信号值。
 

基于opencv的摄像头解像力量化SFR算法实现

           

基于opencv的摄像头解像力量化SFR算法实现
超采样获取的ESF数据

        5.差分求导得LSF

基于opencv的摄像头解像力量化SFR算法实现
ESF数据差分求导得到LSF

       6.LSF傅里叶变换求得SFR

基于opencv的摄像头解像力量化SFR算法实现
LSF傅里叶变换求得SFR

 

代码地址(里面包含一个opencv2.4.10的安装包,所以下载文件会在400M左右):

1.opencv2.4.10

2.SFR算法(我用的vs2010开发环境,专栏是专栏价,算法是算法价格。算法部分付费后单独发(主要是防止避开网盘分享码的行为),保证算法没有问题,不存在欺诈行为,毕竟专栏早就实名制了)

链接:https://pan.baidu.com/s/1AK9wf7-s-02WEEoJL60y1A
提取码:加我好友索要(知识无价,代码低价,大清都灭亡了,还想白嫖,白嫖党另寻他路)

基于opencv的摄像头解像力量化SFR算法实现