【问题标题】:blur detection in Images taken with different cameras使用不同相机拍摄的图像中的模糊检测
【发布时间】:2017-12-14 17:25:23
【问题描述】:

我想使用拉普拉斯算子检测模糊图像。这是我正在使用的代码:

bool checkforblur(Mat img)
{
    bool is_blur = 0;
    Mat gray,laplacianImage;
    Scalar mean, stddev, mean1, stddev1; 
    double variance1,variance2,threshold;
    cvtColor(img, gray, CV_BGR2GRAY);
    Laplacian(gray, laplacianImage, CV_64F);
    meanStdDev(laplacianImage, mean, stddev, Mat()); 
    meanStdDev(gray, mean1, stddev1, Mat()); 
    variance1 = stddev.val[0]*stddev.val[0];
    variance2 = stddev1.val[0]*stddev1.val[0];
    double ratio= variance1/variance2;
    threshold = 90;
    cout<<"Variance is:"<<ratio<<"\n"<<"Threshold Used:"
    <<threshold<<endl;
    if (ratio <= threshold){is_blur=1;}
    return is_blur;
}

此代码将图像作为输入,并根据图像是否模糊返回 1 或 0。 正如建议的那样,我编辑了代码以检查比率而不是仅检查拉普拉斯图像的方差。

但是对于使用不同相机拍摄的图像,阈值仍然不同。

代码场景是否依赖?

我应该如何改变它?

例子:

对于上面的图像,方差是 62.9 所以它检测到图像是模糊的。

对于上面的图像,方差为 235,因此它被错误地检测为不模糊。

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    拉普拉斯算子是线性的,因此它的幅度随着信号的幅度而变化。因此,对比度更强的图像的响应会更高。

    通过标准化值,您可能会获得更好的行为,例如使用拉普拉斯方差与信号本身的方差或梯度幅度方差的比率。


    我还建议您尝试使用逐渐模糊的清晰图像,使用越来越宽的高斯分布,并查看“测量模糊度”与已知模糊度的图。

    【讨论】:

    • 如果你尝试这个,请告诉我们结果。
    • 感谢您的宝贵时间。我已经编辑了这个问题。这就是你的建议吗?
    • @janu777:是的。我没有注意您正在计算 StdDev 然后转换为方差。我认为使用 StdDev 会更好。但在设置固定阈值之前,请查看不同图像和不同模糊程度的值。
    • 所以你建议我使用 stdDev 本身而不是方差。对吗?
    • @janu777:是的,这使得比例更线性(但这不是必需的)。
    【解决方案2】:

    如上所述,您应该标准化这个比率。基本上,如果您将方差除以平均值,您将得到归一化的灰度方差,我认为这就是您要寻找的。​​p>

    也就是说,我会推荐一个出色的线程 on blur detection - 充满了很好的信息和代码示例。

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多