20180918 【非極大值抑制】

一、Nms主要目的

          在物體檢測非極大值抑制應用十分廣泛,主要目的是爲了消除多餘的框,找到最佳的物體檢測的位置。

 

如上圖中:雖然幾個框都檢測到了人臉,但是我不需要這麼多的框,我需要找到一個最能表達人臉的框。下圖汽車檢測也是同樣的原理。

 

二、原理

 非極大值抑制,顧名思義就是把非極大值過濾掉(抑制)。

Canny算子中的非極大值抑制是指沿着梯度方向上進行非極大值的抑制。

在John Canny提出的Canny算子的論文中,非最大值抑制就只是在0、90、45、135四個梯度方向上進行的,每個像素點梯度方向按照相近程度用這四個方向來代替。這種情況下,非最大值抑制所比較的相鄰兩個像素就是:

1) 0:左邊 和 右邊              2)45:右上 和 左下              3)90: 上邊 和 下邊               4)135: 左上 和 右下   

這樣做的好處是簡單, 但是這種簡化的方法無法達到最好的效果, 因爲,自然圖像中的邊緣梯度方向不一定是沿着這四個方向的。因此,就有很大的必要進行插值,找出在一個像素點上最能吻合其所在梯度方向的兩側的像素值。

         然而,實際數字圖像中的像素點是離散的二維矩陣,所以處在真正中心位置C處的梯度方向兩側的點是不一定存在的,或者說是一個亞像素(sub pixel)點,而這個不存在的點, 以及這個點的梯度值就必須通過對其兩側的點進行插值來得到。

         對於上面的代碼,如果|gy|>|gx|,這說明該點的梯度方向更靠近Y軸方向,所以g2和g4則在C的上下,我們可以用下面來說明這兩種情況(方向相同和方向不同):

         上圖中,C表示中心位置點,斜的直線表示梯度方向(非極大值抑制是在梯度方向上的極大值),左邊的一副表示gy與gx的方向相同,而右邊的這幅這表示gy與gx的方向相反(注意原點在左上角),而權重則爲weight = |gx|/|gy|

         同理,我們可以得到|gx|>|gy|的情況,此時說明該點的梯度方向更靠近X軸方向,g2和g4則在水平方向,我們可以用下圖來說明該種情況:

         上圖中,C表示中心位置點,斜的直線表示梯度方向(非極大值抑制是在梯度方向上的極大值),左邊的一副表示gy與gx的方向相同,而右邊的這幅這表示gy與gx的方向相反(注意原點在左上角),而權重則爲weight = |gy|/|gx|,

        通過上面的分析,我們可以瞭解Canny算子中的非極大值抑制之前的準備工作,也即進行必要的插值。插值的原因再囉嗦下:由於在Canny算子中採用的簡化方法來進行邊緣方向的確定,自然圖像中邊緣梯度方向的不一定沿着該四個方向,因此爲了找出在一個像素點上最能吻合其所在梯度方向的兩側的像素值,就必須進行必要的插值; 也由於實際數字圖像中的像素點是離散的二維矩陣,處在真正中心位置C處的梯度方向兩側的點是不一定存在的,或者說是一個亞像素(sub pixel)點,而這個不存在的點, 以及這個點的梯度值就必須通過對其兩側的點進行插值來得到。

        到這裏,canny算子的非極大值抑制部分就介紹完了。最後,需要說明的一點:Canny算子中的非極大值抑制與我們在角點檢測等場景中所說的非極大值抑制有點細微的差別。Canny算子中的非極大值抑制是沿着梯度方向進行的,即是否爲梯度方向上的極值點;而在角點檢測等場景下說的非極大值抑制,則是檢測中心點處的值是否是某一個鄰域內的最大值,是,則保留,否則去除,這種情況下的非極大值抑制比較簡單

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章