Меня удивляет тот факт, что я не могу найти какую-либо онлайн-реализацию алгоритма преобразования Хафа, как описано здесь . Opencv реализует детектор строк с использованием преобразования Хафа, но не предоставляет никакой функции, которая выполняет преобразование в пространство Хафа без обнаружения линии после.
Поэтому я сам реализовал наивную версию, где seg_map - это пустой массив, содержащий 0
и 1
:
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 алгоритм для выполнения только преобразования Хафа без обнаружения линии? Я знаю, что OpenCV-версия кода имеет открытый исходный код, но она реализована на C ++.
Помимо параллелизации или реализации без Python, есть ли в моем коде что-то неэффективное идолжен быть изменен?