1. 程式人生 > >8.霍夫變換:線條——投票原理、霍夫空間、線的極座標表示_2

8.霍夫變換:線條——投票原理、霍夫空間、線的極座標表示_2

目錄

投票原理

霍夫空間

線的極座標表示


投票原理

就像我之前說的,檢查每一行是不可能的,即使是一臺非常非常快的電腦。

我們要做的是讓資料告訴我們,讓資料決定線在哪裡。

因為這是民主,我們該怎麼辦?  

我們要做的是投票。

因此,投票是一種通用的技術,我們讓特性投票給所有與之相容的模型。

它的工作方式很簡單:

1、迴圈遍歷所有特徵(特徵指的是小的邊緣點),每次為模型引數投票。

現在,對於我所需要的大多數特徵來說,都是小的邊緣點。

並且每個邊緣點將對模型引數 或 其滿意 或 一致的不同模型引數集投票。

2、尋找得到大量選票的模型引數。

當我們都完成了第一步,我們接下來需要尋找很多選票的模型引數,這些是我們要例項化的引數模型。

為什麼投票有效?

嗯,投票的作用就像米老鼠、唐老鴨和勞拉·克勞馥永遠不會當選加州州長一樣。

第一:噪聲和雜亂的特性也會投票,就像真實的特性一樣。但通常情況下,他們的投票是跟大多數的優秀特徵不一致。

第二:如果沒有觀察到一些特性,模型可以跨越多個片段。

另一個好處是:

即使圈子的一部分被遮擋而且沒有任何特徵可以投票,因為圈子的其餘部分獲得了很多選票,我們能夠找到圓圈。

我們今天要用的例子是關於擬合線。

為了擬合直線,我們要問幾個問題:

第一個問題:給定屬於直線的點,直線是什麼?

第二個問題:那裡有多少條線?

第三個問題:哪些點屬於哪條線的?

現在我們主要集中在這堂課的第一個問題,事實上,我們將要做的大部分工作,

但是我們正在討論的內容的拓展使得做問題2和問題3時要變得很容易。

我們今天要講的方法叫做霍夫變換(Hough Transform),這是一種投票技術,可以用來回答所有這些問題。

主要思想:

1、每個邊緣點都會投票相容的線條;

2、尋找那些能得到很多選票的線條;

也就是說,它會投票給任何通過它的舊線路,然後你就會尋找得到很多票的線條。

所以可能有兩條,三條,四條線,你可以找到它們。

順便說一下,如果你跟蹤哪個點投給了哪條線,你也可以回去說哪個點屬於那條線。

霍夫空間

我要給你們講一下它是如何工作的,霍夫變換的關鍵是霍夫空間。

這是左邊的影象空間中的一條線,我們要構造的是霍夫空間,右邊是霍夫引數空間。

在這個表述中,我們有兩個引數 m 和 b 。

所以,對於這條直線 y = m_{0}x + b_{0} ,它在Hough空間中的 m_{0}b_{0} 處表示:

這就是霍夫空間的意義所在。

這裡的關鍵思想是:影象中的直線對應於霍夫空間中的一點。

現在我們要做一些不同的事情。

假設在影象空間中只有一個點,我們把這個點放在(x,y) 處:

那麼,經過這一點的直線的方程是什麼呢?

在影象空間中,我們知道經過這一點的直線滿足 m 和 b。

它會滿足方程 y = m_{0}x + b_{0},為了通過點(x_{0},  y_{0})它必須有一個 m 和一個 b 使這個方程成立。

通過一些簡單的代數重排,就得到 b=-x_{0}m + y_{0},這是m b空間中直線的方程:

實際上,它是一條斜率為 -x_{0}m,截距為 y_{0} 的直線:

這裡的思想是:影象空間中的一點是霍夫空間中的一條線。

這是對偶性。

如果增加一個點會怎樣?

這是另一條直線:

這是一條直線 :b=-x_{1}m + y_{1}

現在有一個很酷的問題:什麼樣的直線是跟這兩點的情況符合的?

它是Hough空間中的這兩條線相交的地方:

因為那是m和b,它與穿過(x_{0}y_{0})的線 和 穿過(m_{1}b_{1})的線是一致的。

女士們,先生們,男孩們,女孩們,所有感興趣的人,這就是我們如何從點中找到直線的方法。

