RANSAC算法中的数据归一化研究

1.什么是数据归一化?

归一化是一种无量纲处理手段,使物理系统数值的绝对值变成某种相对值关系。简化计算,缩小量值的有效办法。

2.数据归一化的必要性

在RANSAC算法中,计算2D homography过程中,需要依赖图像的坐标系,那么图像的相似变换T就不能够保证不变性,归一化的方法能够消除坐标系的影响

3.数据归一化的好处

RANSAC中:能够保证即便是不同坐标系的两幅图像也能够有着相同的平均梯度

4.数据归一化如何实现?

1)原理:

①将点转换到重心,使得重心作为起点;

②将点进行尺度变换,使得点到重心的距离为原来的根号2

2)实现:

①RANSAC算法中的实现:

本文中的RANSAC算法的实现来自于http://download.csdn.net/detail/beigua321/2843908

如果您有需要可以从此地址下载。

  1. //  
  2. // function : DataNormalization  
  3. // usage : DataNormalization(numOfx, x, T);  
  4. // ------------------------------------------------------  
  5. // This function normalizes x and returns the similarity  
  6. // transform, T.  
  7. // The centroid of x will be transformed into (0,0).  
  8. // The average distance of normalized x will be sqrt(2).根号2  
  9. // 数据归一化  
  10. void DataNormalization(int numOfPositions, float positions[][2], CvMat *T)  
  11. {  
  12.     int i;  
  13.     float sumI = 0, sumJ = 0, meanI = 0, meanJ = 0;  
  14.     float squareDist = 0, sumDist = 0, meanDist = 0;  
  15.     float scale = 0;  
  16.     float x, y, xx, yy, ww;  
  17.     // calculate the centroid  
  18.     //计算重心  
  19.     for(i = 0; i < numOfPositions; i++){  
  20.         sumI += positions[i][0];  
  21.         sumJ += positions[i][1];  
  22.     }  
  23.     meanI = sumI / numOfPositions;//重心点y坐标  
  24.     meanJ = sumJ / numOfPositions;//重心点x坐标  
  25.     // calculate the mean distance  
  26.     //计算平均距离  
  27.     //通过对每一个点到重心的距离求和然后求出平均距离  
  28.     for(i = 0; i < numOfPositions; i++){  
  29.         squareDist = pow(positions[i][0] - meanI, 2)  
  30.             + pow(positions[i][1] - meanJ, 2);  
  31.         sumDist += pow((double)squareDist, 0.5);  
  32.     }  
  33.     meanDist = sumDist / numOfPositions;  
  34.     // set the similarity transform  
  35.     //计算相似变换,1/平均距离=尺度  
  36.     scale = pow(1, 0.5) / meanDist;  
  37.     float t[9] = {scale, 0, -scale * meanI,  
  38.         0, scale, -scale * meanJ,  
  39.         0, 0, 1};  
  40.     Array2CvMat(t, T, 3, 3);  
  41.     // data normalization  
  42.     //数据归一化,通过计算  
  43.     for(i = 0; i < numOfPositions; i++){  
  44.         x = positions[i][0];  
  45.         y = positions[i][1];  
  46.         xx = t[0] * x + t[1] * y + t[2];  
  47.         yy = t[3] * x + t[4] * y + t[5];  
  48.         ww = t[6] * x + t[7] * y + t[8];  
  49.         xx = xx / ww;  
  50.         yy = yy / ww;  
  51.         positions[i][0] = xx;  
  52.         positions[i][1] = yy;  
  53.     }  
  54. }  
上述代码中,在计算相似变换时,实际的实现并没有使得点到重心的距离为原来的根号2,而是为1,我不知道是为什么

另外,在数据归一化计算的时候,其计算步骤也不是很明白,在参看了Rob Hess实现SIFT算法中的归一化特征描述子部分也发现了同样的问题,即,实际的实现并没有使得点到重心的距离为原来的根号2,而是为1

②SIFT算法中特征描述子的归一化

  1. /* 
  2. 归一化特征的描述子 
  3. Normalizes a feature's descriptor vector to unitl length 
  4.  
  5. @param feat feature 
  6. */  
  7. static void normalize_descr( struct feature* feat )  
  8. {  
  9.     double cur, len_inv, len_sq = 0.0;  
  10.     int i, d = feat->d;//为描述子长度128维  
  11.       
  12.   
  13.     //如何进行归一化特征描述子来降低对光照的影响  
  14.     //主要就是将每一个特征的平方求和,然后开方,然后去其倒数,然后乘以每一个特征描述子的梯度值,这样就得到了归一化的特征描述子  
  15.     for( i = 0; i < d; i++ )  
  16.     {  
  17.         cur = feat->descr[i];  
  18.         len_sq += cur*cur;  
  19.     }  
  20.     //尺度  
  21.     len_inv = 1.0 / sqrt( len_sq );  
  22.     //将每一个描述子乘以尺度即可归一化  
  23.     for( i = 0; i < d; i++ )  
  24.         feat->descr[i] *= len_inv;  
  25. }  

上述代码中的尺度计算和RANSAC的尺度计算是一样的,这的确是个问题,希望知道的人能够解答。

关于具体的代码解释,这里在代码中给出了详尽的注释。

关于数据归一化的详细介绍可以参看:Multiple View Geometry in Computer Vision Senond Edition  Richard Hartley / Andrew Zisserman Cambridge University Press

本文转自http://blog.csdn.net/xizero00/article/details/7454173

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值