斑點檢測(LoG,DoG)(下)
上篇文章斑點檢測(LoG,DoG)(上)介紹了基於二階導數過零點的邊緣檢測方法,現在我們要探討的是斑點檢測。在邊緣檢測中,尋找的是二階導數的零點,可是在斑點檢測中尋找的是極值點,這是為什么呢?而且在使用二階導數尋找斑點時不僅在圖像上尋找極值點,還要求在尺度空間上也是極值點,又是為什么呢?還有為什么DoG是LoG的簡化版本呢??
這篇文章主要內容就是回答這三個問題。
From edges to blobs
對於階躍信號,其二階導數在對應躍變得位置會產生一個波,該波的過零點正對應着待檢測的邊緣位置。

而所謂的斑點區域就是兩條邊形成的中間區域,如下圖中,對於藍色的目標區域,紅色的橢圓就是在檢測邊緣,黑色的橢圓就是在檢測斑點區域。

那么邊緣檢測到斑點檢測的過程對二階導數有什么影響呢?

這個示意圖中上一行從左到右表示的是原始矩形脈沖信號,脈沖信號的周期越來越短,而下一行則表示對應周期在相同尺度下的LoG結果。可以發現總的LoG曲線其實是兩條邊界上產生的LoG函數的疊加,當兩條邊界足夠小時,在該尺度脈沖下就被作為了blob,這時候LoG曲線的極值就對應着blob的中心。
所以邊緣檢測對應的是LoG的過零點,而斑點檢測對應的是LoG的極值點。
這里我們可以發現判斷是不是blob時,尺度非常重要,只有尺度大於一定值得時候blob才可以通過LoG的極值判定。
那么尺度該如何選擇呢?
尺度的選擇
先來看看同一個階躍信號在不同尺度下的響應

可以發現隨着尺度的不斷增大,LoG曲線由雙波谷逐漸融合成單波谷,但是響應的幅值越來越弱。這是因為,隨着尺度的增大,LoG算子的最大幅度逐漸減小,導致響應也隨着尺度的增大而減小。
這種情況我們沒法知道選定的尺度是否合適,進而不知道這個尺度下找到的極值點是不是對應着blob的中心點,萬一是邊緣產生波的極值點怎么辦!所以我們這時候應該對進行LoG算在進行尺度的歸一化。
下圖給出了階躍信號的一階Gaussian濾波曲線

可以發現對於穩定信號,響應的最大幅值是和成正比的,那么為了消除尺度的影響,可以對一階高斯濾波算子乘上個
,那么對於不同的尺度,其響應的強度就是相同的了。這里可以這么理解,在0點處積分結果為

是的函數表示與尺度有關,乘上一個
之后就與尺度無關了,稱為尺度的歸一化。
而LoG算子是Gaussian 濾波的二階導數,所以應該乘上個做尺度歸一化。
再來看看矩形脈沖在不同尺度經過尺度歸一化后的響應

可以發現當尺度等於脈沖寬度的一半的時候,不僅極值對應着blob的中心位置,而且這時候的響應強度比其他尺度響應強度都強。
那么我們在檢測blob時就可以使用不同的尺度計算HoG響應,選擇產生最強響應的尺度,在該尺度上對應的極值就是blob的中心位置了。
對於不同尺寸的blob,理想的尺度應該是多少呢?
理論表明,對於一個圓形blob,當二維LoG算子的零點值曲線和目標圓形邊緣重合時取得最強響應。
下圖是LoG剖面示意

所以由LoG算子的目標式可得最優尺寸為
.
在使用LoG算子進行Blob檢測時,首先在不同尺寸上對圖像進行LoG,然后檢測在尺度空間和圖像空間都是極值的點,就是blob區域的中心點。

LoG to DoG
為什么DoG可以近似LoG使用呢?
先來看看歸一化之后的LoG算子(該過程將高斯函數帶入化簡可得)

而高斯差分算子

所以

因為k-1是常量不影響函數極值點,所以檢測歸一化的LoG在尺度空間的極值,即近似於檢測DoG空間的極值。
DoG進行Blob檢測流程
首先使用不同尺度的高斯算子對圖像進行平滑
其次計算相鄰尺度下平滑圖像的差分圖像(DoG空間)
最后在DoG空間尋找極值點