1.引言
图像清晰度的评估在计算机视觉和图像处理领域中至关重要。在摄像头清晰度评测方面,最常用的是对比度传递函数CTF,可以量化特定区域内的对比度,从而评估图像的清晰度。以下是详细的原理解释、实际操作步骤以及实现方法。
2.实现原理
对比度是图像中亮度的变化程度,是图像质量的关键指标之一。高对比度意味着图像中亮和暗区域的差异较大,视觉效果更清晰。CTF是一种经典的对比度测量方法,尤其适用于周期性图案(如条纹线对图案)。
3.算法实现
目前常用两种算法实现:
3.1 对比度标准差(Standard Deviation of Contrast)
该方法基于计算图像中各像素对比度的标准差,以量化图像的对比度变化。较高的对比度标准差通常表示图像具有较高的清晰度,因为这意味着图像中亮暗区域的变化较大。
对比度标准差计算基于局部对比度的变化。局部对比度可以定义为每个像素与其邻域的灰度差异。通过计算整个图像或选定区域内所有像素对比度的标准差,可以获得图像的整体对比度标准差。
$$ \sigma = \frac{1}{N}\sum_{i=1}^{N}(x_i - \mu)^2 \ $$
3.2 Michelson对比度(MaxMin)
该方法计算了区域内最大和最小灰度值的差异与总和的比值,结果在0到1之间。值越大,表示对比度越高,即亮暗差异越明显。
$$ Contrast=\frac{Max-Min}{Max+Min} $$
4.使用图卡
由于该算法主要是对于周期性图案的分析,所以常用的图卡为水平或垂直条纹线对,为了保证测量结果的准确性,往往对线条的宽度做要求
条纹宽度规格计算公式(符合ISO12233标准)
镜头等效焦距EFL(mm) | 2.8mm |
---|---|
传感器水平像素数H | 1280 |
传感器垂直像素数V | 720 |
传感器像元尺寸µm | 3µm |
调焦距离L | 400mm |
$$ 像距Lx=\frac{1}{\frac{1}{EFL}-\frac{1}{L}}=\frac{1}{\frac{1}{2.8}-\frac{1}{400}}≈2.82mm $$
测试图案的实际尺寸由传感器尺寸和放大倍率决定。放大倍率可以由调焦距离(L)和像距(Lx)的比值计算。
$$ 放大倍率M=\frac{1}{Lx}=\frac{400}{2.82}≈141.84 $$
水平和垂直方向的测试图案尺寸
$$ W_0=M\times H=114.84 \times 3.84=544.67mm $$
$$ H_0=M\times V=114.84 \times 2.16=306.38mm $$
根据ISO12233标准,条纹线宽由测试图案的尺寸和传感器的像素数决定。假设测试算法频率为4,即每个周期包含4个像素。
$$ 线宽=\frac{W_0}{H\times 4}=\frac{544.67}{1280\times 4}≈1.065mm $$
即 黑线或白线的实际宽度为1.065mm
5.Opencv实现
4.1 Standard实现
double CalculateCTFStandard(cv::Mat mat)
{
if (mat.empty())
return 0;
cv::Scalar mean, standardDeviation;
cv::meanStdDev(mat, mean, standardDeviation);
return standardDeviation[0] * (255.0 / 2.0));
}
结果乘以(255.0 / 2.0)是为了将数值量化为0-1之间
4.2 MaxMin实现
double CalculateMTFMaxMin(cv::Mat mat)
{
if (mat.empty())
return 0;
double min, max;
cv::minMaxLoc(mat, &min, &max);
return (max - min) / (max + min);
}
6.算法缺点
只能测试某单一频率下的对比度, 对测试环境要求非常高,比如光源亮度的变化,曝光的变化对结果有较大的影响,数据精度稳定性保证上要注意。