理解霍夫变换

时间:2017-05-05 12:51:56

标签: image matlab image-processing computer-vision hough-transform

我正在尝试理解用于Hough变换的MATLAB代码。

enter image description here

在此图片中我清楚了一些项目

  1. binary_imageinput_image的单色版本。
  2. hough_lines是包含图像中检测到的线条的矢量。我看到了,已检测到四条线。
  3. T包含图片(ϴ, ρ)空间中的thetas。
  4. R包含图片(ϴ, ρ)空间中的rhos。
  5. 我有以下问题,

    1. 为什么在应用Hough变换之前旋转图像?
    2. H中的条目代表什么?
    3. 为什么H(霍夫矩阵)大小为45x180?这个尺寸来自哪里?
    4. 为什么T大小为1x180?这个尺寸来自哪里?
    5. 为什么R大小为1x45?这个尺寸来自哪里?
    6. P中的条目代表什么?他们是(x, y)还是(ϴ, ρ)
      29 162
      29 165
      28 170
      21  5
      29 158
      
    7. 为什么值5传递到houghpeaks()
    8. ceil(0.3*max(H(:)))背后的逻辑是什么?
    9. 相关的源代码

      %   Read image into workspace.
      input_image  = imread('Untitled.bmp');
      
      %Rotate the image.
      rotated_image = imrotate(input_image,33,'crop');
      
      % convert rgb to grascale
      rotated_image = rgb2gray(rotated_image);
      
      %Create a binary image.
      binary_image = edge(rotated_image,'canny');
      
      %Create the Hough transform using the binary image.
      [H,T,R] = hough(binary_image);
      
      %Find peaks in the Hough transform of the image.
      P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
      
      %Find lines
      hough_lines = houghlines(binary_image,T,R,P,'FillGap',5,'MinLength',7);    
      
      % Plot the detected lines
      figure, imshow(rotated_image), hold on
      max_len = 0;
      
      for k = 1:length(hough_lines)
         xy = [hough_lines(k).point1; hough_lines(k).point2];
         plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
      
         % Plot beginnings and ends of lines
         plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
         plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
      
         % Determine the endpoints of the longest line segment
         len = norm(hough_lines(k).point1 - hough_lines(k).point2);
         if ( len > max_len)
            max_len = len;
            xy_long = xy;
         end
      end
      
      % Highlight the longest line segment by coloring it cyan.
      plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');
      

1 个答案:

答案 0 :(得分:8)

这些是一些很好的问题。以下是我的答案:

  

为什么在应用Hough变换之前旋转图像?

我不相信这是MATLAB"官方的例子"。 I just took a quick look at the documentation page for the function。我相信你从另一个我们无法访问的网站上删除了这个。在任何情况下,通常在使用Hough变换之前不必旋转图像。霍夫变换的目标是在任何方向上找到图像中的线条。旋转它们不应该影响结果。但是,如果我猜测旋转是作为先发制人的措施而执行的,因为"示例图像中的线条"很可能是顺时针以33度角定向的。执行反向旋转会使线条或多或少直线。

  

H中的条目代表什么?

H就是所谓的accumulator matrix。在我们了解H的目的以及如何解释矩阵之前,您需要知道Hough变换的工作原理。通过霍夫变换,我们首先对图像执行边缘检测。在您的情况下使用Canny边缘检测器完成此操作。如果您回想起Hough变换,我们可以使用以下关系来参数化一行:

rho = x*cos(theta) + y*sin(theta)

xy是图片中的点,通常它们是边缘点。 theta将是从原点会议绘制的线与通过边缘点绘制的线的交点所形成的角度。 rho将是从原点到(x, y)theta角度绘制的此线的垂直距离。

请注意,该等式可以在(x, y)处产生无穷大的许多行,因此将可能的角度总数加到预定义量或将其离散化为预定量。默认情况下,MATLAB假设 180 可能的角度范围为[-90, 90),采样因子为1.因此[-90, -89, -88, ... , 88, 89]rho。你通常做的是每个边缘点,你搜索预定数量的角度,确定相应的rho是什么。之后,我们会计算您看到每个thetarho对的次数。这是维基百科的一个简单示例:

来源:Wikipedia: Hough Transform

在这里,我们看到三个黑点沿着直线。理想情况下,霍夫变换应确定这些黑点一起形成一条直线。为了让您了解计算结果,请查看30度的示例。先前咨询,当我们延伸一条线,其中从原点到该线的角度是通过每个点30度时,我们找到从该线到原点的垂直距离。

现在有趣的是,如果你看到每个点的垂直距离为60度,那么距离在大约80个像素处或多或少相同。看到这三个点中的每个点的thetaI对是Hough变换背后的驱动力。此外,上述公式的优点在于它会隐式找到你的垂直距离。

