// 图像平均梯度
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.youkuaiyun.com/windydreams/article/details/8110112
本文详细介绍了图像平均梯度计算方法,包括水平和垂直梯度的计算、梯度矩阵的构造及平均梯度值的求解过程。通过使用Mat类进行图像处理,展示了如何利用内核进行卷积操作来获取图像的梯度信息。
2967

被折叠的 条评论
为什么被折叠?



