清楚的图像经过Laplacian/Sobel算子处理后得到的像素数值偏差都很大,像素值要么是0(黑色),要么是接近255(白色)。而一张模糊的图像经过Laplacian/Sobel算子处理后得到的像素值分布比较散。通过这个特点可以运用统计学的标准方差来区分。清楚的图的像素值标准方差较大而模糊图的像素值因为分部比较散相对来说标准方差较小。
在这里插入代码片//模糊检测,如果原图像是模糊图像,返回0,否则返回1
double blurDetect(Mat& inPresentImg, Mat &inBackImg )
{
Mat gray1;
if (inPresentImg.channels() != 1)
{
cvtColor(inPresentImg, gray1, CV_RGB2GRAY);
}
else
{
gray1 = inPresentImg.clone();
}
Mat tmp_m1, tmp_sd1; //用来存储均值和方差
double m1 = 0, sd1 = 0;
//使用3x3的Laplacian算子卷积滤波
Laplacian(gray1, gray1, CV_16S, 3);
//归到0~255
convertScaleAbs(gray1, gray1);
//计算均值和标准方差
meanStdDev(gray1, tmp_m1, tmp_sd1);
m1 = tmp_m1.at<double>(0, 0); //均值
sd1 = tmp_sd1.at<double>(0, 0); //标准差
/*计算背景的模糊度*/
Mat gray2;
if (inBackImg.channels() != 1)
{
cvtColor(inBackImg, gray2, CV_RGB2GRAY);
}
else
{
gray2 = inBackImg.clone();
}
Mat tmp_m2, tmp_sd2; //用来存储均值和方差
double m2 = 0, sd2 = 0;
//使用3x3的Laplacian算子卷积滤波
Laplacian(gray2, gray2, CV_16S, 3);
//归到0~255
convertScaleAbs(gray2, gray2);
meanStdDev(gray2, tmp_m2, tmp_sd2);
m2 = tmp_m2.at<double>(0, 0); //均值
sd2= tmp_sd2.at<double>(0, 0); //标准差
double sumLapMean= 0;
if (m2 !=0)
{
sumLapMean = abs(m1 - m2)/m2;
}
double sumLapStd= 0;
if (sd2 !=0)
{
sumLapStd = abs(sd1 - sd2)/sd2;
}
double sumLap = sumLapMean+sumLapStd;//也可以试试这个参数
cout<<"fuzzylap=="<<sumLap<<"mean=="<<sumLapMean<<"std=="<<sumLapStd<<endl;
return sumLapStd ;
}
[参考文章](https://www.jianshu.com/p/4f8537298009)