Tenengrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数。
在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值。
Tenengrad函数使用Sobel算子提取水平和垂直方向的梯度值。
设Sobel卷积核为:
Gx:? ? ? ? ? ? ? ? ? ? ? ?Gy:
? ? ? ? ? ?
,则图像在点处的梯度:
?
定义该图像的Tenengrad值为:
其中为图像中像素总数。
#include <QCoreApplication>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
double Tenegrad(Mat *src){
// assert (src->nChannels() == 8 )
int row = src->rows;
int col = src->cols;
double S = 0;
for(int i = 1 ;i < row-1 ; i++)
{
int Sx,Sy;
uchar* predata= src->ptr<uchar>(i-1);
uchar* curdata= src->ptr<uchar>(i);
uchar* nexdata= src->ptr<uchar>(i+1);
for(int j = 1 ;j < col-1 ;j++)
{
//*****************************
// i-1,j-1 i-1,j i-1,j+1
// i,j-1 i,j i,j+1
// i+1,j-1 i+1,j i+1,j+1
//Gx =-1,0,1 Gy =1, 2, 1
// -2,0,2 0, 0, 0
// -1,0,1 -1,-2,-1
//*******************************
Sx=nexdata[j+1]+2*curdata[j+1]+predata[j+1]-nexdata[j-1]-2*curdata[j-1]-predata[j-1];
Sy=predata[j+1]+2*predata[j+1]+predata[j+1]-nexdata[j-1]-2*nexdata[j-1]-nexdata[j-1];
S += Sx*Sx + Sy*Sy;
}
}
return S/(row-2)/(col-2);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Mat src = imread("D:/pictures/OIP-C.jpg");
imshow("input",src);
Mat dst;
//resize(src,dst,Size(30,20));
cvtColor(src,dst,COLOR_BGR2GRAY);
//cvtColor(dst,dst,COLOR_BGR2GRAY);
imshow("output",dst);
// int widthstep =
// for(int i = 0 ; i < dst.rows;i++){
// for(int j = 0 ; j < dst.cols;j++){
// cout<< int(dst.at<uchar>(i, j))<<" ";
// }
// cout<<endl;
// }
cout<<Tenegrad(&dst)<<endl;
return a.exec();
}
?
|