【发布时间】: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