1. 程式人生 > >20180911影象處理之霍夫變換

20180911影象處理之霍夫變換

原理介紹

霍夫變換在檢測各種形狀的的技術中非常流行,如果你要檢測的形狀可以用數學表示式寫出,你就可以是使用霍夫變換檢測它。及時要檢測的形狀存在一點破壞或者扭曲也可以使用。我們下面就看看如何使用霍夫變換檢測直線。

一條直線可以用數學表示式y = mx + c 或者 = x cos θ + y sinθ 表示。ρ是從原點到直線的垂直距離,θ 是直線的垂線與橫軸順時針方向的夾角(如果你使用的座標系不同方向也可能不同,我是按OpenCV 使用的座標系描述的)。如下圖所示:

                                                                         

所以如果一條線在原點下方經過,θ的值就應該大於0,角度小於180。但是如果從原點上方經過的話,角度不是大於180,也是小於180,但ρ 的值小於0。垂直的線角度為0 度,水平線的角度為90 度。

       讓我們來看看霍夫變換是如何工作的。每一條直線都可以用(ρ; θ) 表示。所以首先建立一個2D 陣列(累加器),初始化累加器,所有的值都為0。行表示ρ,列表示θ。這個陣列的大小決定了最後結果的準確性。如果你希望角度精確到1 度,你就需要180 列。對於ρ,最大值為圖片對角線的距離。所以如果精確度要達到一個畫素的級別,行數就應該與影象對角線的距離相等。

        想象一下我們有一個大小為100x100 的直線位於影象的中央。取直線上的第一個點,我們知道此處的(x,y)值。把x 和y 帶入上邊的方程組,然後遍歷θ 的取值:0,1,2,3,...,180。分別求出與其對應的 的值,這樣我們就得到一系列(ρ; θ) 的數值對,如果這個數值對在累加器中也存在相應的位置,就在這個位置上加1。所以現在累加器中的(50,90)=1。(一個點可能存在與多條直線中,所以對於直線上的每一個點可能是累加器中的多個值同時加1)。

舉例子 :                       

程式設計思路解析:

1.      讀取一幅帶處理二值影象,最好背景為黑色。

2.      取得源畫素資料

3.      根據直線的霍夫變換公式完成霍夫變換,預覽霍夫空間結果

4.       尋找最大霍夫值,設定閾值,反變換到影象RGB值空間(程式難點之一)

5.      越界處理,顯示霍夫變換處理以後的影象