HoughLines 中 rho 和 theta 参数的解释

问题描述 投票:0回答:3

你能给我一个

rho
theta
参数在OpenCV的HoughLines函数中的快速定义吗

void cv::HoughLines (   InputArray  image,
    OutputArray     lines,
    double  rho,
    double  theta,
    int     threshold,
    double  srn = 0,
    double  stn = 0,
    double  min_theta = 0,
    double  max_theta = CV_PI 
)

我在文档中发现的唯一内容是:

rho:累加器的距离分辨率(以像素为单位)。

theta:累加器的角度分辨率(以弧度为单位)。

这是否意味着如果我设置

rho=2
那么我的图像像素的 1/2 将被忽略......一种步幅 = 2 ?

opencv image-processing hough-transform
3个回答
32
投票

我已经搜索了几个小时,但仍然没有找到一个对其进行清晰解释的地方。但收拾残局,我想我明白了。

该算法遍历每个 edge 像素(例如 Canny 的结果),并使用方程

ρ
计算
ρ = x * cosθ + y * sinθ
,对于
θ
的许多值。

θ
的实际步长由函数参数定义,因此,如果您使用通常的
math.pi / 180.0
值,算法将针对图像中的一个边缘像素总共计算
ρ
180 次。如果您使用更大的 theta,计算量会更少,累加器列/桶也会更少,因此找到的行也会更少。

另一个参数

ρ
定义了累加器一行的“胖”程度。如果值为 1,则表示您希望累加器行数等于可能的最大
ρ
,即您正在处理的图像的对角线。因此,如果对于
θ
的某些两个值,您获得了接近的
ρ
值,它们仍然会进入单独的累加器桶中,因为您追求的是精度。对于较大的参数 rho 值,这两个值可能最终会出现在同一个存储桶中,这最终会给您带来更多的行,因为更多的存储桶将具有较大的投票数,因此会超过阈值。

一些有用的资源:

http://docs.opencv.org/3.1.0/d6/d10/tutorial_py_houghlines.html

https://www.mathworks.com/help/vision/ref/houghtransform.html

https://www.youtube.com/watch?v=2oGYGXJfjzw


0
投票

要使用霍夫变换检测直线,最好的方法是用两个参数 rho 和 theta 的方程来表示直线,如图所示。等式如下:

x cosu2061(θ)+y sinu2061(θ)=ρ

其中 (x,y) 是线参数。

这种 (θ,ρ) 参数的写法使得检测比 y=a*x+b 的写法更少依赖于位置

(θ,ρ) 在这种情况下给出这两个参数的离散化


0
投票

我知道这是一篇非常旧的帖子,但无论如何我想分享我的发现。

检测到的线的输出图像的分辨率(累加器)基本上由 ρ (rho) 和 θ (theta) 参数控制。

其中 ρ (rho) 负责以像素为单位的分辨率。 θ (theta) 负责以天使为单位的分辨率。

低 rho 值 > 更小的细胞 > 更高分辨率 > 更高精度的线条检测 > 更长的计算时间

Cells:是累加器中的元素。 每个单元格都有多个 (θ,ρ) 值,其中 theta 是角度,rho 是距离,正如您所知,可能存在的线的坐标。

所以基本上在计算完成后,单元格充当可能存在的行的“投票”,而累加器是单元格投票的“投票场所”。 对这些参数 (θ,ρ) 的投票越高,这些参数 (θ,ρ) 上存在一条线的可能性就越大。

总之,将 (θ,ρ) 视为 (x,y) 的平面,其中为每个边缘像素绘制了波(圆),并且它们在特定点上相互交叉越多,就越像一条线在那里。

左图像 XY 平面,

  • 橙色:图像中绘制的线条
  • 绿色: 橙色线上的一个点
  • 蓝色:橙色线上的另一个点

右图像 (θ,ρ) 平面,

  • 绿色:从左图中的绿点绘制的一条线(该线代表绿点)
  • 蓝色:从左图中的蓝点绘制的一条线(该线代表蓝点) — 橙色: 绿线和蓝线相交产生的点。

Image

© www.soinside.com 2019 - 2024. All rights reserved.