目录

一. 简介:

二. 软件操作流程:

三. 编译

四. 算法流程

五. 关键算法

六. 鸣谢


一. 简介:

SFR是"Spatial Frequency Response"(空间频率响应)的简称,用来表示图形清晰度的算法。本篇文章介绍的的代码实现来自https://github.com/RayXie29/SFR_Calculation,虽然严谨性无法和mitre_sfr算法媲美,但是算法遵循ISO12233,依然可以作为初学者学习的资料。

二. 软件操作流程:

如果读者没有自己的斜边图形,该算法的文件夹imgs包含了一个图形original_img.bmp可以使用,如下图。

下面是选择ROI区域,如下图示,

切割后的图形如下,

最后会生成一个csv文件,保存不同空间频率下的MTF值,如下,

0,1
0.0277778,0.997496
0.0555556,0.990619
0.0833333,0.979686
0.111111,0.965329
0.138889,0.947379
0.166667,0.928097
0.194444,0.909256
0.222222,0.889783
0.25,0.867951
0.277778,0.843465
0.305556,0.818012
0.333333,0.792307
0.361111,0.764379
0.388889,0.73298
0.416667,0.698145
0.444444,0.661594
0.472222,0.625916
0.5,0.590796
0.527778,0.556283
0.555556,0.522798
0.583333,0.490742
0.611111,0.457425
0.638889,0.422138
0.666667,0.38516
0.694444,0.351526
0.722222,0.322769
0.75,0.294444
0.777778,0.262373
0.805556,0.228476
0.833333,0.200449
0.861111,0.18049
0.888889,0.159404
0.916667,0.134192
0.944444,0.106814
0.972222,0.0801231
1,0.0798865

三. 编译

请参考下面的blog搭建编译环境,(134条消息) VS2019+OpenCV2环境搭建_jgw2008的专栏-CSDN博客;
代码下载地址为 https://github.com/RayXie29/SFR_Calculation, 注意在sfr.cpp中将头文件"ISOsfr.h"改为“sfr.h”。

四. 算法流程

下面是引用一篇mitre_sfr算法流程的图片,该算法和其近似度十分高。
引用地址1:https://blog.csdn.net/weixin_38419133/article/details/100019551, 
引用地址2:https://blog.csdn.net/jaych/article/details/50700576

1)在相机获取到的RGB图像数据中选择对应垂直斜边ROI,并将其转化为Gray ROI;
2)对得到的Gray ROI数据进行线性化,得到linear ROI数据;
3)计算每一行的centroid,即图像重心,这样能够得到每一行数据的边缘位置。
4)获取到的centroid进行线性回归,得到对应的边缘数据,包括斜率、截距等。
5)获取得到重新定位ROI,根据图像数据及其到边缘的距离,获得ESF。
6)对ESF进行4倍超采样,根据每个数据与它同一行的边缘位置的距离,分别放入4个容器中,获得4xESF。
7)对4xESF进行差分运算,获得LSF。
8)对LSF应用汉明窗,减少图像边缘及噪声影响。
9)进行DFT运算,获得OTF。
10)从OTF的实部获得SFR。

五. 关键算法

此份代码的优点是简洁,可以和ISO12233算法流程匹配度高,但严谨性缺失,读者可以在使用过程中参考经典的mitre_sfr算法进行完善。

