使用不同相机拍摄的图像中的模糊检测

时间:2017-12-12 08:55:36

标签: c++ opencv image-processing

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

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。 正如所建议的那样,我编辑了代码以检查比率,而不仅仅是laplacian图像的方差。

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

代码场景是否依赖?

我该如何改变它?

示例:

Good

对于上面的图像,方差为62.9因此它检测到图像模糊。

Bad

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

2 个答案:

答案 0 :(得分:2)

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

通过标准化值可能会有更好的行为,例如使用拉普拉斯算子的方差与信号本身的方差之比,或者使用梯度幅度的方差。

我还建议你尝试使用锐利的图像进行实验,然后用更宽更宽的高斯逐渐模糊,并查看&#34;测量的模糊度&#34;与已知的模糊性相比。

答案 1 :(得分:0)

如上所述,您应该将此比率标准化。基本上,如果你将方差除以平均值,你将得到标准化的灰度方差,我认为这是你正在寻找的。

那就是说,我会推荐一个很好的帖子on blur detection - 充满了很好的信息和代码示例。