opencv图像灰度重心算法

原文:http://blog.csdn.net/moses1213/article/details/44679603

导师交给的项目,其中一步就是求光斑的重心,网上有很多关于重心的代码,大体是利用cvFindContour函数找出图像的轮廓,然后将图像阈值分割,二值化处理。这样处理后图像的灰度值只有0和1两个值,丢失了很多灰度信息,这样找出来的重心实际上是轮廓几何图形的形心,灰度值的影响并没有反应出来。

  下面介绍一下灰度重心法:

  对于亮度不均与的目标,灰度重心法可按目标光强分布求出光强权重质心坐标作为跟踪点,也叫密度质心算法。对于衣服M*N大小的图像f,像素的灰度值凡超过阈值T的均参与重心处理,于是重心坐标为:




Xi表示第i行的坐标,Xj表示第j行的坐标,f(i,j)表示第i行第j列的像素值。

[cpp] view plain copy
  1. CvPoint grayCenter(IplImage* TheImage)  
  2. {  
  3.     //灰度重心法求质心  
  4.     CvPoint Center;  
  5.     int i, j;  
  6.     CvScalar cs = cvSum(TheImage);  
  7.     Center.x = Center.y = 0;  
  8.     double x = 0;  
  9.     double y = 0;  
  10.     for(i = 0;i < TheImage->width;i++)  
  11.     {  
  12.         for(j = 0; j < TheImage->height;j++)  
  13.         {  
  14.             CvScalar s = cvGet2D(TheImage, j,i);  
  15.             x += i*s.val[0]/cs.val[0];  
  16.             y += j*s.val[0]/cs.val[0];  
  17.         }  
  18.     }  
  19.     Center.x = cvRound(x);  
  20.     Center.y = cvRound(y);  
  21.   
  22.     return Center;  

你可能感兴趣的:(opencv,应该看的算法)