int SFRCalculation(cv::Mat &ROI, double gamma)
{if (ROI.empty()){std::cerr << "Open the ROI image error" << std::endl;return 0;}int height = ROI.rows, width = ROI.cols;//Do the gamma decoding to eliminate the gamma encoded by camera device de_Gamma(ROI, gamma);int i, j;double slope = 0, intercept = 0;//Center centroid offsetdouble CCoffset = 0;std::vector<double> y_shifts(height);Calculate the shifts between Centroids and Centroid of image center    std::vector<double> Cen_Shifts = CentroidFind(ROI, y_shifts, &CCoffset);if (Cen_Shifts.empty()) { return 0; }//simple linear regression for slanted edge fittingSLR(Cen_Shifts, y_shifts, &intercept, &slope);std::cout << "Slope is " << slope << std::endl;//Truncate the number of rows of data to largest slope cycle which will have an integer number of full phase rotationsReduceRows(slope, &height);//update the CCoffset to the offset between original mid point of image and reference mid point we calculatedCCoffset = CCoffset + 0.5 + intercept - width / 2;//Mapping the pixel value of original image into a sampling data which the length is 4 times of original image width//This step is for concentrating the amount of change of original pixel valuesint SamplingLen = width * 4;std::vector<double> OverSamplingData = OverSampling(ROI, slope, CCoffset, height, width, &SamplingLen);//Using hamming window to filter the ripple signal of two side of dataOverSamplingData = HammingWindows(OverSamplingData, SamplingLen);//decrete four transformDFT(OverSamplingData, SamplingLen);width = int(SamplingLen / 4);double maxData = 0;for (i = 0; i < SamplingLen; ++i){if (OverSamplingData[i] != 0){maxData = OverSamplingData[i];break;}}for (int i = 0; i < SamplingLen; ++i) { OverSamplingData[i] /= maxData; }std::clog << "create ./ref/mtf.csv file" << std::endl;std::fstream mtf_file("./ref/mtf.csv", std::ios::out);for (i = 0; i <= width; ++i){double frequency = (double)i / width;mtf_file << frequency << "," << OverSamplingData[i] << "\n";}

5.1 线性化ROI数据

在Sensor获得图像之后,呈现出来的图像由于要符合人眼的感觉,会对图像像素进行伽马变换,使得其变成非线性的像素数据,从而使图像的显示更加符合人眼的感受。所以,当我们要进行sensor的成像解析力分析时,要先将图像处理成没有经过伽马变换前的。

一般sensor会对raw图像进行一个2.2的gamma变换,若我们想恢复原始图像时,我们只需要进行一个1/2.2的gamma变换即可。

代码如下,首先检查图形是否单通道,然后进行变换
变换公式:目标值 = 255*((原始值/255) ** (1/gamma)).

注意,代码默认赋予的gamma值为1,这样图形数据没有进行任何变换;比较合理的gamma值为2.2

void de_Gamma(cv::Mat &Src, double gamma)
{std::clog << "de_Gamma ++" << std::endl;if (Src.channels() != 1) { return; }for (int i = 0; i < Src.rows; ++i){uchar *SrcP = Src.ptr(i);for (int j = 0; j < Src.cols; ++j){SrcP[j] = 255 * (pow((double)SrcP[j] / 255, 1 / gamma));}}
}

六. 鸣谢

(133条消息) 图像解析力算法—SFR(Spatial Frequency Response)原理分析(一)_Dylan的博客-CSDN博客

(134条消息) 【图像处理】SFR算法详解1_Image-CSDN博客_sfr算法

(134条消息) 【图像处理】SFR算法详解2_Image-CSDN博客_sfr算法详解

(134条消息) 【图像处理】SFR算法详解3_Image-CSDN博客_imatest sfr

SFR解析算法 - SFR_Calculation (C语言)相关推荐

  1. 怎样在c语言中声明list这一变量,C语言变量赋值语句的语法解析算法实现

    本篇文章是java开发编译器系列课程的文档,有兴趣的朋友可关注网易云课堂的视频内容: 自己动手用java开发编译器 经过一系列的算法摸索后,我们终于要进入 C 语言编译器开发的进程,这一节,我们的目的 ...

  2. 5分钟理解CFG上下文无关文法的解析算法

    本文是5分钟理解CFG上下文无关文法的续集,在5分钟理解CFG上下文无关文法这篇文章中已经讲解了CFG的基本概念,但是CFG的解析算法才是核心.由于它的解析算法极其复杂,网上很少有文章能把解析算法用大 ...

  3. 数据结构视频教程 -《妙趣横生的算法(C语言实现)》

    整个视频打包下载地址:史上最全的数据结构视频教程系列分享之<妙趣横生的算法(C语言实现)>,转载请保留出处和链接! 更多优秀资源请访问:我是码农 本教程是<妙趣横生的算法(C语言实现 ...

  4. 《妙趣横生的算法(C语言实现)》随书光盘

    本教程是<妙趣横生的算法(C语言实现)>随书光盘的视频教程,理论与实践相结合,旨在帮助学习者理解算法,并提高C语言编程能力,培养读者的编程兴趣,并巩固已有的C语言知识.视频内容涵盖了编程必 ...

  5. 解析 TEA 加密算法(C语言、python):

    目录 解析 TEA 加密算法(C语言.python): TEA 加密: XTEA 加密: XXTEA 加密: 解析 TEA 加密算法(C语言.python): TEA系列概述: TEA算法是由剑桥大学 ...

  6. cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

    一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  7. 解析 RC4 加密算法(C语言、python)

    目录 解析 RC4 加密算法(C语言.python): RC4加密算法是一种对称加密算法: 加密(解密)原理: RC4算法中的几个关键变量: RC4代码介绍: rc4初始化介绍: 包含三个参数: RC ...

  8. 十种经典排序算法精粹(c语言版本)

    下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...

  9. 迪杰斯特拉算法(C语言实现)

    迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲. #include "stdio.h" #include "stdlib.h" //用一个 ...

最新文章

  1. Android数据持久化:文件存储
  2. 链表节点的删除(删除重复无序节点)
  3. Activiti 简易教程
  4. word刷子刷格式_Excel技巧—开始菜单之格式刷六大功能
  5. 笨方法“学习python笔记之数学计算
  6. 5.Knockout.Js(自定义绑定)
  7. python pip工具命令_转载 Python 安装setuptools和pip工具操作方法(必看)
  8. pc微信登录扫码显示无法连接服务器,WeAuth微信小程序实现PC网站扫码授权登录...
  9. 记录下我磕磕碰碰的三个月找工作经历,BAT大厂面试总结
  10. 如何解决微图不能在虚拟机上运行的问题
  11. Google谷歌搜索引擎镜像入口网址大全导航,谷歌搜索引擎镜像站
  12. VScode安装Live Server插件打开时提示 Open a folder or workspace (File Open Folder)
  13. android 自定义锁屏api,如何设置Android锁屏图像
  14. 进程虚拟地址空间区域划分
  15. va_list可变参数理解(va_start/va_end...)
  16. 谷歌日语输入法、中文输入法之间的切换
  17. excel 把已有的数据做成图表
  18. 解析如何快速准确区别肖特基二极管与快恢复二极管的诀窍
  19. 010 Editor:二进制文件编辑利器
  20. 网关怎么买?是选小米智能多模网关?还是Aqara网关呢?

热门文章

  1. python遍历列表易出错!!!!!
  2. 医学影像学考试 计算机,规培影像学的考试.ppt
  3. VSTO 部署安装的两种方法
  4. SAP笑话 ABAP简称
  5. MiL 和 SiL简单介绍
  6. 自动驾驶仿真(六)—— SIL软件在环仿真测试
  7. 2020年9月大学英语六级作文
  8. 17秋《计算机应用基础》,南开17秋学期《计算机应用基础》在线作业.docx
  9. ACM-ICPC 2018 南京赛区网络预赛 Skr 马拉车+字符串hash+hash表
  10. 特性(Feature)与功能(Function)的差异