1. 程式人生 > >9.霍夫變換:圓——介紹、用Hough檢測圓、圓的Hough變換_1

9.霍夫變換:圓——介紹、用Hough檢測圓、圓的Hough變換_1

目錄

介紹

介紹

畫好直線之後,記住,線是引數模型最簡單的形式,現在我們來看看更復雜的東西,也就是圓。

這是圓的方程,其中 a 和 b 是中心,r 是半徑:

現在我們假設半徑已知。我們只需要找到這些點的位置。

這裡有一個圓,在這個圓上有三個點,這裡的藍點:

那麼,霍夫空間是什麼呢?

因為通常有三個未知數,a b r,但是我告訴過你們半徑,霍夫空間就是 a 和 b :

對,中心位置 x 和 y 方向。現在我們考慮第一點,比如說,x0 y0,這一點就在下面圖片那裡:

所以這個點必須在圓上,我們知道它的半徑 r。

一種思考方法是:圓的半徑是這個點的半徑 r,它的作用是為一組點投票,這就是這條綠線所代表的。

這一組點在ab空間的這個位置附近,對吧?

對於影象空間中的一個點,我們在霍夫空間中得到半徑為r的圓:

讓我們進入下一點:

是一樣的,所以它的半徑是r。

在霍夫空間中,我們會沿著這個圈投票:

下一點:

如果影象中的每個點都投了一個圈,我們就會得到所有的選票:

就像之前一樣,我們在這裡得到了大多數的選票這對應於中間點,這就是畫在這裡的點:

所以它的作用就像之前我們選直線一樣,只是現在我們不用正弦曲線,而是在一個ab Hough的空間裡畫一個圓。

用Hough檢測圓

事實上,這裡有一個很好的執行例子:

這是一張非常古老的照片,但是你可以在這裡看到,有一個保齡球,這是畫十字的地方:

就像。。。給你們展示一些其他方法來找到這個移動的球,你可以想象尋找移動的東西。

畢竟,它還沒有擊中要害。但是當你尋找移動的物體時,他們會找到這個邊界框。

我們怎麼能找到比球更多的東西呢?

實際上,如果你仔細看,你會發現這條小巷很亮:

Okay,事實上,過一會兒我們會討論反射函式和鏡面反射函式,你們會討論為什麼在這條球道上你會看到球的影象。

因為這個,這裡也有運動,所以你得到了這個邊界框(如圖)。但沒關係,我們說的基本上就是它能找到那個圓。

這是另一個例子:

實際上,如果你輸入Hough變換圓或者類似的東西到谷歌,在谷歌中,你尋找影象,你會得到這個影象。

這張照片是由Vivek Kwatra拍攝的,當時他還是個研究生,我班上的助教,大概是在1811年。

我們所做的就是把這些硬幣放在有紋理的背景上然後拍張照片。

他這麼做是因為他不得不這麼做,因為他是我的助教。他現在是一個非常有名的人在做很酷的研究工作。

基本上,你可以用這個來計算邊緣,這是它的邊緣影象(如圖),然後我們可以尋找圓。

現在,我們要用已知的半徑方法。假設我們從一便士的半徑開始。你可能會看到硬幣中間有一個很好的亮點:

現在你可能還會注意到,有一些區域是膨脹的:

這裡就沒那麼多了:

那是因為你可以在硬幣的圓裡面再裝一個圓,

繞著圓的邊緣,中心繞著圓的中間旋轉:

這就是這個小圓的中心:

但在真正的硬幣上,它們會對齊,所以你會得到一個更亮的點:

那麼我們如何找到25美分硬幣呢?

我們用一個更大的半徑,1 / 4的半徑,我們再次投票,你會看到這些點在這裡,這裡,這裡:

現在這個便士的邊緣(如圖),他們再次投票給這個圓,但不像25美分硬幣那樣結實。

這是原始的影象:

這些是組合探測:

這很酷,你知道,你可以找到圓圈。

圓的Hough變換

假設你真的不知道半徑。

那麼我們該怎麼辦呢? 讓我們一起來思考這個問題。

現在我們的霍夫空間有三個維度,a b r(如圖),因為我們不知道半徑是多少。

如果我有一個點(如圖),會發生什麼?

現在,如果我們假設這個點的半徑是7,那麼它會是一個圍繞這個點的圓,就像我們之前做的那樣。

如果半徑是3,它會是另一個圍繞同一個點的圓,但會小一些:

所以,我希望你們能開始看到我們在這裡得到的實際上是一個圓錐。

所以,在未知半徑的情況下,每個點在這個三維空間裡都為一個完整的圓錐進行投票。

這就是這個圓錐的外觀, 不是一個填充的圓錐,而是一個曲面。

下一要點,它的作用是什麼?

它會投票給另一個錐體,你可以把這些加起來:

現在我要告訴你們這是很痛苦的一件事情。

事實上,如果你們中有人做了一個類似於這個的隨機課程的習題集,我們會告訴你們關於尋找圓的問題。

如果你試著在一個巨大的3D空間裡投票,它不會工作得很好。

在後面的很多文章中,我們會講到ransack,它會克服這個維度。

但現在,只要知道我們有一個小問題,那就是不斷增大的投票空間。

所以這個問題是可以解決的,只是解決的過程有點痛苦。

還記得我們去掉投票數的方法之一就是使用梯度方向嗎?

因為如果我已有一個點 和 我已經知道了該點的梯度,而它可能只有一條可能的線。

我們可以對圓做同樣的事情。

現在我們有一個未知的半徑,但是我們有一個梯度,我們的霍夫空間是a b r:

但這一次,這裡的一點,有這個梯度:

現在,如果我們知道半徑,我們就會得到一個可能的圓。

所以,如果你告訴我這是一個點,這是我知道半徑的梯度,那就是中心唯一的位置。

但是如果半徑是它的一半,那麼圓心就在這裡:

或者中心,我猜它也可能在另一邊:

所以,只有當你有梯度的時候,這樣的單條線路的投票才會發生:

所以在霍夫空間中,即使它是一個三維的霍夫空間,你只會沿著一條線投票:

這樣稍微好一點,至少讓投票更容易。

當你有這個三維的霍夫空間時,你仍然有這個問題。

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