1. 程式人生 > >論文:LSD-線段提取算法

論文:LSD-線段提取算法

mat use 滿足 detect 算法的輸入 狀況 公式 小尺寸 ext

前言

參考資料:

論文主頁:LSD: a Line Segment Detector Rafael Grompone von Gioi, Jérémie Jakubowicz, Jean-Michel Morel, Gregory Randall

博客:基於LSD的直線提取算法 by tianwaifeimao

博客:線特征 by essica&jie

致謝

摘要

  本文中的LSD算法是一種線段(line segment)檢測算法,能夠在線性時間內得到亞像素級精度的檢測結果。它無需調試參數就可以適用於任何數字圖像上,並且能夠自行控制誤檢數量。LSD是一種局部提取直線的算法,速度比Hough要快。但是有局部算法的缺點:

1.對於直線相交情況,因為設置了每個點是否USED,因此每個點只能屬於一條直線,若有相交必有至少一條直線被割裂為兩條。又因為其基於梯度,直線交點梯度值往往又較小(不被檢測為邊緣點),因此很有可能相交的兩條直線在交點處被割裂為四條線段。

2.由於局部檢測算法自增長的特點,對於長線段被遮擋、局部模糊等原因經常割裂為多條直線。這些缺點在Hough變換中不存在。

簡介

  本文中的LSD算法的目的是檢測圖像中的局部直線邊緣,邊緣是灰度值(gray level)從黑到白(或從白到黑)變化明顯的圖像區域。因此,圖像的gradient(梯度)level-lines是本文中的兩個重要概念,如圖1所示。

技術分享圖片

  本算法首先計算圖像中各個像素點的的level-line角度,從而產生level-line場(一種單位向量場,並且每個向量都同過基準點且相切於level-line)。然後,這個level-line場將在一定容忍角度τ內具有相同的level-line角度的像素劃分成不同的像素連通域,這個連通域稱之為線段支持域(line support regions),如圖2所示。

技術分享圖片

  每一個線段支持域都是直線分割的候選區域,並且有個相應的矩形與之一一對應。該矩形的主方向為線段支持域的慣性主軸方向,並且矩形的大小必須覆蓋整個線段支持域,如圖3所示。

技術分享圖片

  將矩形區域內像素點的level-line角度與矩形主方向角度的夾角在容忍角度

τ內的像素點稱之為內點(aligned point),如圖4所示。統計矩形區域內像素點的數量n和內點的數量k的比值,它們之間的比值將作為判斷矩形區域是否為檢測的線段的標準,該判斷標準是基於一種contrario 方法 和 Helmholtz原則,在本文中我們關心的是矩形域中內點的數量。

技術分享圖片

算法

  本文中的LSD算法的輸入為一張灰度值圖像,輸出為一系列的檢測到的線段(矩形),偽算法如下圖所示。

技術分享圖片

1.以默認 s=0.8的尺度對輸入圖像進行高斯下采樣。

2.計算每一個點的梯度值以及level-line方向(level-line orientation)。

3.根據梯度值對所有點進行偽排序(pseudo-ordered),建立狀態列表,所有點設置為UNUSED。

4.將梯度值小於ρ的點狀態表中相應位置設置為USED。

5.取出列表中梯度最大(偽排列的首位)的點作為種子點(seed),狀態列表中設為USED。

do:

a.以seed為起點,搜索周圍UNUSED並且方向在閾值[ -t, t]範圍內的點,狀態改為USED。

b.生成包含所有滿足點的矩形R。

c.判斷內點(aligned pt)密度是否滿足閾值D,若不滿足,截斷(cut)R變為多個矩形框,直至滿足。

d.計算NFA。

e.改變R使NFA的值更小直至NFA <= ε ,R加入輸出列表。

1、圖像尺度縮放(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.6,能夠很好的避免鋸齒效應同時避免圖像模糊(image blurring)

2、梯度計算(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)會加到輸出矩形的坐標中去,從而得到相應的結果。

3、梯度偽排序(Gradient Pseudo-Ordering)

  LSD算法是一種貪婪(greedy)算法,像素處理的順序會對結果產生一定的影響。邊緣的像素點往往具有高的梯度值,因此線段的搜索通常從最高的梯度值開始。

  排序算法通常需要O(n log n)的時間復雜度,然而一個簡單的像素梯度偽排序算法只要求O(n)的線性時間復雜度。為了實現這個目標,我們將像素梯度幅值從0至圖像中最大的幅值均勻地分成1024個等級(bin),因此圖像中的像素點根據他們的梯度值分成了1024個等級。LSD算法首先使用最大梯度值等級中的像素作為種子像素,然後從第二大梯度值等級的像素中選取種子像素,以此內推直至選完所有的等級。當灰度值範圍為[0,255]時,將梯度幅分成1024等分完全夠用。

4、梯度閾值(Gradient Threshold)

  小梯度值的像素點一般出現在平滑區域或者是梯度變化緩慢的區域。同時,在梯度計算的過程中量化這些點的值會造成很大的誤差。在LSD算法中,梯度值小於閾值ρ的像素不能用於線段支持域(line-support regions)和矩形的構建。

  假定量化誤差為n和存在理想的圖像i,我們可以得到:

技術分享圖片

  根據圖8,我們可以得到:

技術分享圖片

技術分享圖片

  其中q 是|∇n|的界限(bound)。利用這個準則我們將角度誤差大於角度容忍度τ 剔除。假設|角度誤差|τ,我們可以得到:

技術分享圖片

  梯度閾值ρ由qτ 決定,其中q是梯度值計算過程中量化效應產生的可能誤差,τ是區域增長算法中用到的角度容忍度。根據經驗,我們將q設為2.

5、區域增長(Region Growing)

  線段支持域是通過合並相同方向的level-line實現的,依賴一種區域增長算法。通過搜索鄰居8點中的未使用像素點來確定是否加去線段支持域中,當level-line角度和區域角度θregion 小於角度容忍度τ時將該level-line添加到線段支持區域中。初始的區域角度是由種子像素的level-line角度確定,然後在區域中每增加一個像素點都會更新一次區域角度,有下列公式確定:

技術分享圖片

  區域增長偽算法如下圖所示:

技術分享圖片

  輸入:level-line場LLA,種子像素點P,角度容忍度τ和每個像素的狀態變量。

  輸出:一組像素區域

  角度容忍度設為22.5度時最為合理,在該容忍度範圍內的像素點都會加入到線段支持域中,他們很大程度上和區域的方向保持一致。如下圖所示,實驗發現,容忍度為22.5是個較好的參數。

技術分享圖片

6、矩形近似(Rectangular Approximation)

  一個線段對應一個矩形,在評估線段支持域前需要找到與之對應的矩形。將線段支持域看成一個剛體,像素點的梯度值作為該點的質量。矩形的中心為線段支持域的質心,矩形的主方向為線段支持域的第一慣性軸方向。矩形的長度和寬度為包含整個線段支持域的最小值。

技術分享圖片

7、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

8、內點密度(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的存在而誤識別為直線的狀況。

9、矩形改進(Rectangle Improvement)

  如果當前的R仍舊不能滿足NFA,以下的方法將對其進行改進。考慮到在有些情況下,刪除line-support region中的一個點會減少R的 length-1個點(想象為對角線)。對不滿足NFA的R,采取以下策略:

1.減小p=p/2

2.短邊減少一行

3.長邊減少一行

4.長邊減少另一行

5.減小p=p/2 直至滿足NFA或R過小被拒或p為原來的1/32。

論文:LSD-線段提取算法