霍夫变换的过程非常简单。假设我们有一个边缘检测图像theta和一组角度For each point (x, y) in the image: For each angle A in the angles theta: Substitute theta into: rho = x*cos(theta) + y*sin(theta) Solve for rho to find the perpendicular distance Remember this rho and theta and count up the number of times you see this by 1

rho

理想情况下,如果我们的边缘点遵循直线,我们应该会看到thetaH对,其中我们看到此对的次数相对较高。 这是累加器矩阵rho 的目的。行表示唯一的theta值,列表示唯一的theta值。

这方面的一个例子如下所示:

enter image description here

来源:Google Patents

因此,使用此矩阵中的一个示例,位于rho之间25 - 30之间,rho, theta为4 - 4.5,我们发现有8个边缘点可以用一条线来表征给定rho范围对。

请注意,rho的范围也是无限多的值,因此您不仅需要限制rho的范围,还需要将rhorho进行离散化。采样间隔。 MATLAB中的默认值为1.因此,如果计算rho值,它将不可避免地具有浮点值,因此您删除小数精度以确定最终rho。 对于上面的示例,theta分辨率为0.5,因此这意味着,例如,如果您计算的theta值介于2到2.5之间,则它落在第一列中。另请注意,rho值以5为间隔进行分箱。您传统上会以theta采样间隔为1来计算Hough变换,然后将这些分箱合并在一起。但是对于MATLAB的默认值,bin大小为1.此累加器矩阵告诉您边缘点适合特定rhotheta组合的次数。因此,如果我们看到许多点已映射到特定的rho = x*cos(theta) + y*sin(theta)H值,则此行在此处检测到的行很有可能,并且由D = sqrt(rows^2 + cols^2)定义。< / p>

  

为什么rows(霍夫矩阵)大小为45x180?这个尺寸来自哪里?

这是前一点的结果。请注意,我们期望从原点到图像中任何一点的最大距离受图像对角线的限制。这是有道理的,因为从左上角到右下角,或从左下角到右上角,将为您提供图像中预期的最大距离。通常,这被定义为cols,其中rho-round(D)是图像的行和列。

对于MATLAB默认值,round(D)的范围是从D = sqrt(16^2 + 16^2) = 22.45跨越到D,步长为1.因此,您的行和列都是16,因此-22 ...因此22的范围将从rhotheta,因此会产生45个唯一[-90, 90)值。请记住,H的默认分辨率来自45 x 180(步长为1),从而产生180个唯一角度值。有了这个,我们在累加器矩阵中有45行和180列,因此T-90

  

为什么89大小为1x180?这个尺寸来自哪里?

这是一个数组,可以告诉您在Hough变换中使用的所有角度。这应该是一个从Rrho的数组,步长为1.

  

为什么-22大小为1x45?这个尺寸来自哪里?

这是一个数组,它告诉您在Hough变换中使用的所有22值。这应该是一个从H跨越rho的数组,步长为1.

您应该从中获取的是theta中的每个值都会确定我们看到特定的R(i) <= rho < R(i + 1)T(j) <= theta < T(j + 1)对的次数,以便ijrho从1到44,theta跨度从1到179,这决定了我们在P(x, y)的特定范围内看到边缘点的次数(ϴ, ρ)之前已定义。

  

P中的条目代表什么?他们是houghpeaks还是P

29 162 29 165 28 170 21 5 29 158 rho函数的输出。基本上,这通过找到累加器矩阵中的峰值发生的位置来确定可能的线。这为您提供了theta中存在峰值的实际物理位置。这些地点是:

rho = R(29)

每一行都为您提供了生成检测到的行所需的theta = T(162)rho = R(29)参数的网关。具体而言,第一行的特征是theta = T(165)P。第二行的特点是(x, y)(ρ, ϴ)等。要回答您的问题,P中的值既不是R也不是T。它们代表houghpeaks()中交叉引用5houghpeaks的物理位置,它会为您提供表征图像中检测到的线的参数。

  

为什么值5传递到P

ceil(0.3*max(H(:)))中的额外rho会返回您想要理想检测的总行数。我们可以看到theta是5行,对应于5行。如果你找不到5行,那么MATLAB将返回尽可能多的行。

  

{{1}}背后的逻辑是什么?

这背后的逻辑是,如果你想确定累加器矩阵中的峰值,你必须定义一个最小阈值,告诉你特定的{{1}}和{{1}}组合是否会被认为是有效线。将此阈值设置得太低会报告大量错误行并使此阈值过高会错过许多行。他们决定在这里做的是找到累加器矩阵中最大的bin计数,占30%,采用数学上限和累加器矩阵中任何大于这个数量的值,那些就是候选行。

希望这有帮助!