SIFT特征提取中用差分代替求偏导

来源:互联网 发布:ppt数据图表怎么做 编辑:程序博客网 时间:2024/06/13 20:50

1. 一阶差分:

 

2. 二阶偏导数的推导和近似:

 

3. 上式以点(i+1,j)为中心,用i代换i+1可得以(i,j)为中心的二阶偏导数则有:

 

4. 同理:

 

5. 进而可推导:

 

6. 这样我们就可以很好的运用其他的一阶偏导的定义,如SIFT特征OpenCV实现版本中的一阶以及二阶偏导:

 

[cpp] view plaincopy
  1.   
  2. static CvMat* deriv_3D( IplImage*** dog_pyr, int octv, int intvl, int r, int  
  3.  
  4.     CvMat* dI;  
  5.     double dx, dy, ds;  
  6.   
  7.     dx pixval32f( dog_pyr[octv][intvl], r, c+1  
  8.         pixval32f( dog_pyr[octv][intvl], r, c-1 2.0;  
  9.     dy pixval32f( dog_pyr[octv][intvl], r+1,  
  10.         pixval32f( dog_pyr[octv][intvl], r-1, 2.0;  
  11.     ds pixval32f( dog_pyr[octv][intvl+1], r,  
  12.         pixval32f( dog_pyr[octv][intvl-1], r, 2.0;  
  13.   
  14.     dI cvCreateMat( 3, 1, CV_64FC1 );  
  15.     cvmSet( dI, 0, 0, dx );  
  16.     cvmSet( dI, 1, 0, dy );  
  17.     cvmSet( dI, 2, 0, ds );  
  18.   
  19.     return dI;  
  20.  
  21.   
  22.   
  23.   
  24.   
  25. static CvMat* hessian_3D( IplImage*** dog_pyr, int octv, int intvl, int r, int  
  26.  
  27.     CvMat* H;  
  28.     double v, dxx, dyy, dss, dxy, dxs, dys;  
  29.   
  30.     pixval32f( dog_pyr[octv][intvl], r, );  
  31.     dxx pixval32f( dog_pyr[octv][intvl], r, c+1   
  32.             pixval32f( dog_pyr[octv][intvl], r, c-1 );  
  33.     dyy pixval32f( dog_pyr[octv][intvl], r+1,  
  34.             pixval32f( dog_pyr[octv][intvl], r-1, );  
  35.     dss pixval32f( dog_pyr[octv][intvl+1], r,  
  36.             pixval32f( dog_pyr[octv][intvl-1], r, );  
  37.     dxy pixval32f( dog_pyr[octv][intvl], r+1, c+1  
  38.             pixval32f( dog_pyr[octv][intvl], r+1, c-1  
  39.             pixval32f( dog_pyr[octv][intvl], r-1, c+1  
  40.             pixval32f( dog_pyr[octv][intvl], r-1, c-1 4.0;  
  41.     dxs pixval32f( dog_pyr[octv][intvl+1], r, c+1  
  42.             pixval32f( dog_pyr[octv][intvl+1], r, c-1  
  43.             pixval32f( dog_pyr[octv][intvl-1], r, c+1  
  44.             pixval32f( dog_pyr[octv][intvl-1], r, c-1 4.0;  
  45.     dys pixval32f( dog_pyr[octv][intvl+1], r+1,  
  46.             pixval32f( dog_pyr[octv][intvl+1], r-1,  
  47.             pixval32f( dog_pyr[octv][intvl-1], r+1,  
  48.             pixval32f( dog_pyr[octv][intvl-1], r-1, 4.0;  
  49.   
  50.     cvCreateMat( 3, 3, CV_64FC1 );  
  51.     cvmSet( H, 0, 0, dxx );  
  52.     cvmSet( H, 0, 1, dxy );  
  53.     cvmSet( H, 0, 2, dxs );  
  54.     cvmSet( H, 1, 0, dxy );  
  55.     cvmSet( H, 1, 1, dyy );  
  56.     cvmSet( H, 1, 2, dys );  
  57.     cvmSet( H, 2, 0, dxs );  
  58.     cvmSet( H, 2, 1, dys );  
  59.     cvmSet( H, 2, 2, dss );  
  60.   
  61.     return H;  
  62.  
  63. 本人感觉求二阶偏导的代码有问题,与公式不符,希望有看到的大神指导一下
0 0
原创粉丝点击