hough_line_peaks()中的min_distance和min_angle是什么意思?

What is the meaning of min_distance and min_angle in hough_line_peaks()?

有人可以解释一下 min_distance 和 min_angle 可选参数吗?

http://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.hough_line_peaks

对于 min_angle=n,我认为它会检查下一个角度的线是否至少优于我的 theta 数组中的 n 个元素以被接受。

import numpy as np
from skimage.transform import hough_line,hough_line_peaks

iden = np.identity(200)
hspace, angles, dists = hough_line(iden,theta=np.linspace(-np.pi/2,np.pi/2,1800)) # 0.1 degree resolution
hspace, angles, dists = hough_line_peaks(hspace, angles, dists,min_distance=0,min_angle=20) # 2 degree minimum before accepting as new line?  
print(hspace, angles*180/np.pi, dists)

输出:[200 126 124] [-44.9749861 -45.27515286 -44.67481934] [ 0.50088496 -0.50088496 1.50265487]

角度数组表明我弄错了。该参数只接受整数,我不确定它可能是什么......

我不认为函数 hough_line_peaks() 本身有什么问题。

min_anglemin_distance 定义一个已找到的峰周围的区域,在该区域中找不到其他峰(即,您认为与另一个峰接近的峰实际上是单个峰独特的峰)

在霍夫变换的累加器中,2个维度是:角度和距离。您基本上用整数设置累加器中必须在已找到的峰值周围忽略的箱数。

通过将 min_distance 设置为 0,您只是避免获得 2 个具有完全相同的距离参数和角度参数差异小于 20 * angle_resolution ~= 20 * 0.1 = .2 的峰。返回的 3 个峰中的 None 具有相同的距离参数,因此符合您设置的条件。

此外,请注意您的角度分辨率并不完全是 0.1 度,除非 np.linspace 中的第三个参数是 1801。这就是 np.linspace 的行为方式,你给它总点数。 hough_line_peaks 只是将返回的向量作为输入参数。您还可以使用 np.arange,它允许您将 step 作为参数传递。

编辑

返回的角度数组为 度 ?!?。我希望输入的弧度......这些值应该对应于 np.linspace(-np.pi/2, np.pi/2, 1800).

的一些值

编辑结束

基本上,它是这样工作的:

  • 在累加器中找到最大值-> 200, -44.9749861, 0.50088496200表示已将200个像素分配给累加器的这个bin)
  • 将峰值 bin [bin - min_dist: bin + min_dist, bin - min_angle:bin + min_angle] 周围的累加器 bin 设置为 0
  • 求累加器中的第二大值,依此类推。

编辑 2:

为什么结果 accumulator_value = [200 126 124]angle_params = [a b c]dist_params = [d e f](对于所有 def 例如 d != ee != f) 与参数 min_angle = Xmin_distance = 0

不矛盾

在 binangle_param = adist_param = d.

处找到累加器中最强的峰

第二个峰值的搜索将通过丢弃累加器中的这个 bin 以及位于多个 bin 的 bin <= X(旁注:有可能是X/2 但这不会改变这里的推理)在角度 "direction" 上和在距 "peak's" 箱的距离 "direction" 上的多个箱 <= 0 上。

仅此而已。因此,在您的案例中发现的其他峰位于距离参数与发现的任何其他峰不同的容器中。因此没有理由丢弃它们。

累加器只是一个二维 table bin,一个方向代表角度,另一个方向代表距离。