利用Opencv中的Houghline方法進行直線檢測---python語言
利用Opencv中的Houghline方法進行直線檢測—python語言
這是給Python部落翻譯的文章,請在這裡看原文。
在影象處理中,霍夫變換用來檢測任意能夠用數學公式表達的形狀,即使這個形狀被破壞或者有點扭曲。
下面我們將看到利用HoughLine演算法來闡述霍夫變化進行直線檢測的原理,把此演算法應用到特點影象的邊緣檢測是可取的。邊緣檢測方法請參考這篇文章–邊緣檢測。
Houghline演算法基礎
直線可以表示為
因此任意的曲線都可以用兩個引數
HoughLine演算法原理:
- 首先建立一個二維的陣列或者累加器(用來儲存這兩個引數),並初始化為零;
- 這個二維陣列的行代表不同的
r ,而列代表角度θ ; - 陣列的大小取決於演算法的精度。假設所需角度的精度精確到
1∘ ,那麼就需要180列(直線的最大角度是180)。 - 對於
r ,最大的可能距離是影象的對角長度,因此若需要一個畫素的精度,那麼需要把行數設為影象對角線的長度。
例子:
假設一幅100x100的影象,在影象中間有一條水平直線。設直線的第一個點的座標為
對於直線上的第二個點,重複上述操作。將得到的引數對
上述演算法的過程被封裝成OpenCV函式cv2.HoughLines()
# Python program to illustrate HoughLine
# method for line detection
import cv2
import numpy as np
# Reading the required image in
# which operations are to be done.
# Make sure that the image is in the same
# directory in which this python program is
img = cv2.imread('xyz.jpg')
# Convert the img to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Apply edge detection method on the image
edges = cv2.Canny(gray,50,150,apertureSize = 3)
# This returns an array of r and theta values
lines = cv2.HoughLines(edges,1,np.pi/180, 200)
# The below for loop runs till r and theta values
# are in the range of the 2d array
for r,theta in lines[0]:
# Stores the value of cos(theta) in a
a = np.cos(theta)
# Stores the value of sin(theta) in b
b = np.sin(theta)
# x0 stores the value rcos(theta)
x0 = a*r
# y0 stores the value rsin(theta)
y0 = b*r
# x1 stores the rounded off value of (rcos(theta)-1000sin(theta))
x1 = int(x0 + 1000*(-b))
# y1 stores the rounded off value of (rsin(theta)+1000cos(theta))
y1 = int(y0 + 1000*(a))
# x2 stores the rounded off value of (rcos(theta)+1000sin(theta))
x2 = int(x0 - 1000*(-b))
# y2 stores the rounded off value of (rsin(theta)-1000cos(theta))
y2 = int(y0 - 1000*(a))
# cv2.line draws a line in img from the point(x1,y1) to (x2,y2).
# (0,0,255) denotes the colour of the line to be
#drawn. In this case, it is red.
cv2.line(img,(x1,y1), (x2,y2), (0,0,255),2)
# All the changes made in the input image are finally
# written on a new image houghlines.jpg
cv2.imwrite('houghlines3.jpg', img)
函式(cv2.HoughLines(edges, 1, np.pi/180,200)
)
- 第一個引數是輸入影象,且必須是二值影象,在進行霍夫變換之前需要採用閾值方法的邊緣檢測;
- 第二和第三個引數分別是
r,θ 對應的精度; - 第四個引數是閾值,判定為直線投票數的最小值;
- 注意,投票數取決於直線上點的個數,因此這個閾值代表了檢測到的直線的最短長度。
總結
- 在影象分析應用中,邊緣分割點的座標(即
X,Y )是已知的,在直線的引數方程中作為輸入,而r,θ 是我們要找的未知變數; - 對每一個角度
θ ,求出r 的值,也就是將笛卡爾影象空間的點對映到霍夫引數極座標空間的曲線,這種點到曲線的變換就是直線的霍夫變換; - 這種變換是通過量化霍夫引數為有限的間隔或者累加器單元來實現的,隨著演算法的執行,每一個
(X,Y) 轉換成離散的(r,θ) 曲線,曲線上的點對應的累加器(二維陣列)的值會遞增; - 累加器中的峰值就代表了影象中有相應直線的存在。
霍夫變換的應用
- 用於分離影象中特殊形狀的特徵;
- 可以容忍特徵邊界描述的誤差,並且不受噪聲的干擾;
- 廣泛用於條形碼掃描、驗證和識別。
文章作者是Pratima Upadhyay,如果你喜歡GeeksforGeeks,並且願意分享,可以利用contribute.geeksforgeeks.org寫文章,然後傳送到[email protected],在GeeksforGeeks中看到自己的文章,幫助更多的Geeks。
若發現錯誤歡迎指正,也歡迎評論。