canny算子边缘检测_canny算子非极大值抑制_robert算子(8)

电脑杂谈  发布时间:2017-03-13 22:00:53  来源:网络整理

非递归算法。如下:

  1 void TraceEdge(int w, int h, int nThrLow, IplImage* pResult, int *pMag)  
 2 { 
 3     //对8邻域像素进行查询  
 4     int xNum[8] = {1,1,0,-1,-1,-1,0,1};  
 5     int yNum[8] = {0,1,1,1,0,-1,-1,-1};
 6     int xx=0;
 7     int yy=0;
 8     bool change=true;
 9     while(change)
10     {
11         change=false;
12         for(int k=0;k<8;k++)  
13         {  
14             xx=w+xNum[k];
15             yy=h+yNum[k];
16             //   如果该象素为可能的边界点,又没有处理过  
17             //   并且梯度大于阈值  
18             int curgrayvalue=(uchar)pResult->imageData[xx+yy*pResult->widthStep];
19             int curgrdvalue=pMag[xx+yy*pResult->width];
20             if(curgrayvalue==200&&curgrdvalue>nThrLow)  
21             {  
22                 change=true;
23                 //   把该点设置成为边界点  
24                 pResult->imageData[xx+yy*pResult->widthStep]=255;
25                 h=yy;
26                 w=xx;
27                 break;
28             }  
29         }  
30     }
31 }

View Code

到此,整个算法写完了。打击下信心,整个算法跑起来没问题,但是没有opencv 的cvCanny 一个函数效果好。分析了下原因,一个是梯度算子选的太简单,opencv一般选用的是3*3 sobel。二是边缘连接性还是不够好,出现了很多断的,也就是邻域跟踪算法不够好。希望有高手能改进。

附上代码:

整篇博客参考过网上很多canny算法的总结,在此谢过!


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-37359-8.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...