分享

canny算子四部曲之二(求梯度)

 jtll521 2012-07-01

梯度求法和sobel之类的算子雷同,甚至更简单,就是一个离散差分,不清楚的童鞋可以百度,一大堆资料呢,从源码也可清晰的看出原理。

  1. // 方向导数,求梯度  
  2. /* 
  3.  *  @parameter sz:     图像大小 
  4.  *  @parameter pGray:    图像灰度值 
  5.  *  @parameter pGradx:  图像x轴梯度 
  6.  *  @parameter pGrady:  图像y轴梯度 
  7.  *  @parameter pMag   :  图像梯度幅值 
  8.  */  
  9.   
  10. void Grad(SIZE sz, LPBYTE pGray,int *pGradX, int *pGradY, int *pMag)  
  11. {  
  12.     LONG y,x;  
  13.   
  14.     //中间变量  
  15.     double dSqt1;  
  16.     double dSqt2;  
  17.   
  18.     //x方向的方向导数  
  19.     for(y=1;y<sz.cy-1;y++)  
  20.     {  
  21.         for(x=1;x<sz.cx-1;x++)  
  22.         {  
  23.             pGradX[y*sz.cx +x] = (int)( pGray[y*sz.cx+x+1]-pGray[y*sz.cx+ x-1]  );  
  24.         }  
  25.     }  
  26.   
  27.     //y方向方向导数  
  28.     for(x=1;x<sz.cx-1;x++)  
  29.     {  
  30.         for(y=1;y<sz.cy-1;y++)  
  31.         {  
  32.             pGradY[y*sz.cx +x] = (int)(pGray[(y+1)*sz.cx +x] - pGray[(y-1)*sz.cx +x]);  
  33.         }  
  34.     }  
  35.   
  36.     //求梯度  
  37.     for(y=0; y<sz.cy; y++)  
  38.     {  
  39.         for(x=0; x<sz.cx; x++)  
  40.         {  
  41.             //二阶范数求梯度  
  42.             dSqt1 = pGradX[y*sz.cx + x]*pGradX[y*sz.cx + x];  
  43.             dSqt2 = pGradY[y*sz.cx + x]*pGradY[y*sz.cx + x];  
  44.             pMag[y*sz.cx+x] = (int)(sqrt(dSqt1+dSqt2)+0.5);//四舍五入  
  45.         }  
  46.     }  
  47. }  

用到的类型

  1. typedef struct {  
  2.     int cy;   
  3.     int cx;  
  4. } SIZE;  
  5.   
  6. typedef unsigned char *LPBYTE;  
  7.   
  8. typedef long LONG;  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多