【OpenCV】图像模糊检测

本文介绍了一种基于图像灰度化及拉普拉斯算子的模糊检测算法。该算法通过计算图像处理后的方差来判断图像是否模糊,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

主要思想是先对原图像进行灰度化,然后用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,否则返回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; 
	}
}


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值