使用高斯滤波以及拉普拉斯算子实现人脸模糊检测

本文中实现模糊检测的原理如下:

对采集到的人脸图像进行如下处理:
1.高斯模糊去噪,
2.转换灰度图,
3.在此图像上利用拉普拉斯算子滤波,
4.直方图归一化映射到0-255,
5.求均值,

检测方法:若该均值大于给定阈值,则认为是清晰照片,否则,是模糊照片。

实验结果表明:

正常人脸图片经处理后均值在500以上,而模糊人脸只有几十到两三百,很难使用拉普拉斯算子提取到有效边缘。
(数值可能不对,读者可亲测)

缺陷 :只对运动模糊人脸有效,且图片未经美图处理

代码如下:

//模糊检测,如果原图像是模糊图像,返回0,否则返回1  
bool blurDetect(Mat srcImage, double &blurPer){

    Mat srcBlur, gray1, gray2, gray3, dstImage; 
    double thre = 300; //控制阈值
    //pyrDown(srcImage, dstImage, Size(srcImage.cols/2, srcImage.rows/2));
    GaussianBlur(srcImage, srcBlur, Size(3, 3), 0, 0, BORDER_DEFAULT); //高斯滤波
    //imshow("sas", srcBlur);
    //imshow("ssas", srcImage);
    convertScaleAbs(srcBlur, srcImage); //使用线性变换转换输入数组元素成8位无符号整型 归一化为0-255
    if (srcImage.channels() != 1)  
    {  
        //进行灰度化  
        cvtColor(srcImage, gray1, CV_BGR2GRAY);  
    } else  
    {  
        gray1 = srcImage.clone();  
    } 

    Mat tmp_m1, tmp_sd1;    //用来存储均值和方差  
    double m1 = 0, sd1 = 0;  
    //使用3x3的Laplacian算子卷积滤波  
    //imshow("Lap千", gray1);
    //waitKey(0);
    Laplacian(gray1, gray2, CV_16S, 3, 1, 0, BORDER_DEFAULT);

    /*double minVal, maxVal;
    minMaxLoc(gray2, &minVal, &maxVal);
    double alpha = 255 / (maxVal - minVal), beta = -255 * minVal / (maxVal - minVal);*/

    ////归到0~255  
    convertScaleAbs(gray2, gray3);

    //imshow("Lap", gray3);
    //计算均值和方差  
    meanStdDev(gray3, tmp_m1, tmp_sd1);
    //imshow("Lap后", gray3);
    //waitKey(0);
    m1 = tmp_m1.at<double>(0, 0);     //均值  
    sd1 = tmp_sd1.at<double>(0, 0);       //标准差  
    //cout << "原图像:" << endl;  
    //cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << endl; 
    blurPer = sd1*sd1; //方差
    //waitKey(0);
    if (blurPer < thre)  return 0;   
    else  return 1; 
}

结果如下:
这里写图片描述

从上向下图片分别为:
其中前两张为模糊人脸
这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq249356520/article/details/78843015