1 算法原理算法
非極大值抑制算法(Non-maximum suppression, NMS)抑制不是極大值的元素,搜索局部的極大值。這個局部表明的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。數組
在3領域中,假設一個行向量的長度爲w,從左向右,由第一個到第w個和其3領域中的數值進行比對。函數
(1)狀況1:若是某個i大於i+1而且小於i-1,則其爲一個毫不最大值,同時也就意味着i+1不是一個局部最大值,因此將i移動2個步長,從i+2開始繼續向後進行比較判斷。spa
(2)情形2:若是某個i不知足上述條件(1),則將i+1賦值給i,繼續對新的i進行比對。當比對到最後一個w時,直接將w設置爲局部最大值。算法流程以下圖所示。code
2 3鄰域狀況下NMS函數的實現blog
1 //求解局部最大值 2 //輸入參數a:數組a 3 //輸入參數n:數組的維數 4 int mynms(int a[],int n) 5 { 6 int i = 2; 7 while(i < n){ 8 if((a[i]>a[i+1])||(a[i]= a[i+1])){ 9 if((a[i]>a[i-1])||(a[i]= a[i-1])){ 10 return i; 11 } 12 i = i + 1; 13 } 14 else{ 15 i = i + 2; 16 } 17 } 18 //沒有找到局部最大值,返回-1 19 return -1; 20 }
3 3鄰域狀況下NMS函數的調用示例索引
int main() { //建立數組a int n = 6; int a[n] = {1,6,3,5,4,6}; //求局部最大值的索引值 int index = mynms(a,6); //找到局部最大值時打印出局部最大值 if(index != -1){ printf("第一個局部最大值:\n a[%d] = %d\n",index,a[index]); } return 0; }