8.霍夫變換:線條——投票原理、霍夫空間、線的極座標表示_2
目錄
投票原理
霍夫空間
線的極座標表示
投票原理
就像我之前說的,檢查每一行是不可能的,即使是一臺非常非常快的電腦。
我們要做的是讓資料告訴我們,讓資料決定線在哪裡。
因為這是民主,我們該怎麼辦?
我們要做的是投票。
因此,投票是一種通用的技術,我們讓特性投票給所有與之相容的模型。
它的工作方式很簡單:
1、迴圈遍歷所有特徵(特徵指的是小的邊緣點),每次為模型引數投票。
現在,對於我所需要的大多數特徵來說,都是小的邊緣點。
並且每個邊緣點將對模型引數 或 其滿意 或 一致的不同模型引數集投票。
2、尋找得到大量選票的模型引數。
當我們都完成了第一步,我們接下來需要尋找很多選票的模型引數,這些是我們要例項化的引數模型。
為什麼投票有效?
嗯,投票的作用就像米老鼠、唐老鴨和勞拉·克勞馥永遠不會當選加州州長一樣。
第一:噪聲和雜亂的特性也會投票,就像真實的特性一樣。但通常情況下,他們的投票是跟大多數的優秀特徵不一致。
第二:如果沒有觀察到一些特性,模型可以跨越多個片段。
另一個好處是:
即使圈子的一部分被遮擋而且沒有任何特徵可以投票,因為圈子的其餘部分獲得了很多選票,我們能夠找到圓圈。
我們今天要用的例子是關於擬合線。
為了擬合直線,我們要問幾個問題:
第一個問題:給定屬於直線的點,直線是什麼?
第二個問題:那裡有多少條線?
第三個問題:哪些點屬於哪條線的?
現在我們主要集中在這堂課的第一個問題,事實上,我們將要做的大部分工作,
但是我們正在討論的內容的拓展使得做問題2和問題3時要變得很容易。
我們今天要講的方法叫做霍夫變換(Hough Transform),這是一種投票技術,可以用來回答所有這些問題。
主要思想:
1、每個邊緣點都會投票相容的線條;
2、尋找那些能得到很多選票的線條;
也就是說,它會投票給任何通過它的舊線路,然後你就會尋找得到很多票的線條。
所以可能有兩條,三條,四條線,你可以找到它們。
順便說一下,如果你跟蹤哪個點投給了哪條線,你也可以回去說哪個點屬於那條線。
霍夫空間
我要給你們講一下它是如何工作的,霍夫變換的關鍵是霍夫空間。
這是左邊的影象空間中的一條線,我們要構造的是霍夫空間,右邊是霍夫引數空間。
在這個表述中,我們有兩個引數 m 和 b 。
所以,對於這條直線 ,它在Hough空間中的 , 處表示:
這就是霍夫空間的意義所在。
這裡的關鍵思想是:影象中的直線對應於霍夫空間中的一點。
現在我們要做一些不同的事情。
假設在影象空間中只有一個點,我們把這個點放在(x,y) 處:
那麼,經過這一點的直線的方程是什麼呢?
在影象空間中,我們知道經過這一點的直線滿足 m 和 b。
它會滿足方程 ,為了通過點(, )它必須有一個 m 和一個 b 使這個方程成立。
通過一些簡單的代數重排,就得到 ,這是m b空間中直線的方程:
實際上,它是一條斜率為 ,截距為 的直線:
這裡的思想是:影象空間中的一點是霍夫空間中的一條線。
這是對偶性。
如果增加一個點會怎樣?
這是另一條直線:
這是一條直線 :。
現在有一個很酷的問題:什麼樣的直線是跟這兩點的情況符合的?
它是Hough空間中的這兩條線相交的地方:
因為那是m和b,它與穿過(,)的線 和 穿過(,)的線是一致的。
女士們,先生們,男孩們,女孩們,所有感興趣的人,這就是我們如何從點中找到直線的方法。
現在我們要把它簡化成一個演算法,我們先用圖形來展示給你看,然後再講演算法。
基本上,每個點都給了Hough空間中的一條直線。
我要做的是:我建立一個表格,這裡是m和b,它是由一組箱子組成的:
每一個點都對經過的箱子進行投票,所以它會對經過的每個箱子投一票。
你收集了每個箱子的票數情況。每一個點都投過票,哪一個票數最多,那就是你的路線:
因此,基本上,我們將把選票投進箱子,然後找到最多選票的箱子。求這個點座標就求出直線了。
但這裡是用極座標表示,因為極座標更加細化,我們來看看下面這個例子:
在真正的程式碼和數學中實現這個之前,我們需要重新考慮一下出現以下這種情況該怎麼表示:
這樣的話,會出現好幾條垂直線在一起,斜率m等於無窮大,而截距b怎麼取值呢?
好的,我們要用一個更健壯的線條表示,這樣我們就不會有任何不好的數值問題了。
我們要用的是直線的極座標表示。
線的極座標表示
d:從直線到原點的垂直距離。
垂線與x軸的夾角。
在極座標表示中,這條紫色的線由兩個量定義。
其中一個就是這個距離d,這是一條直線到原點的垂直距離:
它是這條紫色的直線上離原點最近的點的距離。
第二個引數是:這條垂直線與x軸的夾角(),如果你願意,也可以是直線與座標軸的夾角,
沒關係,你只需要選擇一個角度:
基本上我們得到的是一個距離和一個角度的極座標(d,)。
求 d 的距離公式基本上是這樣表示:
這個公式是由直線公式轉換而來:
經過化簡之後,我們可以得出:
這裡的 r 就是 d,也就是極徑的距離。或者稱向某個方向為移動了多少單位。
所以它有點醜,如果你喜歡三角學,那就太美了。如果你喜歡代數,那就太難看了,它比y = mx + b更難看。
但這個公式沒有這個問題,我們的任何直線都是不規則的。你可以有任何你想要的方向,可以任意移動。
你可以直接穿過原點。d可以是0,也可以達到你需要的大小。
有趣的是,如果你看這個方程(影象空間中的點現在是Hough空間中的正弦段),
如果我們已經知道 x 和 y,我們剩下的是 d 和 是正弦曲線:
這就是為什麼我們說:影象空間中的一點現在是霍夫空間的正弦曲線,我們一會兒會看到一個例子。
看,之前,影象空間中的一個點是霍夫空間中的一條線,霍夫空間中的一個點是影象空間中的一條線。
因為我們已經介紹了餘弦(cos)和正弦(sin),它仍然是對偶性,但它不再是簡單的點和線之間的關係。
關於這個的另一個評論,這裡有一個冗餘或歧義。
我這樣畫,這裡是d:
所以如果 d 只能是正的:
這條線必須能夠一路旋轉:
因此 必須從 0 到 2π,也就是 0度 到 360度 。
但如果 d 可以是正的 或 可以是負的:
那麼 只需要從 0 到 π ,也就是 0度 到 180度:
或 0 到 -π,也就是0度 到 -180度。這個想法是你只需要180度的覆蓋範圍。
你用哪種方法做並不重要,我們的演算法會用一種特殊的方式來做。
但是這裡有一個權衡,如果你讓 d 從正 到 負,上面是負的,那麼只有它必須從 0 到 π 。
事實上,如果你將它作為影象的原點,你可以限制更多的東西。
如果你想說直線必須在影象中。然後,它限制了更多,因為它必須切斷象限,因此 和 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
——學會編寫自己的程式碼,才能練出真功夫。