基于opencv 纹理图/枯叶图 MTF/ACUTANCE评测算法

1.有SFR算法为何还要引入基于纹理图的MTF/ACUTANCE评测算法?

       如果使用的raw数据,只用sfr测试不同频率的mtf是完全可以的。但如果经过isp处理后,因为存在降噪/锐化处理,并不能真正体现纹理和边缘的实际表现。

       例如:

        在相机 A 上,边缘和纹理的清晰度似乎相等。纹理中可以看到许多细节。
        在相机 B 上,边缘经过了ISP数字增强,SFR 转换看起来过于清晰。边缘Ring也是处理的产物。在纹理部分,相机 A 上可见的许多细节在相机B上都消失了。

        猛地一看,边缘清晰度测量第二台相机更清晰。但仔细检查对比度纹理表明,相机 A 比相机 B 更好地保留了精细的细节。
        纹理图评测方法的目的是量化这种差异。

2.如何使用 纹理图/枯叶图 chart来评判camera 再现细节的能力?

       Ⅰ在实验室打光拍摄纹理图后可以直接用imatest来计算MTF/ACUTANCE,只要设置好imatest的纹理图类型,就可以计算出结果,包括MTF曲线和锐度。

       Ⅱ也可以使用opencv或matlab自己写一段程序完成计算,我使用的是opencv,便于工程应用

       原理如下:1.计算拍摄图的PSDi

                         2.计算标准chart的PSDcalib,或从商家拿到已有的标定的PSD数据

                         3.MTF=PSDi/PSDcalib,得到MTF

                         4.CSF计算如下

                                

                                     其中v is in cycles/degrees,其它都是固定系数。

                         5.根据A=(MTF*CSF积分)以及Ar=(CSF积分),通过A/Ar计算Acutance,这一步

                            注意cycles/pixel与cycles/degree这两个量纲的转换。

                         6.以上为了增加准确性,还需要考虑进去噪声的影响。

       评判标注如下:

                        

3.附一段结果和伪代码:

 0. 实拍纹理图           

1.PSDi

2.PSDcalib

3.PSDnoise

4.MTF

5.CSF

Acutance = 0.78,属于轻微模糊。

伪代码:

P0=getChartCalibPSD()

P1=getChartRealPSD()

P2=getChartNoisePSD()

MTF = (P1-P2)/P0

CSF = getCSF()

A = ∫MTF*CSFdv

Ar = ∫CSFdv

acutance = A/Ar.

专注于影像行业15年,对镜头芯片及画质评测有一定积累,如需要合作开发项目请私信联系本人,勿做伸手党。

### 实现SFR和MTF分析 对于基于OpenCV的SFR(空间频率响应)以及MTF(调制传递函数)分析,主要依赖于像处理技术来评估镜头或者成像系统的性能。当执行这类分析时,通常会涉及到几个关键步骤:准备测试表、获取高质量的输入像、预处理这些像以便后续分析、提取特征用于计算SFR曲线,并最终转换为MTF值。 #### 准备工作 为了准确测量SFR/MTF,在实验设置上建议采用标准测试卡作为目标对象拍摄照片。理想情况下应选择具有高对比度边缘特性的案,比如斜边模式(slit pattern),因为它们能够提供更精确的结果[^1]。 #### 像采集与预处理 确保所使用的相机已经过校准并且处于最佳状态;调整参数如光圈大小、ISO感光度等以获得最清晰的画面质量。接着利用OpenCV加载并初步清理噪声干扰: ```python import cv2 import numpy as np def preprocess_image(image_path): """Load and denoise an input image.""" img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Apply Gaussian blur to reduce noise while preserving edges. blurred_img = cv2.GaussianBlur(img, (5, 5), 0) return blurred_img ``` #### SFR 计算 一旦拥有了干净无噪点的目标区域截,则可以通过特定算法估计其局部的空间频率特性。这里给出一种简化版的方法——通过傅里叶变换得到频域表示形式下的强度分布情况,进而推导出相应的SFR指标[^4]: ```python from scipy.fft import fftshift, fft2 def calculate_sfr(edge_region): """Calculate the spatial frequency response of a given edge region.""" f = np.abs(fftshift(fft2(np.float32(edge_region)))) magnitude_spectrum = 20 * np.log(f + 1e-7) # Avoid log(0). # Extract line profile across centerline perpendicular to edge orientation. h, w = edge_region.shape[:2] mid_col = int(w / 2) sfr_profile = magnitude_spectrum[h//4:h*3//4,mid_col] return sfr_profile ``` 请注意上述代码片段仅适用于简单场景下近似求解SFR,实际应用可能还需要考虑更多因素,例如不同方向上的变化趋势建模等问题。 #### 转换至MTF 最后一步是从测得的数据中得出MTF数值。这一般意味着要将之前获得的一维或多维信号映射到零到一之间标准化范围内,其中接近单位值表明系统保持了良好的细节再现能力。 ```python def compute_mtf(sfr_values): """Normalize SFR values into MTF range [0, 1].""" mtf_curve = sfr_values / max(abs(sfr_values)) return mtf_curve.clip(min=0.,max=1.) ``` 以上就是使用Python结合OpenCV库来进行基本SFR及MTF分析的大致流程概述。当然,具体实现可能会因需求差异而有所不同,特别是在面对复杂环境条件下时需做适当调整优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值