1. 程式人生 > >8.霍夫變換:線條——基本的霍夫變換演算法、霍夫變換的複雜性、霍夫例子_3

8.霍夫變換:線條——基本的霍夫變換演算法、霍夫變換的複雜性、霍夫例子_3

目錄

基本的霍夫變換演算法

霍夫變換的複雜性

霍夫例子


基本的霍夫變換演算法

說到演算法,我們來看一下:

我們將使用直線的極座標引數化,極座標表示。

還有一種叫Hough累加器(陣列)的東西,它只是用來表示要收集選票的東西。

在這種情況下是二維的,箱子代表不同的 d 值和不同的 \theta 值。

你必須決定的事情是:箱子有多大? 它們有多少個?

所以,如果從 0 到 \pi,也就是0度到180度,如果每一度都是1個箱子,那麼就有180個箱子,

如果你曾經有10度那麼就只有18個,所以你必須決定箱子有多大。

給出這個方程和霍夫累加器,以下這是演算法:

我希望你們能理解我試圖用顏色來編碼,這是基本的霍夫演算法。

1、你將你的累加器速率初始化為零:

2、我們必須有一組邊緣點,對於每一個邊緣點,也就是說,在x,y的每個地方,我們必須知道它是否是一個邊緣點,

或者我們有一個列表。

不知何故,我們知道哪些點是邊緣,事實上,我們如何知道我們知道這一點?

因為我們上次做過,對吧?

所以,你知道如何在MatlabOctave中做這個,或者如果你真的受虐狂的話,你可以用匯編程式碼來寫,。

對於每個邊點x,y,我們要做的是,這裡我用 \theta,從 0 到 180,你知道,應該是1度增量:

好的,解出d,我們用這個方程,因為我們有 x 和 y ,我們有可以解出 d 的:

注意,這裡我沒有限制 d 是正的還是負的,所以它可以是正的,也可以是負的。

3、我必須設定d,θ,我必須增加它的投票。

因此,如果d是負數,那意味著什麼,意味著那個d的箱子,也許我的d的箱子是從-100到100。

如果我有201個箱子,我按1的步長進行,如果我得到 -20,我要加100,那就是80。

d 值進入箱子,所以d值的箱子增加了1。

在完成所有投票之後,你找到 d 和 θ 的值,其中H (d)是最大值:

你想找到這些最大值。順便說一下,Matlab中有一個函式叫Houghpeaks

順便說一下,你不允許使用它,因為你要自己寫最大值值查詢器。

4、不管怎樣,假設你只找到了一個d,直線本身就是d = x cos + y sin:

這就是根據邊緣點找到這些線條的全部內容。

霍夫變換的複雜性

當你做一個演算法的時候,你只需要考慮它的工作效果如何?

很明顯這很有效,因為我告訴過你們。

對於演算法來說更重要的是我們要討論複雜度。

第一個問題很簡單。

空間複雜度是多少? 這就是我需要使用多少記憶體?

先不考慮影象,我需要k到n次方個箱子。

如果每個維度都有k個箱子,k的n次方是箱子的數量。

我們在二維空間中做這個,所以是k的平方。(n表示維度,如果我有100個,大概是10000個。)

這是我們後面要講的內容,新增引數的數量,在這種情況下增加n,在記憶體方面會非常昂貴。

事實上,在你的習題集中,你會嘗試做某事,你會在Matlab中成長,然後你會想出如何修復它。

那麼投票的時間複雜度呢?

嗯,好訊息是投票與邊緣點的數量成線性比例。

你通過你的邊緣點,他們每個投票。投票可能需要一點時間,但它是不變的。

比較一下,假設你試著畫一個圓。

一個圓由三個點定義。

因此,如果你有一些大量的邊緣點,那麼三元組的數量就是那個數字,我們稱之為q。

Q選3是個很大的數,對吧?

然而,如果你做的事情只與q成比例,那麼你的形狀要好得多。

所以這裡的想法是,時間複雜度在你檢測到的特徵點或邊緣點的數量上是恆定的。

霍夫例子

這裡是實現霍夫的基本步驟:

下面讓我們看一些例子,一些玩具例子和一些真實的例子。

這裡我們有一個在左邊的影象的卡通例子裡面有一串點這些點碰巧都在一條線上,這很好。

這是一個無噪聲的Hough例子在真實的宇宙中是沒有的,但是我做了,我這裡有一個。

在左邊,在影象空間中,有一些點都在直線上:

它們躺在一條完美的線上,這就是為什麼你知道這是一個卡通例子,因為這從來沒有真正發生過。

我們右邊的是選票,你在這裡看到的是每個點都在建立一個特定的跟蹤:

你會注意到這些是正弦曲線的一部分。

Okay,這是另一個:

這來自於我之前說過的方程。

最重要的是這裡所有的選票排好隊,這就是我們如何知道這條線的位置:

看到了嗎?

太酷了。

假設我給你們看了一個正方形的圖片。我在上面放了一個邊緣探測器。你希望在霍夫空間看到什麼?

我們看一下,一個正方形有多少條線?

有四條線,好的,你會得到一個Hough累加器陣列,一個看起來像這樣的鍵合物。

這裡有四個峰:

在圖片中很難看到,但是這裡的值比其他地方的值要高得多,你可以看到選票是如何重疊的。

在這裡,你會知道有四條線你可以把它們拉出來。

這是另一個街區的世界場景:

你可以看到這裡有一些邊,這是霍夫陣列,你可以看到到處都是正弦曲線。

順便說一下,這裡有一個非常大的亮點:

這個點是什麼?

這是對應著這條又大又長的邊:

還有其他地方:

這是有道理的,因為還有其他的直線:

但是這個大的亮的是最長的,因為它擁有最多的選票。


——學會編寫自己的程式碼,才能練出真功夫。