728x90

허프변환

- 간단히 말하면 직선 검출 알고리즘

- x-y 좌표계상에 존재하는 점들을 극 좌표계상의 직선으로 변환

- 극 좌표계상 이 직선들의 교점이 이미지의 직선

 

import cv2
import numpy as np

img = cv2.imread('./res/dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

lines = cv2.HoughLines(edges,1,np.pi/180,200)
for line in lines:
    rho = line[0,0]
    theta = line[0,1]
    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(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imshow("img", img);
cv2.waitKey(0);
cv2.destroyAllWindows();
#cv2.imwrite('houghlines3.jpg',img)

 

 

 

 

확률론적 허프 변환

- 확률적 허프 변환은 허프 변환의 최적화 기법중 하나

- 확률적 허프 변환에서는 모든 점을 고려하지 않고, 직선 검출에 충분한 임의의 점들의 부분 집합을 사용

- 아래와 같이 허프 공간 상에서 모든 점이 아닌 일부만 존재, 대신 임계치를 줄임.

 

 

 

 

import cv2
import numpy as np

img = cv2.imread('./res/dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    x1 = line[0,0]
    y1 = line[0,1]
    x2 = line[0,2]
    y2 = line[0,3]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

#cv2.imwrite('houghlines5.jpg',img)
cv2.imshow("img", img);
cv2.waitKey(0);
cv2.destroyAllWindows();

 

 

 

허프 변환을 이용한 원 검출

- 원은 수학적으로 아래와 같이 표현

- 위 식에서 3개의 파라미터 x_center, y_center, r을 구하려면 3D 누적기가 필요한데, 대신 opencv에서는 에지의 경사 정보를 이용한 허프 그라디언트 방법이 있습니다.

- cv2.HoughCircles()함수로 원 검출하는 예제는 아래와 같습니다.

 

import numpy as np
import cv2

img = cv2.imread('./res/opencv_logo.png',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.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
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

300x250

+ Recent posts