附原文鏈接:LSD:a Line Segment Detector
摘 要
LSD是一個線段檢測器,能夠在線性時間內得到亞像素級精度的檢測結果,它無需調試參數就可以適用於任何數字圖像上,並且能夠自我控制錯誤數量的檢測:平均來說,一個圖像中允許一個錯誤檢測。該方法是基於Burns,Hanson和Riseman的方法,並且還采用Desolneux,Moisan和Morel的理論使用了相對(contrario)驗證的方法。本文描述的版本相對於原文提出的版本有了進一步改善。
Introduction
LSD目的是為了檢測圖像中局部直線的邊緣,這就是我們常說的線段,圖像中的邊緣區域就是灰度值(gray level)從黑到白(或從白到黑)變化明顯的圖像區域,因此梯度(gradient)和水平線(level-lines)是圖像中關鍵的概念,如下圖1所示。
本算法首先計算圖像中各個像素點的的level-line角度,從而產生level-line field(是一種單位向量場,並且每個向量都同過基准點且相切於level-line),然后這個level-line field將在一定容忍度τ內具有相同的level-line角度的像素划分成不同的像素連通域,這個連通域稱之為線段支持域(line support regions),如圖2所示。
每一個線段支持域(一組像素點)都是直線分割的候選區域,並且都有個相應的矩形與之一一對應,該矩形的主方向為線段支持域的慣性主軸方向,並且矩形的大小必須覆蓋整個線段支持域,如圖3所示。
每一個矩陣都要經過驗證,將矩形區域內像素點的level-line角度與矩形主方向角度的夾角在容忍度τ內的像素點稱之為對齊點(aligned point),如圖4所示,統計矩形區域內像素點的數量n和內點的數量k的比值,它們之間的比值將作為判斷矩形區域是否為檢測的線段的標准,該判斷標准是基於Desolneux。Moisan和Morel等人提出的一種contrario方法和Helmholtz原則,所謂Helmholtz原則指出不應該對噪聲圖像產生任何感知(或檢測),相應的contrario方法提出在不存在所需結構的情況下定義噪聲或contrario模型H0,然后,如果在contrario模型上預期的事件數量與觀察到的事件數量一樣,則對事件進行驗證,換句話說,結構化事件在contrario模型中被定義為稀少。
對於線段來說,我們對對齊點(aligned point)的數量感興趣,我們考慮到contrario模型中的線段具有與觀察到的線段一樣多或更多的對齊點(aligned point),給定一個圖像i和矩形r,我們記作k(r,i)為矩形r中對齊點的個數,n(r)是矩形r中像素的總個數,那么我們期望下式成立:
其中表示被考慮矩陣的總數,
表示一個矩形對應的噪聲模型中對齊點數量不小於實際模型中對齊點數量的概率,I是H0對應的的隨機噪聲圖像,其固定了對齊點k(r,I)的分布,該分布僅取決於與level-line field相對應的I的分布,因此,H0是用於圖像梯度方向的噪聲模型,而不是用於圖像的噪聲模型。k(r,I)中I不對應於圖像而是對應於H0的level-line field,但是這並不影響k(r,I)僅僅取決於梯度方向。用於線段檢測的contrario模型H0被定義為滿足以下特性的level-line field的隨機模型:
由獨立隨機變量組成。
-
是在[0,2π]上服從均勻分布。
其中是像素j的level-line角度,在假設H0下,contrario模型上的像素是對齊點的概率為:
,並且由於隨機變量LLA(j)的獨立性,k(r,I)遵循二項式分布,於是矩形對應的噪聲模型中對齊點數量不小於實際模型中對齊點數量的概率為:
其中是二項分布的尾部:
測試數對應於可以以固定精度顯示對齊的矩形總數,這里要注意的是矩形是定向的,這意味着其起點和終點的順序不是任意的:起始編碼那一側較暗,因此,從A點到B點的矩形與從B點到A點的矩形是不同的,更進一步詳盡的選擇是采用所有以圖像像素開始和結束的矩形。在一個
的圖像中可以提供
個不同的矩陣,而且矩形的寬度大小為
,如下圖5所示。
因此所有可能的矩形個數為,p值的初始值設置為
,考慮到后續對於
值還有其他的測試值而不僅僅是
,設為
個,因此測試矩形總數
為:
,最終我們定義矩形r在圖像i中的誤檢個數(NFA)為:
設置一個NFA的閾值,如果一個矩形滿足
,那么就可以將其保留為一個直線段檢測結果。
Algorithm
本文中的LSD算法的輸入為一張灰度值圖像,輸出為一系列的檢測到的線段(矩形),偽算法如下圖所示。
- 以默認 s=0.8的尺度對輸入圖像進行高斯下采樣。
- 計算每一個點的梯度值以及level-line方向(level-line orientation)。
- 根據梯度值對所有點進行偽排序(pseudo-ordered),建立狀態列表,所有點設置為UNUSED。
- 將梯度值小於ρ的點狀態表中相應位置設置為USED。
- 取出列表中梯度最大(偽排列的首位)的點作為種子點(seed),狀態列表中設為USED。
do:- 以seed為起點,搜索周圍UNUSED並且方向在閾值[ -t, t]范圍內的點,狀態改為USED。
- 生成包含所有滿足點的矩形R。
- 判斷對齊點(aligned point)密度是否滿足閾值D,若不滿足,截斷(cut)R變為多個矩形框,直至滿足。
- 計算NFA。
- 改變R使NFA的值更小直至NFA <= ε ,R加入輸出列表。
圖像尺寸縮放(Image Scaling)
本文中LSD算法的第一步是將輸入圖像的尺度縮小至原來的80%,這種尺度縮小的目的是為了減弱甚至消除圖像中的鋸齒效應(staircase effect)。將圖像進行模糊操作也可以帶來同樣的效果,但是容易檢測到圖像中的白噪聲(white noise)而產生誤檢。圖6顯示了兩張不同角度的帶有離散邊緣的圖像,這兩張圖像都有鋸齒效應。在原始尺度下使用LSD算法提取線段,左圖提取出四根水平線段而不是一整段,右圖則沒有提取出任何線段。這都不是我們想要的結果。
圖7中顯示了將這兩張圖像縮放至原來的80%后使用LSD算法的結果,從圖中可知,都能提取到邊緣並且具有正確的方向(盡管左圖中提取的線段是斷裂的(fragmented))。
將尺度縮小至原來的80%能夠有效的解決鋸齒效應(將尺度縮小至80%意味着X軸和Y軸都要縮小至原來的80%,因此圖像中像素的數量將減小至原來的64%)。本文中的圖像尺度縮放是通過高斯降采樣(Guassian sub-sampling)進行的:圖像首先通過高斯核函數(Guassian Kernel)進行濾波從而避免鋸齒現象(aliasing),然后進行降采樣。高斯核函數的標准差(standard deviation)由σ = Σ/S 決定,這里S 是縮放因子,這里是0.8, Σ的值設為0.6,能夠很好的避免鋸齒效應同時避免圖像模糊(image blurring)。
梯度計算(Gradient Computation)
圖像的梯度是由下圖中的2x2的模板(mask)作用於每個點的像素計算到的:
其中i(x, y)代表着坐標為(x, y)的像素點的灰度值,圖像的梯度由下列公式計算得到:
level-line角度由以下公式計算得到:
梯度的幅值(magnitude)由以下公式計算得到:
本算法中選用最小尺寸的模板是為了盡可能的減少梯度計算過程中的彼此依賴。圖像的梯度和level-line角度設定(encoder)了邊緣的方向,即為從黑到白的轉換。值得注意的是,從黑到白和從白到黑的轉換是不一樣的,兩者在梯度和level-line角度都相差了180°。這就意味着LSD算法提取的線段是有方向的並且起點和終點不是隨意的(arbitrary)。例如,如果將圖像的灰度值反轉(revert),那么LSD算法提取出來的線段是一樣的,但是線段上的起點和終點將會交換位置 。值得注意的是,本算法計算的圖像的梯度值不是像素點(x, y)處的,而是(x+0.5, y+0.5)處的。這個半像素的偏移(offset)會加到輸出矩形的坐標中去,從而得到相應的結果。
梯度偽排序(Gradient Pseudo-Ordering)
LSD算法是一種貪婪(greedy)算法,像素處理的順序會對結果產生一定的影響。邊緣的像素點往往具有高的梯度值,因此線段的搜索通常從最高的梯度值開始。排序算法通常需要O(n log n)的時間復雜度,然而一個簡單的像素梯度偽排序算法只要求O(n)的線性時間復雜度。為了實現這個目標,我們將像素梯度幅值從0至圖像中最大的幅值均勻地分成1024個等級(bin),因此圖像中的像素點根據他們的梯度值分成了1024個等級。LSD算法首先使用最大梯度值等級中的像素作為種子像素,然后從第二大梯度值等級的像素中選取種子像素,以此內推直至選完所有的等級。當灰度值范圍為[0,255]時,將梯度幅分成1024等分完全夠用。
梯度閾值(Gradient Threshold)
小梯度值的像素點一般出現在平滑區域或者是梯度變化緩慢的區域。同時,在梯度計算的過程中量化這些點的值會造成很大的誤差。在LSD算法中,梯度值小於閾值ρ的像素不能用於線段支持域(line-support regions)和矩形的構建。假定量化誤差為n和存在理想的圖像i,我們可以得到:
根據圖8,我們可以得到:
其中q 是|∇n|的界限(bound)。利用這個准則我們將角度誤差大於角度容忍度τ 剔除。假設|角度誤差|≤ τ,我們可以得到:,梯度閾值ρ由q和τ 決定,其中q是梯度值計算過程中量化效應產生的可能誤差,τ是區域增長算法中用到的角度容忍度。根據經驗,我們將q設為2。
區域增長(Region Growing)
線段支持域是通過合並相同方向的level-line實現的,依賴一種區域增長算法。通過搜索鄰居8點中的未使用像素點來確定是否加去線段支持域中,當level-line角度和區域角度θregion 小於角度容忍度τ時將該level-line添加到線段支持區域中。初始的區域角度是由種子像素的level-line角度確定,然后在區域中每增加一個像素點都會更新一次區域角度,有下列公式確定:
區域增長算法如下圖所示:
角度容忍度設為22.5度時最為合理,在該容忍度范圍內的像素點都會加入到線段支持域中,他們很大程度上和區域的方向保持一致。如下圖所示,實驗發現,容忍度為22.5是個較好的參數。
矩形近似(Rectangular Approximation)
一個線段對應一個矩形,在評估線段支持域前需要找到與之對應的矩形。將線段支持域看成一個剛體,像素點的梯度值作為該點的質量。矩形的中心為線段支持域的質心,矩形的主方向為線段支持域的第一慣性軸方向。矩形的長度和寬度為包含整個線段支持域的最小值。矩陣的中心如下表示:
這里,G(j)是像素j的梯度幅值,下標j用於遍歷矩形區域內所有的像素,矩形的主方向被設置為矩陣的最小特征值對應的特征向量的角度:
NFA計算(NFA Computation)
NFA:the number of false alarms。The validation step is based on the a contrario approach and the Helmholtz principle proposed by Desolneux。the Helmholtz principle:在完美噪聲圖像圖像中不應該檢測到目標。 contrario approach:一個不會檢測到目標的噪聲圖像。對於本課題,contrario model是一個像素值為level-line angle的圖像。其level-line angle隨機分解為獨立且服從平均分布於[0-2*PI]。這里用NFA(Number of False Alarms)來評判觀測圖像中某個候選矩形少於contrario model中相同位置矩形里內點的數量的概率,NFA越大,表明當前矩形與contrario model中相同位置越相似,相反的,當前矩形越有可能是“真正的目標”。
其中:
NFA = N * Ph0[ k(r,I) >= k(r,i) ]
上式中,N為當前大小(m*n)圖像中直線(矩形框)的數量。在m*n的圖像中直線的起點和終點分別有m*n種選擇,所以一共有(m*n)*(m*n)種起點和終點搭配。線段的寬度為[0,m*n ^0.5]。因此在m*n大小的圖像中有(m*n)^2.5 種不同直線。N=(m*n)^2.5。k(r,I) 為contrario model ,I 中 r 矩形里aligned pt的數量。k(r,i) 為observe img,i 中 r 矩形里aligned pt的數量。根據contrario model的建立規則,每個像素都服從值域為[0,2*PI]的二項分布。
設k(r,i)=k。
其中:
角度正負容忍誤差為t,總容忍誤差為2t。那么在contrario model中某個點為aligned pt的概率為 p=2*t / 2*Pi = t / PI。那么,在 I 中的 r 矩形里,總像素個數為 n。I 中的 r 矩形里aligned pt個數k(r,I)大於等於k的話,可選擇的值為k(r,i)、k(r,i)+1、k(r,i)......n。概率為: ∑ p^i * (1-p)^(n-i) ,i=k,k+1,k+2……n。
因此:
NFA = (m*n)^2.5 * ∑ p^i * (1-p)^(n-i) ,i=k,k+1,k+2……n
如果NFA的值很大,認為當前事件出現在contrario model的概率很大,將其認為是背景中的一部分。相反的,認為目標是相對突出(rare)的,是一個合適的“直線”。即:NFA <= ε ε-meaningful rectangles :E(ho)[ ∑NFA(r) <= ε ] <= ε , r∈ R。R為圖像中所有直線的集合。E為期望運算。ho為contrario model。根據論文,ε =1。
對齊點密度(Aligned Points Density)
如上圖所示,因為t的存在且有正負號容忍范圍,容易出現圖中線段支持域增長不合理,此時應將矩形截斷為兩個更小的矩形更為合適。若如圖分割的區域包含的直線形成的角為鈍角,本次操作只留下包含種子的一段,舍棄另一段。舍棄的點重置為UNUSED。d = k / n。k為對齊點個數,n為R的length*width。若d > D,accepted。否則,需要將矩形截斷,在這里設置D=0.7。文章認為這個數字既能保證同一個矩形中的類內點屬性相近,也能保證矩形不會被過分的分割為小的矩形。若沒滿足d > D 分割方法分為“縮小角度容忍閾值”與“縮小區域半徑”的方法。縮小角度容忍閾值:簡單的將t值縮小,再次從當前R的seed開始搜尋。如果這一步仍為滿足d > D,將逐步舍棄離seed較遠的點,直至滿足不等式未知。類內點的計算將會解決曲線因為t的存在而誤識別為直線的狀況。
矩形改進(Rectangle Improvement)
如果當前的R仍舊不能滿足NFA,以下的方法將對其進行改進。考慮到在有些情況下,刪除line-support region中的一個點會減少R的 length-1個點(想象為對角線)。對不滿足NFA的R,采取以下策略:
- 減小p=p/2。
- 短邊減少一行。
- 長邊減少一行。
- 長邊減少另一行。
- 減小p=p/2 直至滿足NFA或R過小被拒或p為原來的1/32。
參考文章
1.直線段檢測算法(LSD:a Line Segment Detector)