Hough transform
Hough Transform 이란 영상에 있는 점들이 이루는 직선들 중 가장 많이 겹치는 부분을 추출하는 변환규칙입니다.
허프 변환(Hough transform)은 디지털 화상 처리, 컴퓨터 비전 등에서 사용하는 용어이다. 이미지에서 직선을 검출하기 위한 용도로 사용된다.
OpenCV function
HoughCircles Example
# import the necessary packages
import numpy as np
import argparse
import cv2
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())
# load the image, clone it for output, and then convert it to grayscale
image = cv2.imread(args["image"])
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# detect circles in the image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 100)
# ensure at least some circles were found
if circles is not None:
# convert the (x, y) coordinates and radius of the circles to integers
circles = np.round(circles[0, :]).astype("int")
# loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
# draw the circle in the output image, then draw a rectangle
# corresponding to the center of the circle
cv2.circle(output, (x, y), r, (0, 255, 0), 4)
cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
# show the output image
cv2.imshow("output", np.hstack([image, output]))
cv2.waitKey(0)
Run python code:
Line find example
import cv2
import numpy as np
img = cv2.imread('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 rho,theta in lines[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))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imwrite('houghlines3.jpg',img)
Probabilistic Hough Transform:
import cv2
import numpy as np
img = cv2.imread('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 x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imwrite('houghlines5.jpg',img)
See also
- OpenCV
- Canny Edge Detection
- Image Processing
- Image Contours (이미지 윤곽선 추출)
- Lane Detection
- MinAreaQuadrilateral - cv2.minAreaRect 의 문제점 허프 변환을 사용하여 보완한 알고리즘 (ddrm에서 사용).
Favorite site
OpenCV Guide
- [추천] 허프 변환 - gramman 0.1 documentation
- [추천] Python OpenCV 강좌 : 제 28강 - 직선 검출
- OpenCV #7-2 Example (허프 변환으로 영상 내 선 감지)
- OpenCV - 23. 허프 변환(Hough Transformation)
- OpenCV 를 이용한 Hough Transform 강좌
- OpenCV 직선 검출 - 허프 변환(Hough transform) 1
OpenCV Official
- OpenCV: Hough Line Transform
- OpenCV: Hough Circle Transform
- OpenCV: Object detection with Generalized Ballard and Guil Hough Transform
Samples
- [추천] python - How to detect lines in OpenCV? - Stack Overflow - 여러 예제 있다.
References
-
Eyes33.egloos.com_-OpenCV-_Hough_transform.pdf ↩