用Laplacian/sobel算子进行图像模糊度检测,为什么用方差进行评价?

清楚的图像经过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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值