【OpenCV】图像模糊检测

来源:互联网 发布:k是什么意思网络用语 编辑:程序博客网 时间:2024/05/01 04:12

在项目中的一个环节用到了模糊检测的相关内容

主要思想是先对原图像进行灰度化,然后用3x3的拉普拉斯算子进行滤波处理

再计算处理后图像的均值和方差,将方差当做模糊检测的阈值选定标准即可。

相关的程序如下所示:

#include <iostream>#include <opencv2\core\core.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgproc\imgproc.hpp>using namespace cv;using namespace std;bool blurDetect(Mat srcImage);int main(){//读入图片Mat img1 = imread("white1_1.bmp");double time = (double)getTickCount();bool flag = blurDetect(img1);time = ((double)getTickCount() - time) / getTickFrequency();cout << "所用时间为:" << time << "s" << endl;system("pause");return 0;}//模糊检测,如果原图像是模糊图像,返回0,否则返回1bool blurDetect(Mat srcImage){Mat gray1;if (srcImage.channels() != 1){//进行灰度化cvtColor(srcImage, gray1, CV_RGB2GRAY);}else{gray1 = srcImage.clone();}Mat tmp_m1, tmp_sd1;//用来存储均值和方差double m1 = 0, sd1 = 0;//使用3x3的Laplacian算子卷积滤波Laplacian(gray1, gray1, CV_16S, 3);//归到0~255convertScaleAbs(gray1, gray1);//计算均值和方差meanStdDev(gray1, tmp_m1, tmp_sd1);m1 = tmp_m1.at<double>(0, 0);//均值sd1 = tmp_sd1.at<double>(0, 0);//标准差//cout << "原图像:" << endl;cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << endl;if (sd1*sd1 < 400){cout << "原图像是模糊图像" << endl;return 0;}else{cout << "原图像是清晰图像" << endl;return 1; }}