Python 无需行检测的Hough变换实现

Python 无需行检测的Hough变换实现,python,computer-vision,computational-geometry,hough-transform,Python,Computer Vision,Computational Geometry,Hough Transform,我感到惊讶的是,我似乎找不到任何在线实现的霍夫变换算法描述。Opencv使用Hough变换实现一个测线器,但不提供任何函数,在没有测线后执行到Hough空间的变换 所以我自己实现了一个简单的版本,其中seg_map是一个numpy数组,包含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.s

我感到惊讶的是,我似乎找不到任何在线实现的霍夫变换算法描述。Opencv使用Hough变换实现一个测线器,但不提供任何函数,在没有测线后执行到Hough空间的变换

所以我自己实现了一个简单的版本,其中seg_map是一个numpy数组,包含
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
但是,它非常慢(对于我的输入,对于Hough变换+线检测,cv2函数比我的Hough变换算法快200倍)

所以我实际上有两个问题:

  • 我是否错过了一个只执行Hough变换而不执行行检测的shelfpython算法?我知道OpenCV版本的代码是开源的,但是它是用C++实现的。
  • 除了并行化或非Python实现之外,我的代码中是否存在效率低下且应该更改的地方


    • OpenCV是开源的。请检查他们的代码,看看他们是如何实现的。如果需要,借用代码。URL在这里:

      OpenCV是开源的。请检查他们的代码,看看他们是如何实现的。如果需要,借用代码。URL在这里:

      您错过了。它是scipy的一个补充,完全用于附加基本变换和类似变换。具体来说,该函数执行转换。您可以在此处找到一个示例:

      如果你决定去,标准的Hough变换是在C++中实现的:()。它的功能与scikit映像中的一个Cython实现相同:()。

      您错过了。它是scipy的一个补充,完全用于附加基本变换和类似变换。具体来说,该函数执行转换。您可以在此处找到一个示例:


      如果你决定去,标准的Hough变换是在C++中实现的:()。它与CISKITION图像中的一个Cython实现功能相同:()./P>当然,但是OpenCV是用C++实现的。我认为我不够清楚,所以我编辑了这个问题:我想要一个Python实现(它不是一个C++实现的包装器)。如果你看一下文档,你会看到它有C++和Python的代码。在OpenCV文档中搜索直线和圆的Hough列表。后者是AT和@ FMW42:其实是C++实现的,@ FMW42,您共享的页面上的代码只是使用OpenCV函数的一个例子(实际上您可以用Python调用)。但这不是一个实现。如果我提供代码,我会发布一个答案。我向您展示了链接,作为您可以找到文档的示例。你说没有。每个方法的OpenCV文档都显示了C++和Python方法。当然,但是OpenCV是用C++实现的。我认为我不够清楚,所以我编辑了这个问题:我想要一个Python实现(它不是一个C++实现的包装器)。如果你看一下文档,你会看到它有C++和Python的代码。在OpenCV文档中搜索直线和圆的Hough列表。后者是AT和@ FMW42:其实是C++实现的,@ FMW42,您共享的页面上的代码只是使用OpenCV函数的一个例子(实际上您可以用Python调用)。但这不是一个实现。如果我提供代码,我会发布一个答案。我向您展示了链接,作为您可以找到文档的示例。你说没有。每个方法的OpenCV文档都显示了C++和Python方法。问题的一部分,除了速度之外,就是它不能很好地处理垂直线。这是一个正确的想法,但是累加器中的目标单元更好地作为θ的函数进行计算,与像素位置无关。问题的一部分,除了速度,是这不能很好地处理垂直线。这是一个正确的想法,但累加器中的目标单元最好作为θ的函数进行计算,与像素位置无关