OpenCV Python 霍夫變換

2022-04-11 15:02:57 字數 3082 閱讀 3001

霍夫變換常用來在影象中提取直線和圓等幾何形狀。如下圖:

我們下面來看看如何使用霍夫變換來檢測直線。一條直線可以用數學表示式 y = mx + 或者 ρ = xcosθ + y sinθ表示(極座標)

簡單說明一下:

ρ 是從原點到直線的垂直距離,θ是直線的垂線與橫軸順時針方向的夾角,如下圖所示:

首先建立乙個2d陣列(累加器),初始化累加器,所有的值都為0。行表示 ρ,列表示 θ。這個陣列的大小決定了最後結果的準確性。如果你希望角度精確到1°,你就需要180列。對於 ρ,最大值為對角線距離。

想象一下我們有乙個大小為100x100的直線位於影象**。取直線上的第乙個點,我們知道此處的(x,y)值,把x和y帶入公式:ρ = xcosθ + y sinθ,然後遍歷 θ 的取值0, 1, 2, 3,...,180.分別求出對應的 ρ 值,這樣我們就得到了一系列(ρ,θ)的數值對,如果這個數值對在累加器中也存在相應的位置,就在這個位置上加 1。由於同一條直線上的點必然會有同樣的(ρ,θ)。所以現在累加器中的(50,90)=1。現在取直線上的第二個點。重複上邊的過程。更新累加器中的值。現在累加器中(50,90)的值為 2。你每次做的就是更新累加器中的值。對直線上的每個點都執行上邊的操作,每次操作完成之後,累加器中的值就加 1,但其他地方有時會加 1, 有時不會。按照這種方式下去,到最後累加器中(50,90)的值肯定是最大的。如果你搜尋累加器中的最大值,並找到其位置(50,90),這就說明影象中有一條直線,這條直線到原點的距離為 50,它的垂線與橫軸的夾角為 90 度。

opencv中首先計算(r,θ) 累加數,累加數超過一定值後就認為在同一直線上(有乙個閾值)。

import cv2

import numpy

asnp# 1

.載入,轉為二值圖

2.霍夫直線變換

lines = cv2.houghlines(edges, 0.8, np.pi / 180, 90)

函式中:

# 3

.將檢測的線畫出來(注意是極座標噢)

for line in

lines:

rho, theta = line[0

] a =np.cos(theta)

b =np.sin(theta)

x0 = a *rho

y0 = b *rho

x1 = int(x0 + 1000 * (-b))

y1 = int(y0 + 1000 *(a))

x2 = int(x0 - 1000 * (-b))

y2 = int(y0 - 1000 *(a))

cv2.line(drawing, (x1, y1), (x2, y2), (

0, 0, 255))

前面的方法又稱為標準霍夫變換,它會計算影象中的每乙個點,計算量比較大,另外它得到的是整一條線,並不知道原圖中直線的端點。所以提出了概率霍夫直線變換(probabilistic hough transform),是一種改進的霍夫變換:

drawing = np.zeros(img.shape[:], dtype=np.uint8)

# 統計概率霍夫線變換

lines = cv2.houghlinesp(edges, 0.8, np.pi / 180, 90, minlinelength=50, maxlinegap=10

)# 將檢測的線畫出來

引數:cv2.line_aa:抗鋸齒線型

霍夫圓變換跟直線變換類似,只不過線是用(r,θ),圓是用(x_center,y_center,r)來表示,從二維變成了三維,資料量變大了很多;所以一般使用霍夫梯度法去減少計算量

drawing = np.zeros(img.shape[:], dtype=np.uint8)

# 霍夫圓變換

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

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

# 將檢測的圓畫出來

for i in circles[0

, :]:

cv2.circle(drawing, (i[

0], i[1]), i[2], (0, 255, 0), 2

) # 畫出外圓

cv2.circle(drawing, (i[

0], i[1]), 2, (0, 0, 255), 3

) # 畫出圓心

opencv python 霍夫線變換

hough line transform 霍夫變換是一種檢測任何形狀的流行技術,可以檢測形狀,即使它被破壞或扭曲一點點.一條線可以表示成y mx c或引數形式,像 xcos ysin 其中 是從原點到直線的垂直距離,角是由這條垂線和水平軸以逆時針的方向形成的 這個方向取決於你如何表示座標系統,這種表...

OpenCV Python 霍夫圈變換 三十三

在本章中,圓在數學上表示為 x xcen ter 2 y ycen ter 2 r2 x x cent er 2 y ycen ter 2 r 2,其中 xc ente r,yc ente r x cent er ycen ter 是圓的中心,r r是圓的半徑。從等式中,我們可以看到我們有3個引數,...

缺點 霍夫圓 霍夫變換

霍夫變換是一種特徵提取,被廣泛應用在影象分析 電腦視覺以及數字影像處理。霍夫變換是用來辨別找出物件中的特徵,例如 線條。他的演算法流程大致如下,給定乙個物件 要辨別的形狀的種類,演算法會在引數空間中執行投票來決定物體的形狀,而這是由累加空間 accumulator space 裡的區域性最大值來決定...