1. 程式人生 > >直線檢測Hough Line Transform and Hough Circle Transform in opencv_python

直線檢測Hough Line Transform and Hough Circle Transform in opencv_python

Hough Line Transform

由於直角座標系下存在,當直線垂直於x軸時,引數空間將無法表示該直線的情況。因此在opencv中選擇用極座標系來檢測直線。
ρ = x c o s

θ + y s i n θ ρ=xcosθ+ysinθ
每條直線都可以準確的由 ρ ρ θ θ 來表示。那麼用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

尋找圓的方式與上面同理。圓的公式如下,
( x x c e n t e r ) 2 + ( y y c e n t e r ) 2 = r 2 (x−xcenter)2+(y−ycenter)2=r2
式中 ( x c e n t e r , y c e n t e r ) (xcenter,ycenter) 是圓的中心,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()