Opencv Hough變換找直線和圓

2021-09-05 10:51:42 字數 3914 閱讀 6482

目錄題目

解決方法

完整**

hough引數詳解 總結

參考用霍夫變換找出影象中的直線和圓(用彩色直線和圓標記在原圖上)。要求有**,有注釋,有過程、有結果

# 1.載入,轉為二值圖

gray = cv2.cvtcolor(img, cv2.color_bgr2gray)  # 由於canny只能處理灰度圖,所以將讀取的影象轉成灰度圖。

gray = cv2.gaussianblur(gray, (3, 3), 0)  # 用高斯平滑處理原影象降噪。

# 2.1.霍夫直線變換

lines = cv2.houghlinesp(edges, 1, np.pi / 180, 25, minlinelength=19, maxlinegap=17)

'''rho: 線段以畫素為單位的距離精度,推薦用1.0

minlinelength:表示直線長度的閾值,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少

maxlinegap:同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),小於了設定值,則把兩條線段當成一條線段

返回值為直線的起點和終點。

'''# 2.2.霍夫圓變換

circles = cv2.houghcircles(edges, cv2.hough_gradient, 1, 100, param2=30)

circles = np.int0(np.around(circles))

# 3.將檢測到的畫出來

lines1 = lines[:, 0, :]  # 提取為二維

for x1, y1, x2, y2 in lines1[:]:

cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

for i in circles[0, :]:

cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2)  # 畫出外圓

# cv2.circle(img, (i[0], i[1]), 2, (0, 255, 0), 3)  # 畫出圓心

# 1.載入,轉為二值圖

gray = cv2.cvtcolor(img, cv2.color_bgr2gray) # 由於canny只能處理灰度圖,所以將讀取的影象轉成灰度圖。

cv2.imshow('gray', gray)

gray = cv2.gaussianblur(gray, (3, 3), 0) # 用高斯平滑處理原影象降噪。

cv2.imshow('gaussian smoothing', gray)

edges = cv2.canny(gray, 70, 220)

cv2.imshow('edges', edges)

# 2.1.霍夫直線變換

lines = cv2.houghlinesp(edges, 1, np.pi / 180, 25, minlinelength=19, maxlinegap=17)

'''rho: 線段以畫素為單位的距離精度,推薦用1.0

minlinelength:表示直線長度的閾值,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少

maxlinegap:同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),小於了設定值,則把兩條線段當成一條線段

返回值為直線的起點和終點。

'''

# 2.2.霍夫圓變換

circles = cv2.houghcircles(edges, cv2.hough_gradient, 1, 100, param2=30)

circles = np.int0(np.around(circles))

# 3.將檢測到的畫出來

lines1 = lines[:, 0, :] # 提取為二維

for x1, y1, x2, y2 in lines1[:]:

cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

for i in circles[0, :]:

cv2.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2) # 畫出外圓

# cv2.circle(img, (i[0], i[1]), 2, (0, 255, 0), 3) # 畫出圓心

cv2.imshow('result', img)

cv2.waitkey(0)

cv2.houghcircles(image,method,dp,mindist[, circles[,param1, param2[,minradius[,maxradius]]]]])
其返回n個圓的資訊儲存在1×n×的ndarray。

image不用多說,輸入矩陣

methodcv2.hough_gradient 也就是霍夫圓檢測,梯度法

dp計數器的解析度影象畫素解析度與引數空間解析度的比值(官方文件上寫的是影象解析度與累加器解析度的比值,它把引數空間認為是乙個累加器,畢竟裡面儲存的都是經過的畫素點的數量),dp=1,則引數空間與影象畫素空間(解析度)一樣大,dp=2,引數空間的解析度只有畫素空間的一半大

mindist圓心之間最小距離,如果距離太小,會產生很多相交的圓,如果距離太大,則會漏掉正確的圓

param1canny檢測的雙閾值中的高閾值,低閾值是它的一半(如果你的圓找不到,可以將該引數變小點)

param2最小投票數(基於圓心的投票數)

minradius需要檢測院的最小半徑

maxradius需要檢測院的最大半徑

我對hough變換的理解:你的圓一定要非常明顯,通過影象處理的方式將圓的邊界變得足夠清晰,然後使用hough變換才有效。  

Hough變換檢測直線和圓

1 直線是如何表示的?對於平面中的一條直線,在直角座標系中,常見的有點斜式,兩點式兩種表示方法。然而在hough變換中,考慮的是另外一種表示方式 使用極座標 r,theta 來表示一條直線。其中r為該直線到原點的距離,theta為該直線的垂線與x軸的夾角。如下圖所示。2 如果座標系中有多個點,又怎樣...

Hough 變換檢測直線

hough 變換檢測直線的基本原理是 對x y 座標系下的每一點 x,y 對應極座標下為 rho x cos theta y sin theta 1 因此,對x y平面內的每一點,對應到極座標系則為一條直線,如果直角座標系下的點共線,則在極座標的直線會相交於一點。因此,求得極座標下相交最多的點,rh...

Hough變換檢測直線

1 基本原理 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一,即它可以檢測已知形狀的目標,而且受雜訊和曲線間斷的影響小。hough變換的基本思想是利用點 線的對偶性。如下圖1所示 從圖1中可看出,x y座標和k b座標有點 線的對偶性。x y座標中的點p1 p2對應於k b座標中的l1...