1. 程式人生 > >OpenCV 影象平均梯度

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