Tenengrad评价函数 详解

本文介绍了一种基于梯度的图像清晰度评价方法——Tenengrad函数,通过Sobel算子提取图像边缘信息,计算图像的清晰度。详细解释了Tenengrad函数的工作原理,并提供了具体的实现代码。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Tenengrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数。

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

Tenengrad函数使用Sobel算子提取水平和垂直方向的梯度值。具体过程如下:

设Sobel卷积核为,则图像在点处的梯度


定义该图像的Tenengrad值为

其中为图像中像素总数。


实现代码如下:

#include<cv.h>
#include &lt;highgui.h&gt;
#include&lt;iostream&gt;
using namespace std;

double Tenegrad(IplImage* src)//Tenegrad 标准
{ 
	assert(src-&gt;nChannels==8);
	int row=src-&gt;height;//height对应行数
	int col=src-&gt;width; //width对应行数
	int widthstep=src-&gt;widthStep;
	char *data=src-&gt;imageData;
	double S=0;
    for(int x = 1;x&lt;row-1;x++)
	{
        char *pre_row=data +(x-1)*widthstep;
		char *cur_row=data +x*widthstep; 
		char *nex_row=data +(x+1)*widthstep;
		int Sx,Sy;
        for(int y = 1;y&lt;col-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);
}

int main()
{
	IplImage* src = cvLoadImage("d:\\lena.bmp",0);
	cvNamedWindow("src");
	cvShowImage("src",src);
	cout&lt;&lt;Tenegrad(src);
	cvWaitKey(0);
	cvReleaseImage(&amp;src);
	cvDestroyWindow("src");
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zqx951102

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

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

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

打赏作者

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

抵扣说明:

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

余额充值