图像处理:Hough变换原理分析
一、前言
????????別看Hough變換似乎簡單,但是,不發揮一下數學理論的功力是不可能理解的;本人早十幾年前就用Hough,也一直想寫Hough變換,但一懶就是10幾年,乘春節前有空,就將Hough的詳細細節揭秘出來,供大家參考。
二、 直線函數的形式化表示
2.1 直線被方程表示
在直角坐標系,任意一條直線的方程是
2.2 直線被圖表表示
在現實圖像中,我們可以把等式看成一個表格,如圖:
2.3 直線的表格表示
以上直線方程構成表格是:
因此,以上用三種方法表示一個直線內容,也就是告訴我們,函數可以以多種方式存在,而計算機算法,常常以表格的方式解決問題為妥。而且從一種表格等價地轉換成另一種表格。hough變換就是這樣的實例。
三、hough變換的提出
????????以上方程,固定k和b,能夠找出線上任意一個點,這是一個正向問題;逆向問題是,給出一群點(x,y);問這些點是否構成直線?
????????如果試圖用計算機解決,那么需要找出某種條件模式,使得所有在直線上的點(x,y)滿足這種條件,不在直線的點不滿足這個條件。
????????這里首先要強調一個事實:這個式子有多重含義,如果理解錯了,就無法真正懂得houghj變換,本文將逐一講述該式的三個場景,從而排除干擾,讓大家真正懂得hough變換中的意義。
3.1 極坐標表示點和線
令一個極坐標系與直角坐標系在原點重合;在極坐標上表示為
?因此有:
??
因此,
注意:以上2)式似乎很明確直觀,但是這不是hough的要點。為了追究到底是個啥意思,這里專門列出三個意義,比較三個意義之后,才能肯定,哪個解釋才是hough的本意。
下面將一一描述。
1)構成點:固定x,y,且;表示直角坐標點和極坐標的轉換公式:
以上(3)和(4)兩個條件決定了?直角坐標點和極坐標的轉換公式。顯然,這里我們不是研究單點的,因而這個解釋不是hough變換。
2)構成圓軌跡:把的x和y看成固定點,讓?隨意變動后,r構成圓軌跡
當上面條件(3)和(4)中,去掉(4),單獨保留(3)是個啥?提前告訴大家是一個圓軌跡。證明如下:
令:
此為圓的極坐標方程,如圖:
?事實上,從P(x,y)引出的所有直線,都和此圓相交,如圖:
結論1:所謂的就是給定P(x,y)點后,x和y固定,P與原點O構成線段為直徑的圓的軌跡。
推論:過P點的任意直線,與過原點垂線的交點(垂足點),剛好落在圓上。
3)構成直線方程:給定任意直線,其到原點距離是固定的、從原點引出垂線方向角也固定
假設,有任意一條直線,如何在極坐標系表示這條直線的軌跡?
?????????對于任意直線L,做L的垂線,且過原點,垂足為Q(x0,y0);OQ就是原點到L的距離;在直線L上找任意點P(x,y);顯然OS=x;PS=y;做OS和PS到OQ的投影,投影線為OR和RQ(=ST),顯然OR+ST=OQ;
結論:公式(7)的意義是,一條直線上所有的點都與一個r和一個對應,這個解釋才是我們這里hough變換所指的意義!
注意:很神奇!?居然有三種不同含義,以上三個解釋全部擺出,經對比,式(7)才是我們要的hough變換的含義。
四、 hough變換的原理
4.1 極坐標的表格
????????將極坐標的r和以直角方式構建坐標,就成了表格平面;直角坐標平面x-y平面的任意點一 一對應于?平面的點。
?在平面上,坐標是個的有限區間,這是大大的有利條件!!!
?4.2 用平面表示:過任意點P(x,y)做所有射線,其過原點的垂足點的軌跡
?如下圖,Q1,Q2,Q3,... ... 就是這些射線的原點的垂足點,在?表格中表示成正弦曲線,
?上圖中的每一個P(x,y)決定一個圓,該圓在?平面上對應一條三角曲線(下圖)。如果有N個點構成直線,那么,就有N條三角曲線,且交于共同的一個點。
4.3 構建hough算法表格(?在圖)
1)構建?在平面,用矩陣M表示,M初始值賦值為0
2)在圖像中選取目標像素的坐標(x,y)
3)在中取一個序列,從序列中選取一個帶入公式:
? ? ? ? ??
? ? 求出一個r。
4)刷新M矩陣,將對應的值加1.
5)循環完成后,M矩陣的每個峰值對應一條直線。
五、圖像處理中,Hough變換如何應用
如果將圖片中所有點參與直線提取,是不可取的,因此,需要邊緣提取后,然后二值化處理,使得線上點數量規模減小后,用hough變換。
- 預處理圖像,首先邊緣提取
- 然后閾值二值化,將邊緣點挑選出來備用。
- 對邊緣點進行hough變換,生成M矩陣
- 選取M中峰值,將線條對應點提取出。
5.1 python程序代碼
# coding=utf-8 import cv2 import numpy as npdef rgb2gray(rgb):return np.dot(rgb[..., :3], [0.299, 0.587, 0.114])Gray = cv2.imread("d:/images/lines1.jpg",0)height,width = Gray.shape cv2.imshow("dsp",Gray) cv2.waitKey(0)point ={} num=0 for i in range(height):for j in range(width):if Gray[i][j] !=0:point[num]=[i,j]num+=1triTable ={}for i in range(180):triTable[i]=[np.sin(i*3.14159/180),np.cos(i*3.14159/180)]len_cross = int( np.sqrt( width**2+ height**2)) MtrScore = np.zeros([len_cross*2,180],np.int32)for i in range(num):ptmp = point[i]for j in range( 180 ):atmp = triTable[j]rou =int( ptmp[0]*atmp[0] + ptmp[1]*atmp[1] ) + len_cross# print(rou)MtrScore[rou][j] = MtrScore[rou][j]+ 1import seaborn as sns import matplotlib.pyplot as plt sns.heatmap( MtrScore ) plt.show()5.2 實驗和效果1:輸入直線圖片
輸出的???平面圖:
5.3 實驗效果2:輸入一個點
輸入下面圖像,圖的中部有一個白點,將其進行hough變換,看結果。
輸出的???平面圖:
總結
以上是生活随笔為你收集整理的图像处理:Hough变换原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python应用:最长无重复字串提取
- 下一篇: Halcon知识:如何求一个工件的粗细