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
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 중간 정리 (0) | 2020.08.15 |
---|---|
opencv-python 튜토리얼 - 19. 워터셰드 알고리즘으로 영상 분할 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 17. 탬플릿 매칭 (0) | 2020.08.15 |
opencv-python 튜토리얼 - 16. 푸리에 변환 (2) | 2020.08.15 |
opencv-python 튜토리얼 - 15. 히스토그램 (0) | 2020.08.15 |