码迷,mamicode.com
首页 > 其他好文 > 详细

Tenegrad评价函数

时间:2014-11-12 21:18:04      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:opencv   图像处理   

Tenegrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数。
在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值。
Tenegrad函数使用Sobel算子提取水平和垂直方向的梯度值。具体过程如下:

设Sobel卷积核为bubuko.com,布布扣bubuko.com,布布扣,则图像bubuko.com,布布扣在点bubuko.com,布布扣处的梯度

bubuko.com,布布扣

定义该图像的Tenegrad值为
bubuko.com,布布扣

其中bubuko.com,布布扣为图像中像素总数。


实现代码如下:

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

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<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<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<<Tenegrad(src);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvDestroyWindow("src");
	return 0;
}

Tenegrad评价函数

标签:opencv   图像处理   

原文地址:http://blog.csdn.net/u010839382/article/details/41049895

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!