检测原理:聚焦图像确实比离焦图像含有更多的信息,边缘更加锐利,细节信息更加丰富,同时高频信号变化也更加强烈;
聚焦评价算法的标准:
•
单峰性
•
无偏性
•
抗噪性
•
适应性
•
实时性
目前常用的聚焦评价算法:
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的值越大,结果越清晰,时间有点久了,不知道还是不是这样的意思,若有错,请不吝赐教,小怪非常感谢。