【发布时间】:2019-10-24 10:41:49
【问题描述】:
令我惊讶的是,我似乎无法找到任何 Hough 变换算法的在线实现,如 here 所述。 Opencv使用霍夫变换实现了线检测器,但没有提供任何在没有线检测之后执行变换到霍夫空间的函数。
所以我自己实现了一个简单的版本,其中 seg_map 是一个包含 0 和 1 的 numpy 数组:
def hough_transform(seg_map):
rho_step = 5
phi_step = 20 * np.pi/180
n_points_min = 2*rho_step
diag_length = np.sqrt(seg_map.shape[0]**2 + seg_map.shape[1]**2)
hough_map = np.zeros( (int(2*np.pi/phi_step),int(diag_length/rho_step)) )
Y, X = np.where(seg_map>0)
for x, y in zip(X, Y):
theta = np.arctan2(y, x)
r = np.sqrt(x**2+y**2)
for i in range(hough_map.shape[0]):
phi = i * phi_step - np.pi/2
rho = r * np.cos(theta-phi)
if rho>0:
rho_discretized = int(rho/rho_step)
hough_map[i, rho_discretized] += 1
return hough_map
但是,它非常慢(对于我的输入,霍夫变换 + 线检测的 cv2 函数比我的霍夫变换算法快 200 倍)。
所以我实际上有两个问题:
我是否错过了一个现成的 python 算法来仅执行 Hough 变换而不进行线检测?我知道OpenCV版本的代码是开源的,但是是用C++实现的。
除了并行化或非 Python 实现之外,我的代码中是否存在效率低下且应该更改的内容?
【问题讨论】:
-
除了速度之外,部分问题在于它不能很好地处理垂直线。这是正确的想法,但累加器中的目标单元更好地计算为 theta 的函数,与像素位置无关
标签: python computer-vision computational-geometry hough-transform