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
在进入我们防区就打