python從無到有手寫實現霍夫變換

2021-09-20 03:08:34 字數 3273 閱讀 6662

參考博文:

霍夫變換原理網上很多,我就不在過多的贅述。在此,我只簡要的描述一下霍夫變換的關鍵要點。

霍夫變換就是通過canny等邊緣檢測演算法找到關鍵點,然後以關鍵點為中心,做無數條直線,如果某一條直線上的點超過設定的閾值,則這條直線被檢測出來。該方法在笛卡爾座標系下是很難被實現的,霍夫變換就是將笛卡爾座標系下的點對映到霍夫空間上,就像傅利葉變換一樣。霍夫空間就是乙個極座標系描述的點空間。

霍 夫變

換方程(

極座標方

程):ρ

=xcos⁡(θ

)+ysin⁡(

θ)霍夫變換方程(極座標方程):\rho =x\,\cos\left(\theta \right)+y\,\sin\left(\theta \right)

霍夫變換方程

(極座標

方程):

ρ=xcos(θ

)+ysin(θ

)所以,以點為中心旋轉直線的過程在霍夫空間中就是改變θ求ρ的過程,例如:

關鍵點-90°

-45°

0°45°

90°(5,25)

-25-14521

25在opencv庫中使用霍夫變換還有乙個旋轉精度的引數,就是每旋轉多少度做一條直線,轉換到霍夫空間,就是每隔多少度打乙個點,即取樣的精度,上面的例子是每隔45°打乙個點。最後乙個點在笛卡爾座標系中的旋轉對應著霍夫空間中的一條正弦曲線,證明如下:

ρ =x

cos⁡(θ

)+ysin⁡(

θ)=x

cos⁡(θ

)x2+

y2+y

sin⁡(θ

)x2+

y2x2

+y2=

cos⁡(γ

)sin⁡(

θ)+sin⁡(

γ)cos⁡(θ

)x2+

y2=sin⁡(

γ+θ)

x2+y

2其中:

sin⁡(γ

)=xx

2+y2

\rho =x\,\cos\left(\theta \right)+y\,\sin\left(\theta \right)\\ =\frac}+\frac}}}\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \qquad=\frac}\\=\frac} \ \ \ \ \ \ \ \ \ \ \ \ \\其中:\sin\left(\gamma \right)=\frac}

ρ=xcos(θ

)+ysin(θ

)=x2

+y2​

x2+y

2​xcos(θ

)​+x

2+y2

​ysin(θ)

​​=x

2+y2

​cos(γ

)sin(θ

)+sin(γ)

cos(θ)

​=x2

+y2​

sin(γ+

θ)​其

中:sin(γ)

=x2+

y2​x

​最後給出笛卡爾座標系下的直線轉化到霍夫空間的python**:

import cv2

import numpy as np

#繪製初始的影象(即初始化乙個500*500的矩陣,並畫上一條線)

img = np.zeros(

[500

,500])

.astype(np.uint8)

#建立乙個矩陣

cv2.line(img,(50

,50),

(100

,100),

255)

#畫直線

cv2.imshow(

'',img)

#將關鍵點,也就是線上的點放入key_points列表中

key_points =

for y_cnt in

range(0

,500):

#將直線上的點取出(白點即畫素值為255的點)

for x_cnt in

range(0

,500):

if img[y_cnt]

[x_cnt]

==255

:(x_cnt,y_cnt)

)#將key_points中的點轉換到霍夫空間中,間隔的θ為1度,在笛卡爾座標系中可以描述成在-90°到90°間以點為中心每隔1°畫一條直線

conver_points =

for key_point in key_points:

#將點轉換到霍夫空間

conver_points_tmp =

for theta in

range(-

90,90)

:#從-90°到90°打點,間隔1°

x,y = key_point

rho = x * np.cos(theta/

180*np.pi)

+ y * np.sin(theta/

180*np.pi)

#注意將角度轉換成弧度

(int

(theta)

,int

(rho)))

#繪製換換到霍夫空間的曲線

hough_img = np.zeros(

[710

,180])

.astype(np.uint8)

#轉換成uint8的影象,否則imshow無法顯示

for conver_point in conver_points:

#繪製霍夫空間的曲線

for point in conver_point:

theta, rho = point

hough_img[rho-

350]

[theta-90]

=255

cv2.imshow(

'hough'

,hough_img)

cv2.waitkey(

)

笛卡爾座標系下的直線

霍夫直線變換

曲線的交點即在笛卡爾座標系中,在一條直線上的點,所以在霍夫空間中相交最多的那點的ρ和θ即可以表示笛卡爾座標系中的直線。

Makefile 從無到有

makefile這玩意在上學時就應該學,可是一直沉浸於ide的 所謂 死於安樂 直到現在一把年紀才開始接觸這種基礎東西。建立c程式 先寫個c程式,儲存在main.c裡 view plain file main.c include int main 看看我這時的目錄結構 view plain code...

Redis從無到有

redis最佳執行環境是linux作業系統,所以要在虛擬機器裡的linux系統裡安裝redis 安裝教程 安裝過程中遇到的問題 1 windosws系統預設是沒開啟虛擬機器功能的,進入bios設定,將相應的disable改為enable 2 license not accept 依次輸入 1,2,c...

GitHub從無到有

2018年07月04日 09 23 40 夏雨薇安 首先你得註冊乙個自己的github賬號,註冊 有了自己的賬號以後,就可以進行登入,開始建立乙個新的專案 建立乙個新的專案,填寫專案名稱,描述 建立完成之後,跳轉到下面的頁面,下面紅框中的 要記住,在後面上傳 的時候需要使用 出現以下介面 第一步 c...