1. 程式人生 > >8.霍夫變換:線條——霍夫的效果、噪聲對霍夫的影響、霍夫拓展_5

8.霍夫變換:線條——霍夫的效果、噪聲對霍夫的影響、霍夫拓展_5

目錄

霍夫的效果

噪聲對霍夫的影響

霍夫拓展

本環節結束


霍夫的效果

這裡我將給你們展示一個Hough執行在真實影象上的例子來告訴你們它做得好和做得不好。

這是一張美國足球場的照片:

這是美式足球,你知道,用的球不是圓的。

我們執行一個有味道的邊緣探測器,我們得到這些邊緣,這些是一些有趣的邊緣:

然後我們要做的是通過一個霍夫累加器陣列來執行它:

你可以看到這裡的正弦曲線,有點分散:

但是你可以看到這些,這些方塊都是這些發現的峰值,這是用一些程式碼試圖尋找峰值:

你會注意到它們有很多很接近,對吧?

所以非常接近意味著:它們的角度是相同的,而且它們的位置大致相同。

相同的角度,相同的位置,是的,我的意思是,這是相同角度的線在這裡,這裡,這裡:

即使在這裡,相同的角度,相同的位置:

你會發現附近有峰值。

我給你們看這個峰值影象:

如果我畫出與這些峰中的每一個相聯絡的線,我會看到像這樣的東西。這裡有好訊息和壞訊息。

好訊息:它發現了大量的線段。

壞訊息:你會注意到它也漏掉了一些:

為什麼呢? 這與投票箱中發現的邊的性質有關,這些都是關於如何找到邊緣的細節。

你也會注意到這裡有一條青色的線,這是找到的最長的線段:

現在,應該有人會說:“等一下,這線段是什麼意思?”

在霍夫變換中,當你找到 m 和 b,這是一條無限長的線。這條線可以一直延伸到整個影象。

如果你想找到線段,選了這條線的點,把它們連起來或者把兩個最遠的點連起來。

或者做一些其他的操作沿著這條無限的線執行,看看在這附近有一個邊緣點或者在這附近的任何地方。

所以你必須做一些其他的操作,除了我們剛剛展示的投票為了找到線段。

對你們來說好訊息是,在你們的習題集裡,我只想讓你們找到無限長的直線。

你不必擔心找到影象中實際支援的線段。

噪聲對霍夫的影響

剩下的一些東西。

首先是噪聲對霍夫變換的影響。

所以,在這裡你能看到的是左邊的一個影象我們取了相同的一組卡通點,我們把它們打亂了一點:

我們給它們的位置添加了一些噪聲。

在右邊的影象,你看到的是霍夫的投票。

你會注意到,峰值,不是很精確:

事實上,如果我們有非常非常好的箱子,我們可能會完全錯過那個峰值:

所以,等下我們會講一點關於改變箱子的大小,關於噪音,作為一種使它工作的方法。

但是,會發生的是,少量的噪音會把你撞飛。

順便說一下,你能做的一件很酷的事,如果你想找到這裡的一般峰值,你會怎麼做?

你可以平滑這個影象,對吧?

你可以把它作為影象進行過濾,然後找到峰值。

現在你知道你已經移動了一些峰頂,因為你把它弄模糊了。

但現在你至少找到了峰值,你會說,我要再做一次霍夫變換,但這次我只關注那個區域:

好,所以我要建立一個新的陣列,帶有更精細的箱子,但只有在那裡,如果d或θ在那邊,我甚至不去計算那些選票,

那會讓你從一個嘈雜的影象到一個更好的影象。

還有一個問題:

如果我們有很多噪音怎麼辦?

假設我們只有噪音。在左邊,你得到的是一堆點,它們都是隨機的。

在右邊,每個人都有投票權。

去投票吧。結果是沒有真正的候選人。

但也許我們不知道,你可以偶然發現峰值。

所以有時候你不得不擔心,我發現的峰值是否真實?

如果你已經知道了,假設你知道這幅圖中有六條線,那麼你只找到六條最高峰,但是如果你不知道有多少個高峰,

你有一個問題,什麼時候一個高峰是真正的高峰,什麼時候它只是選票的意外排列?

霍夫擴充套件

我想談談霍夫變換的幾個擴充套件。

然後這些擴充套件中的一些會繼續,下一個環節或者下下一個環節。

到目前為止,人們使用最多的擴充套件是這裡顯示的使用梯度的擴充套件:

你會注意到我們的演算法幾乎完全一樣。

我們初始化累加器陣列:

我們遍歷每個點,但現在不是迴圈或遍歷所有可能的方向,

我們實際上在那個點取梯度,

我們從這個梯度取θ:

現在你可以拿一個θ,或者你甚至可以採取一系列的θ,你說,嗯,我知道它是,大約45度加上或減去10,

所以我會投票給 -35 到 55 ,但我不必擔心投票給所有其他人。

我把它寫在這裡就好像你只有一個值。

現在你有θ,你可以直接求解方程,就像我們以前一樣,我們增加累加器陣列。

好的是,通過使用梯度,你大大減少了投票時間,對吧?

你不用擔心,你只有一個點。另外,稍後,您可以使用它來減少維度。

這是人們最常使用的擴充套件。

事實上,整個方向的概念我們以後會講到其他一些擴充套件。

另外一個是拓展,記住當我們做邊緣檢測時,我們說一些邊緣比其他邊緣具有更強的幅度:

你必須設定一個閥值。好吧,你可以降低閥值,試著得到更多的邊。

但是你可能想要用更高的臨界值來計算邊緣。

那麼,更多地計算它們意味著什麼呢?

好吧,你可以想象更強的優勢會得到更多的選票。

另一個拓展,和我之前講的很相似,就是改變 \theta 和 d 的箱子大小。

拓展3:改變(d,\theta)的取樣,以提供更多/更少的解析度。

正如我們之前所說的:大箱子很容易投票,它很快。

但有時你也會遇到類似的情況:

要找到一個箱子,你會遇到這樣的問題,因為噪音的原因,實際的路線是支援不同的箱子,所以擴充套件是分層進行的。

首先,做一個粗略的裝箱,你有一些更大的箱子,箱子能捕獲更多的值。

一旦你在那裡找到了峰值,你就可以在這些區域內找到更精細的陣列,而你,你可以提高模型的恢復能力。

最後,它不僅僅是一個擴充套件,而是一種全新的做事方式。

我們這樣做是為了線,但你可以很容易做到這一點。

我不應該這麼說。對於其他引數化的形狀,比如圓,你可以很直接地做這個,事實上,我們稍微做一下,你也可以的。

或者實際上,任何其他形狀,包括由它們的模板定義的形狀。

本環節結束

這個環節就到這裡。

毫無疑問,你們會回過頭來仔細看這個問題,因為這個演算法和資料集的操作將作為霍夫問題集第一部分的基礎。

當你在網上查這個東西的時候,你們中的很多人會想把它和我們在這裡看到的聯絡起來。

我要告訴你們的是,實現霍夫變換感覺比較簡單。

他們後來報告說,他們花了大約10個小時來做這個習題集。這是因為拓展等等。

我們在報紙上說的話幾乎都不起作用,因為我們必須讓它聽起來很適合發表。

在實際情況下,你可以使用理論,然後你必須對影象和AL和演算法進行揣摩。


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