【问题标题】:Hough transform implementation without line detection没有线检测的霍夫变换实现
【发布时间】:2019-10-24 10:41:49
【问题描述】:

令我惊讶的是,我似乎无法找到任何 Hough 变换算法的在线实现,如 here 所述。 Opencv使用霍夫变换实现了线检测器,但没有提供任何在没有线检测之后执行变换到霍夫空间的函数。

所以我自己实现了一个简单的版本,其中 seg_map 是一个包含 01 的 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


【解决方案1】:

OpenCV 是开源的。请检查他们的代码,看看他们是如何实现的。如果需要,借用代码。网址在这里:https://github.com/opencv/opencv

【讨论】:

  • 当然,但是 OpenCV 是用 C++ 实现的。我想我还不够清楚,所以我编辑了这个问题:我想要一个 Python 实现(它不会是 C++ 实现的包装器)
  • 如果您查看文档,您会看到它包含 C++ 和 Python 的代码。在 OpenCV 文档中搜索线和圆的 Hough 列表。后者位于docs.opencv.org/4.1.1/dd/d1a/…docs.opencv.org/4.1.1/d4/d70/tutorial_hough_circle.html
  • @fmw42: 显然是用 C++ 实现的。
  • @fmw42,您分享的页面上的代码只是使用 OpenCV 函数的示例(您确实可以在 Python 中调用)。但这不是一个实现。
  • 如果我要提供代码,我会发布答案。我向您展示了链接作为您可以找到文档的示例。你说没有。每种方法的 OpenCV 文档都显示了 C++ 和 Python 方法。
【解决方案2】:

你错过了scikit-image。它是 scipy 的补充,完全用于附加的基本转换和类似的。具体来说,hough_line 函数执行转换。你可以在这里找到一个例子:https://scikit-image.org/docs/dev/auto_examples/edges/plot_line_hough_transform.html

如果您决定使用@lennik's advice,则标准 Hough 变换在此处用 C++ 实现:https://github.com/opencv/opencv/blob/3.4/modules/imgproc/src/hough.cpp#L163 (permalink)。它与 scikit 镜像中的一个 Cython 实现具有相同的功能:https://github.com/scikit-image/scikit-image/blob/v0.18.x/skimage/transform/_hough_transform.pyx#L245 (permalink)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多