直線檢測Hough Line Transform and Hough Circle Transform in opencv_python
阿新 • • 發佈:2018-12-29
Hough Line Transform
由於直角座標系下存在,當直線垂直於x軸時,引數空間將無法表示該直線的情況。因此在opencv中選擇用極座標系來檢測直線。
每條直線都可以準確的由
和
來表示。那麼用grid的方式劃分引數空間。橫軸為
,取值為0到180。若取精度為1度,那麼就將引數空間劃分為180列;縱軸為
,取值為0到影象對角線長度。若取精度為1,就將引數空間劃分為
行。
通過投票機制,在引數空間中進行投票,找到直線位置。
import cv2 as cv
import numpy as np
img = cv.imread(cv.samples.findFile('sudoku.png'))
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)#RGB 轉灰度圖
edges = cv.Canny(gray,50,150,apertureSize = 3)#邊緣檢測
lines = cv.HoughLines(edges,1,np.pi/180,200)#直線檢測
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))
cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv.imwrite('houghlines3.jpg',img)
Hough Circle Transform
尋找圓的方式與上面同理。圓的公式如下,
式中
是圓的中心,r是半徑,由這三個引數組成了三維引數空間。用與上面相同的方式可以找到圖中圓的位置。
import numpy as np
import cv2 as cv
img = cv.imread('opencv-logo-white.png',0)
img = cv.medianBlur(img,5)#中值濾波
cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)#轉灰度
circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,20,
param1=50,param2=30,minRadius=0,maxRadius=0)#霍夫曼圓形檢測
circles = np.uint16(np.around(circles))#取整
for i in circles[0,:]:
# draw the outer circle
cv.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv.imshow('detected circles',cimg)
cv.waitKey(0)
cv.destroyAllWindows()