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:
但這一次,這裡的一點,有這個梯度:
現在,如果我們知道半徑,我們就會得到一個可能的圓。
所以,如果你告訴我這是一個點,這是我知道半徑的梯度,那就是中心唯一的位置。
但是如果半徑是它的一半,那麼圓心就在這裡:
或者中心,我猜它也可能在另一邊:
所以,只有當你有梯度的時候,這樣的單條線路的投票才會發生:
所以在霍夫空間中,即使它是一個三維的霍夫空間,你只會沿著一條線投票:
這樣稍微好一點,至少讓投票更容易。
當你有這個三維的霍夫空間時,你仍然有這個問題。
——學會編寫自己的程式碼,才能練出真功夫。