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

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

5双阈值的选取。

双阈值的选取是按照直方图来选择的,首先把梯度幅值的直方图(扯点题外话:梯度的幅值直方图和角度直方图也是SIFT算子中的一个环节)求出来,选取占直方图总数%多少(自己定,代码中定义70%)所对应的梯度幅值为高阈值,高阈值的一半为低阈值,这只是一种简单策略。也可以采用其他的。

代码如下:

  1 ///////第五步:双阈值的选取
 2 //注意事项  注意是梯度幅值的阈值  
 3 ///////////////////////////////////////////////////////////////// 
 4   int nHist[1024];//直方图
 5   int nEdgeNum;//所有边缘点的数目
 6   int nMaxMag=0;//最大梯度的幅值
 7   for(int k=0;k<1024;k++)
 8   {
 9       nHist[k]=0;
10   }
11   for (int wx=0;wx<nWidth;wx++)
12   {
13       for (int hy=0;hy<nHeight;hy++)
14       {
15           if((uchar)N->imageData[wx+hy*N->widthStep]==200)
16           {
17               int Mindex=M[wx+hy*nWidth];
18               nHist[M[wx+hy*nWidth]]++;//获取了梯度直方图
19               
20           }
21       }
22   }
23   nEdgeNum=0;
24   for (int index=1;index<1024;index++)
25   {
26       if (nHist[index]!=0)
27       {
28           nMaxMag=index;
29       }
30       nEdgeNum+=nHist[index];//经过non-maximum suppression后有多少边缘点像素  
31   }
32 //计算两个阈值 注意是梯度的阈值
33   int nThrHigh;
34   int nThrLow;
35   double dRateHigh=0.7;
36   double dRateLow=0.5;
37   int nHightcount=(int)(dRateHigh*nEdgeNum+0.5);
38   int count=1;
39   nEdgeNum=nHist[1];
40   while((nEdgeNum<=nHightcount)&&(count<nMaxMag-1))
41   {
42       count++;
43       nEdgeNum+=nHist[count];
44   }
45   nThrHigh=count;
46   nThrLow= (int)(nThrHigh*dRateLow+0.5);
47   printf("\n直方图的长度 %d \n  ",nMaxMag);
48   printf("\n梯度的阈值幅值大 %d 小阈值 %d \n  ",nThrHigh,nThrLow);

View Code


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

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

    • 张曼曼
      张曼曼

      在进入我们防区就打

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