图像清晰度计算c语言,典型无参考图像清晰度评价(可用作对焦评价函数)

Tenengrad评价函数

Tenengrad函数是一种由Tenenbaum提出的,基于梯度的常用图像清晰度评价函数。特南梯度。

在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值。

Tenengrad函数使用Sobel算子提取水平和垂直方向的梯度值,求其平方和作为评价函数。

具体过程如下:

设Sobel卷积核为

22b66c447c41f8b5c0c7ce9e9af811f2.png,则图像

17db8ff0ef6bbb6169e1dc8d298e59fa.gif在点

3ee684bd984681ea699dbcf9896749c1.gif处的梯度

d9f456a88d56ee91771d496f04385a61.png

定义该图像的Tenengrad值为:(其中

b63f58927b11d3838bf015271af86b09.gif为图像中像素总数)这个求了平均

25401b8b1b1637cb9f44b9d74fdebe24.png

或不求平均:评价函数F(k):

f472f047864e8d36234b14d4eaa09e57.png

其中:T是给定的边缘检测阈值。

ab8ac7144af32ace36a6efedab7d345d.png

图像清晰度计算c语言,典型无参考图像清晰度评价(可用作对焦评价函数)_第1张图片

#include #include#include

using namespacestd;double Tenegrad(IplImage* src)//Tenegrad 标准

{

assert(src->nChannels==8);int row=src->height;//height对应行数

int col=src->width; //width对应行数

int widthstep=src->widthStep;char *data=src->imageData;double S=0;for(int x = 1;x

{char *pre_row=data +(x-1)*widthstep;char *cur_row=data +x*widthstep;char *nex_row=data +(x+1)*widthstep;intSx,Sy;for(int y = 1;y

{//**********************************************///当前邻域://pre_row[y-1],pre_row[y],pre_row[y+1];//cur_row[y-1],cur_row[y],cur_row[y+1];//nex_row[y-1],nex_row[y],nex_row[y+1];//Gx =-1,0,1 Gy =1, 2, 1//-2,0,2 0, 0, 0//-1,0,1 -1,-2,-1//**********************************************/

Sx=(uchar)pre_row[y+1]+2*(uchar)cur_row[y+1]+(uchar)nex_row[y+1]//一定要转为uchar

-(uchar)pre_row[y-1]-2*(uchar)cur_row[y-1]-(uchar)nex_row[y-1];

Sy=(uchar)nex_row[y-1]+2*(uchar)nex_row[y]+(uchar)nex_row[y+1]-(uchar)pre_row[y-1]-2*(uchar)pre_row[y]-(uchar)pre_row[y+1];

S+=Sx*Sx+Sy*Sy;

}

}return S/(row-2)/(col-2);

}intmain()

{

IplImage* src = cvLoadImage("d:\\lena.bmp",0);

cvNamedWindow("src");

cvShowImage("src",src);

cout<

cvWaitKey(0);

cvReleaseImage(&src);

cvDestroyWindow("src");return 0;

}

View Code

Laplacian 梯度函数

利用Laplacian算子对图像进行模板卷积得到图像的高频分量,然后可以对图像的高频分量求和,用高频分量和作为图像的清晰度评价标准。

d7089f4a165444ece1cbecc9c8080657.png

对于一个M×N像素的图像,每个像素的亮度为g(x,y),进行滤波模板卷积后每个像素点值为z(x,y)。则图像清晰度评价函数:

9c2026f4f9e2734934452871298d61f6.png

Laplacian算子:z(x,y)=g(x-1,y)+g(x+1,y)+g(x,y-1)+g(x,y+1)一4g(x,y)

梯度算子为水平方向和垂直方向两个,高通滤波算子只有一个

图像清晰度计算c语言,典型无参考图像清晰度评价(可用作对焦评价函数)_第2张图片

SMD(灰度差分绝对值之和,Sum of Modulus of gray Difference )函数

用差分绝对值代替乘方和开方,即对点(x,y)及其邻近点的灰度作差分运算,提取该点灰度值的变化大小,得出图像灰度差分绝对值之和算子。

图像清晰度计算c语言,典型无参考图像清晰度评价(可用作对焦评价函数)_第3张图片

灰度差分绝对值之和具有较好的计算性能,但其缺点也很明显,即在焦点附近灵敏度不高,即该函数在极值点附近过于平坦,从而导致聚焦精度难以提高。

在文章《一种快速高灵敏度聚焦评价函数》中提出了一种新的评价函数,称之为灰度差分绝对值乘积法,即对每一个像素领域两个灰度差相乘后再逐个像素累加。

fd50fc2ecd7a3dd309cb1830eb1c77f2.png

【参考文献】

一种基于高通滤波评价函数的自动对焦方法_百度学术

你可能感兴趣的:(图像清晰度计算c语言)