霍夫變換原理及實現

2021-08-18 13:43:42 字數 2666 閱讀 2963

霍夫變換是影象處理必然接觸到的乙個演算法,為了檢測出來直線和圓,橢圓之類的形狀。

比較好的教程霍夫變換原理

霍夫變換實現步驟:

import cv2

import numpy as np

def hough_detectline(img):

thetas=np.deg2rad(np.arange(0,180))

row,cols=img.shape

diag_len=np.ceil(np.sqrt(row**2+cols**2))

rhos=np.linspace(-diag_len,diag_len,int(2*diag_len))

cos_t=np.cos(thetas)

sin_t=np.sin(thetas)

num_theta=len(thetas)

#vote

vote=np.zeros((int(2*diag_len),num_theta),dtype=np.uint64)

y_inx,x_inx=np.nonzero(img)

#vote in hough space

for i in range(len(x_inx)):

x=x_inx[i]

y=y_inx[i]

for j in range(num_theta):

rho=round(x*cos_t[j]+y*sin_t[j])+diag_len

if isinstance(rho,int):

vote[rho,j]+=1

else:

vote[int(rho),j]+=1

return vote,rhos,thetas

#image = cv2.imread(r'c:\users\y\desktop\input_0.png')

#image_gray=cv2.cvtcolor(image,cv2.color_bgr2gray)

#image_binary=cv2.canny(image_gray,150,255)

image = np.zeros((500,500))

image[10:100, 10:100] = np.eye(90)

accumulator, rhos,thetas= hough_detectline(image)

#look for peaks

idx = np.argmax(accumulator)

rho = rhos[int(idx/accumulator.shape[1])]

theta = thetas[idx % accumulator.shape[1]]

k=-np.cos(theta)/np.sin(theta)

b=rho/np.sin(theta)

x=np.float32(np.arange(1,150,2))

#要在image 上畫必須用float32,要不然會報錯(float不行)

y=np.float32(k*x+b)

cv2.imshow("original image",image),cv2.waitkey(0)

for i in range(len(x)-1):

cv2.circle(image,(x[i],y[i]),5,(255,0,0),1)

cv2.imshow("hough",image),cv2.waitkey(0)

print ("rho=, theta="

.format(rho, np.rad2deg(theta)))

使用霍夫變換檢測直線具體步驟:

彩色影象->灰度圖

去噪(高斯核)

邊緣提取(梯度運算元、拉普拉斯運算元、canny、sobel)

二值化(判斷此處是否為邊緣點,就看灰度值==255)

對映到霍夫空間(準備兩個容器,乙個用來展示hough-space概況,乙個陣列hough-space用來儲存voting的值,因為投票過程往往有某個極大值超過閾值,多達幾千,不能直接用灰度圖來記錄投票資訊)

取區域性極大值,設定閾值,過濾干擾直線

繪製直線、標定角點

houghlinesp函式用法

lines = cv2.houghlinesp(edges,1,np.pi/180,10,minlinelength,maxlinegap)#返回的是所有檢測到的直線,每乙個元素line是乙個[x1,y1,x2,y2]的list

霍夫變換原理及OpenCV實現

霍夫變換 hough transform 是影象處理中的一種特徵提取技術,它通過一種投票演算法檢測具有特定形狀的物體。該過程在乙個引數空間中通過計算累計結果的區域性最大值得到乙個符合該特定形狀的集合作為霍夫變換結果。霍夫變換於1962年由paul hough 首次提出 53 後於1972年由rich...

霍夫變換 hough transform 原理

計算機視覺中經常需要識別或者定位某些幾何圖形,比如直線 圓 橢圓,還有其他一些圖形。檢測直線的霍夫變換提供了在影象中尋找直線的一種演算法,是最簡單的一種情形,後來發展到檢測圓 橢圓 還有一般圖形的霍夫變換,其核心思想是把影象中屬於某種圖形的點集 二維 對映到乙個點 可以是高維 上,這個點記錄了點集中...

OpenCV 霍夫線變換 霍夫圓變換

關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...