(<-결과. 같은 edge는 같은 색!)
(빨간색 원이 다 edge.)
import cv2 as cv
import numpy as np
img = cv.imread("edge.png", cv.IMREAD_GRAYSCALE)
H, W = img.shape[:]
output = np.zeros((H, W), img.dtype)
sum_max = 0
theta_at_max = 0
rho_at_max = 0
# 1. 행렬 생성
cm = np.zeros((100,H+W+1), img.dtype)
# 2. 누적 행렬 구성
for y in range(H):
for x in range(W):
if img[y, x] == 255:
for t in range(100):
theta = np.pi / 100 * t
# the normal represtentaion of a line
rho = x * np.cos(theta) + y * np.sin(theta)
r = int(rho + (H+W+1)/2) # x좌표 값은 음수가 아닌 정수가 들어가야 하므로 중간 값을 더해줌.
cm[t, r] = cm[t, r] +1
if(sum_max < cm[t, r]) :
sum_max = cm[t, r]
theta_at_max = theta
rho_at_max = rho
# 3. 허프 누적 행렬의 최댓값 선정 알고리즘 작성
# theta, rho 값 획득
theta = theta_at_max
rho = rho_at_max
# 4. 획득한 라인 그리기
for j in range(W):
y = (rho - j * np.cos(theta))/np.sin(theta)
output[int(y + 0.5), j] = 255 #반올림
cv.imshow("input", img)
cv.imshow("output", output)
cv.waitKey(0)