OpenCV 影象平均梯度
// 影象平均梯度
double AvG_Gradient(Mat img)
{
// dx = img(i+1,j) - img(i,j);
// dy = img(i,j+1) - img(i,j);
// avg_gradient = sum(sqrt((dx*dx+dy*dy)/2)) /(M*N)
Mat kh = Mat(2,2,CV_64F);
Mat kv = Mat(2,2,CV_64F);
// horizotal kernel
kh.at<double>(0,0) = 0;
kh.at<double>(0,1) = 0;
kh.at<double>(1,0) = 1;
kh.at<double>(1,1) = -1;
// vertical kernel
kv.at<double>(0,0) = 0;
kv.at<double>(0,1) = 1;
kv.at<double>(1,0) = 0;
kv.at<double>(1,1) = -1;
Mat img64f;
img.convertTo(img64f,CV_64F);
// horizontal gradient
Mat h_gradient = conv2(img64f,kh,CONVOLUTION_SAME);
// vertical gradient
Mat v_gradient = conv2(img64f,kv,CONVOLUTION_SAME);
double temp = 0.0;
for(int i=0;i<img.rows;i++)
{
for(int j=0;j<img.cols;j++)
{
double dx = h_gradient.at<double>(i,j);
double dy = v_gradient.at<double>(i,j);
double avg_gradient = sqrt((dx*dx+dy*dy)*0.5);
temp = temp+avg_gradient;
}
}
temp = temp/(img.rows*img.cols);
return temp;
}
// conv2的程式碼參見:http://blog.csdn.net/windydreams/article/details/8110112