你如何将X,Y点转换为Rho,Theta在C中进行霍夫变换?

时间:2013-06-07 00:58:00

标签: c hough-transform

所以我试图在C上编码Hough变换。我有一个二进制图像并从图像中提取了二进制值。现在做霍夫变换我必须将图像中的[X,Y]值转换为[rho,theta]来进行形式的参数变换

RHO = xcos(THETA)+ ysin(THETA)

我不太明白它是如何实际转换的,看看其他在线代码。任何帮助解释算法以及如何根据[X,Y]完成[rho,theta]值的累加器将不胜感激。谢谢。提前。 :)

1 个答案:

答案 0 :(得分:9)

您的问题暗示您认为需要将图像中的每个(X,Y)兴趣点映射到Hough中的 ONE (rho,theta)向量这一事实空间

事实是,图像中的每个点都映射到曲线,即霍夫空间中的 SEVERAL 向量。每个输入点的向量数取决于您决定的某些“任意”分辨率。例如,对于1度分辨率,您将在Hough空间中获得360个向量。

对于(rho,theta)向量,有两种可能的约定:要么使用θ的[0,359]度范围,并且在这种情况下rho总是正的,或者你使用[0,179]度为θ和允许rho为正面或负面。后者通常用于许多实现中。

一旦你理解了这一点,累加器只不过是一个二维数组,它涵盖了(rho,theta)空间的范围,以及每个单元格用0初始化的位置。 用于计算输入中不同点的各种曲线共有的向量数

因此,该算法计算输入图像中每个感兴趣点的所有360个矢量(假设θ为1度分辨率)。对于这些向量中的每一个,在将rho舍入到最接近的整数值(取决于rho维度的精度,例如,如果我们每单位有2个点,则为0.5)之后,它在累加器中找到相应的单元格,并递增该单元格中的值。
当针对所有感兴趣点完成此操作时,算法搜索累加器中具有高于所选阈值的值的所有单元。这些单元格的(rho,theta)“地址”是霍夫算法已识别的线(在输入图像中)的极坐标值。

现在,请注意,这会为您提供方程式,通常只需要弄清楚这些有效属于输入图像的行的段。

上述

的非常粗略的伪代码“实现”
Accumulator_rho_size = Sqrt(2) * max(width_of_image, height_of_image)
                          * precision_factor  // e.g. 2 if we want 0.5 precision
Accumulator_theta_size = 180  // going with rho positive or negative convention
Accumulator = newly allocated array of integers
    with dimension  [Accumulator_rho_size, Accumulator_theta_size]
Fill all cells of Accumulator with 0 value.

For each (x,y) point of interest in the input image
   For theta = 0 to 179
       rho = round(x * cos(theta) + y * sin(theta),
                   value_based_on_precision_factor)
       Accumulator[rho, theta]++

Search in Accumulator the cells with the biggest counter value
(or with a value above a given threshold) // picking threshold can be tricky

The corresponding (rho, theta) "address" of these cells with a high values are
the polar coordinates of the lines discovered in the the original image, defined
by their angle relative to the x axis, and their distance to the origin.

Simple math can be used to compute various points on this line, in particular
the axis intercepts to produce a  y = ax + b equation if so desired.

总的来说,这是一个相当简单的算法。复杂性主要在于与单元一致,例如用于度和弧度之间的转换(大多数数学库的trig函数是基于弧度的),还有关于用于输入图像的坐标系。