我想使用拉普拉斯算子检测模糊图像。这是我正在使用的代码:
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图像的方差。
但使用不同相机拍摄的图像的阈值仍然不同。
代码场景是否依赖?
我该如何改变它?
示例:
对于上面的图像,方差为62.9因此它检测到图像模糊。
对于上面的图像,方差为235,因此它被错误地检测为不模糊。
答案 0 :(得分:2)
拉普拉斯算子是线性的,因此其幅度随信号的幅度而变化。因此,对比度更强的图像的响应会更高。
通过标准化值可能会有更好的行为,例如使用拉普拉斯算子的方差与信号本身的方差之比,或者使用梯度幅度的方差。
我还建议你尝试使用锐利的图像进行实验,然后用更宽更宽的高斯逐渐模糊,并查看&#34;测量的模糊度&#34;与已知的模糊性相比。
答案 1 :(得分:0)
如上所述,您应该将此比率标准化。基本上,如果你将方差除以平均值,你将得到标准化的灰度方差,我认为这是你正在寻找的。 p>
那就是说,我会推荐一个很好的帖子on blur detection - 充满了很好的信息和代码示例。