概述
在项目中的一个环节用到了模糊检测的相关内容
主要思想是先对原图像进行灰度化,然后用3x3的拉普拉斯算子进行滤波处理
再计算处理后图像的均值和方差,将方差当做模糊检测的阈值选定标准即可。
相关的程序如下所示:
#include <iostream>
#include <opencv2corecore.hpp>
#include <opencv2highguihighgui.hpp>
#include <opencv2imgprocimgproc.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,否则返回1
bool 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~255
convertScaleAbs(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;
}
}
最后
以上就是哭泣外套为你收集整理的【OpenCV】图像模糊检测的全部内容,希望文章能够帮你解决【OpenCV】图像模糊检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复