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
传感器水平像素数H1280
传感器垂直像素数V720
传感器像元尺寸µm3µm
调焦距离L400mm

$$ 像距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.算法缺点

只能测试某单一频率下的对比度, 对测试环境要求非常高,比如光源亮度的变化,曝光的变化对结果有较大的影响,数据精度稳定性保证上要注意。

最后修改:2024 年 07 月 18 日
如果觉得我的文章对你有用,请随意赞赏