图片清晰度“测量” 算法

检测原理:聚焦图像确实比离焦图像含有更多的信息,边缘更加锐利,细节信息更加丰富,同时高频信号变化也更加强烈;

聚焦评价算法的标准:

单峰性
无偏性
抗噪性
适应性
实时性 

目前常用的聚焦评价算法:

1. 梯度函数;
2. 非梯度函数;

梯度函数的依据:

              在图像处理中,梯度函数常被用来提取边缘信息,聚焦良好的图像,具有更尖锐的边缘,应有更大的梯度函数值。



代码如下:

#include<highgui.h>
#include<cv.h>
/*****************取图像的感兴趣部分*************************/
/************************************************************/
IplImage* imgROI(IplImage* image1)
{   IplImage* ImgROI=cvCreateImage(cvSize(260,228),8,1);//裁剪的矩形宽为260,矩形高为228。
	cvSetImageROI(image1,cvRect(140,92,260,228));
	cvCopy(image1,ImgROI);
	return ImgROI;
}
unsigned long Tenengrad_measure(IplImage *image3)
{
	unsigned long QQQ=0;
	for (int x = 0; x < image3->height; x++)
	{
		uchar* ptr=(uchar*)(image3->imageData+x*image3->widthStep);
		for (int y = 1; y < image3->width; y++)
		{
			//++sum;
			QQQ+=ptr[y];
			//++y;
		}	
	}
	return QQQ;
}
int main(int argc,char** argv)
{
	IplImage* imgSrc=cvLoadImage("E:\\工作\\工作1\\测试图片\\3#镜头测试图片\\USB2_CMOS_1.3M_FM(1)@CD130002153 20150906 154944481.bmp",1);
	cvSmooth(imgSrc,imgSrc,CV_GAUSSIAN,3,0,0,0);
	IplImage* imgGray=cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,1);
	cvCvtColor(imgSrc,imgGray,CV_BGR2GRAY);
	IplImage* ImgROI=imgROI(imgGray);
    IplImage* imgSobel_1=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_16S,1);
	IplImage* imgSobel_2=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_16S,1);
	cvSobel(ImgROI,imgSobel_1,1,0,3);//一阶x方向的差分
	cvSobel(ImgROI,imgSobel_2,0,1,3);//一阶y方向的差分
	IplImage* imgSobel_11=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	IplImage* imgSobel_21=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	cvConvertScaleAbs(imgSobel_1,imgSobel_11,1,0);//算出Gx
	cvConvertScaleAbs(imgSobel_2,imgSobel_21,1,0);//算出Gy

	IplImage* imgSobel_12=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	IplImage* imgSobel_22=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	cvPow(imgSobel_11,imgSobel_12,2);//Gx的二次方
	cvPow(imgSobel_21,imgSobel_22,2);//Gy的二次方
	
	/**********Gx的平方+Gy的平方**************/
	IplImage* imgSobel=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	cvAddWeighted( imgSobel_12, 1, imgSobel_22, 1, 0, imgSobel );//addWeighted计算两个数组的加权和

	/****************Gx的平方+Gy的平方的结果开根号*******************/
	//IplImage* imgSobell=cvCreateImage(cvGetSize(ImgROI),IPL_DEPTH_8U,1);
	//cvPow(imgSobel,imgSobell,0.5);//得出S(x,y)

	unsigned long QQQ=Tenengrad_measure(imgSobel);//算出最后的结果


	cvReleaseImage(&imgSrc);
	cvReleaseImage(&imgGray);
	cvReleaseImage(&ImgROI);
	cvReleaseImage(&imgSobel_1);
	cvReleaseImage(&imgSobel_2);
	cvReleaseImage(&imgSobel_11);
	cvReleaseImage(&imgSobel_21);
    cvReleaseImage(&imgSobel_12);
	cvReleaseImage(&imgSobel_22);
	cvReleaseImage(&imgSobel);

	system("pause");
	return 0;
}
不好意思:这是之前用C语言结合OpenCV写的,原理大概如此,如果有不明白的可以留言:

把最后的结果进行输出为QQQ,在试验中加一段连续读入图片的代码,QQQ的值越大,结果越清晰,时间有点久了,不知道还是不是这样的意思,若有错,请不吝赐教,小怪非常感谢。



  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫与橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值