現在我們要把它簡化成一個演算法,我們先用圖形來展示給你看,然後再講演算法。

基本上,每個點都給了Hough空間中的一條直線。

我要做的是:我建立一個表格,這裡是m和b,它是由一組箱子組成的:

每一個點都對經過的箱子進行投票,所以它會對經過的每個箱子投一票。

你收集了每個箱子的票數情況。每一個點都投過票,哪一個票數最多,那就是你的路線:

因此,基本上,我們將把選票投進箱子,然後找到最多選票的箱子。求這個點座標就求出直線了。

但這裡是用極座標表示,因為極座標更加細化,我們來看看下面這個例子:

在真正的程式碼和數學中實現這個之前,我們需要重新考慮一下出現以下這種情況該怎麼表示:

這樣的話,會出現好幾條垂直線在一起,斜率m等於無窮大,而截距b怎麼取值呢?

好的,我們要用一個更健壯的線條表示,這樣我們就不會有任何不好的數值問題了。

我們要用的是直線的極座標表示。

線的極座標表示

d:從直線到原點的垂直距離。

\theta: 垂線與x軸的夾角。

在極座標表示中,這條紫色的線由兩個量定義。

其中一個就是這個距離d,這是一條直線到原點的垂直距離:

它是這條紫色的直線上離原點最近的點的距離。

第二個引數是:這條垂直線與x軸的夾角(\theta),如果你願意,也可以是直線與座標軸的夾角,

沒關係,你只需要選擇一個角度:

基本上我們得到的是一個距離和一個角度的極座標(d,\theta)。

求 d 的距離公式基本上是這樣表示:

這個公式是由直線公式轉換而來:

y = (-\frac{cos\theta}{sin\theta})x+(\frac{r}{sin\theta})

 

經過化簡之後,我們可以得出:

xcos\theta + ysin\theta = r

這裡的 r 就是 d,也就是極徑的距離。或者稱向某個方向為移動了多少單位。

所以它有點醜,如果你喜歡三角學,那就太美了。如果你喜歡代數,那就太難看了,它比y = mx + b更難看。

但這個公式沒有這個問題,我們的任何直線都是不規則的。你可以有任何你想要的方向,可以任意移動。

你可以直接穿過原點。d可以是0,也可以達到你需要的大小。

有趣的是,如果你看這個方程(影象空間中的點現在是Hough空間中的正弦段),

如果我們已經知道 x 和 y,我們剩下的是 d 和 \theta 是正弦曲線:

這就是為什麼我們說:影象空間中的一點現在是霍夫空間的正弦曲線,我們一會兒會看到一個例子。

看,之前,影象空間中的一個點是霍夫空間中的一條線,霍夫空間中的一個點是影象空間中的一條線。

因為我們已經介紹了餘弦(cos)和正弦(sin),它仍然是對偶性,但它不再是簡單的點和線之間的關係。

關於這個的另一個評論,這裡有一個冗餘或歧義。

我這樣畫,這裡是d:

所以如果 d 只能是正的:

這條線必須能夠一路旋轉:

因此 \theta 必須從 0 到 2π,也就是 0度 到 360度 。

但如果 d 可以是正的 或 可以是負的:

那麼 \theta 只需要從 0 到 π ,也就是 0度 到 180度:

或 0 到 -π,也就是0度 到 -180度。這個想法是你只需要180度的覆蓋範圍。

你用哪種方法做並不重要,我們的演算法會用一種特殊的方式來做。

但是這裡有一個權衡,如果你讓 d 從正 到 負,上面是負的,那麼只有它必須從 0 到 π 。

事實上,如果你將它作為影象的原點,你可以限制更多的東西。

如果你想說直線必須在影象中。然後,它限制了更多,因為它必須切斷象限,因此 \theta 和 d 受到更多限制。

但這些只是你在如何編寫演算法方面做出的選擇。

對三角函式加深學習:

學習:sin cos 等函式影象。

對極座標知識加深理解:

https://blog.csdn.net/sw3300255/article/details/82756184

https://blog.csdn.net/sw3300255/article/details/82776368

加深理解霍夫變換原理:

https://www.cnblogs.com/php-rearch/p/6760683.html

https://blog.csdn.net/m0_37264397/article/details/72729423


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