理解霍夫变换

use*_*312 2 matlab image image-processing computer-vision hough-transform

我试图理解MATLAB的Hough变换代码.

在此输入图像描述

在这张照片中我清楚了一些项目,

  1. binary_image是单色版input_image.
  2. hough_lines是包含图像中检测到的线条的矢量.我看到,已检测到四条线.
  3. T包含(?, ?)图像空间中的thetas .
  4. R包含(?, ?)图像空间中的rhos .

我有以下问题,

  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
    
    Run Code Online (Sandbox Code Playgroud)
  7. 为什么值5传入houghpeaks()
  8. 背后的逻辑是ceil(0.3*max(H(:)))什么?

相关的源代码

%   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');
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 8

这些是一些很好的问题.以下是我给你的答案:

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

我不相信是MATLAB的"官方例子". 我只是快速浏览了该功能的文档页面.我相信你从另一个我们无法访问的网站上删除了这个.在任何情况下,通常在使用Hough变换之前不必旋转图像.霍夫变换的目标是在任何方向上找到图像中的线条.旋转它们不应该影响结果.但是,如果我猜测旋转是作为先发制人的措施进行的,因为"示例图像"中的线很可能是顺时针以33度角定向的.执行反向旋转将使线条或多或少地变直.

这些条目H代表什么?

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

rho = x*cos(theta) + y*sin(theta)
Run Code Online (Sandbox Code Playgroud)

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

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

来源:维基百科:霍夫变换

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

现在有趣的是,如果您看到每个点的垂直距离显示为60度,则距离大约为80像素时或多或少相同.看到这一点rho并且theta对于三个点中的每一个都是Hough变换背后的驱动力.此外,上述公式的好处是它会隐式找到你的垂直距离.

Hough变换的过程非常简单.假设我们有一个边缘检测图像I和一组角度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
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

资料来源:Google专利

因此,使用来自该矩阵的示例,位于theta25-30之间rho,具有4-4.5,我们发现有8个边缘点将由给定该rho, theta范围对的线来表征.

请注意,范围rho也是无限多的值,因此您不仅需要限制rho您拥有的范围,还需要rho使用采样间隔对其进行离散化.MATLAB中的默认值为1.因此,如果计算一个rho值,它将不可避免地具有浮点值,因此您删除小数精度以确定最终值rho.对于上面的示例,rho分辨率为0.5,因此这意味着,例如,如果计算的rho值介于2到2.5之间,则它落在第一列中.另请注意,theta值以5为间隔进行分箱.传统上,您将以theta1 的采样间隔计算Hough变换,然后将这些分档合并在一起.然而,对于MATLAB的违约,块大小1.本累加器矩阵告诉你多少次的边缘点符合特定的rhotheta组合.因此,如果我们看到许多点被映射到特定值rhotheta值,那么这是一个很大的潜力,可以在这里检测到一条线,并由此定义rho = x*cos(theta) + y*sin(theta).

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

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

对于MATLAB默认值,其范围rho是从1 -round(D)到1 round(D)的步长.因此,您的行和列都是16,所以D = sqrt(16^2 + 16^2) = 22.45...所以范围D将从-2222,因此这将导致45独特的rho价值观 请记住,默认分辨率theta来自[-90, 90)(步长为1),导致180个唯一角度值.有了这个,我们在累加器矩阵中有45行和180列,因此H45 x 180.

为什么T尺寸为1x180?这个尺寸来自哪里?

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

为什么R尺寸为1x45?这个尺寸来自哪里?

这是一个数组,它告诉您rho在Hough变换中使用的所有值.这应该是一个跨越1 -22221 的数组.


你应该从中得到的是,每个值都H决定了我们看到一对特定对的次数,rho并且theta对于R(i) <= rho < R(i + 1)T(j) <= theta < T(j + 1),i从1到44 j跨越并跨越1到179,这决定了我们看到边缘的次数点为特定范围rhotheta前面所定义.


这些条目P代表什么?他们(x, y)还是(?, ?)

Phoughpeaks函数的输出.基本上,这通过找到累加器矩阵中的峰值发生的位置来确定可能的线.这为您提供了P存在峰值的实际物理位置.这些地点是:

29 162
29 165
28 170
21  5
29 158
Run Code Online (Sandbox Code Playgroud)

每行为您提供生成检测到的行所需的参数rhotheta参数.具体而言,第一行的特征是rho = R(29)theta = T(162).第二行的特点是rho = R(29)theta = T(165)等.要回答你的问题,输入的值P都不是(x, y)(?, ?).他们代表的物理位置P,其中交叉引用RT,它会给你的参数来表征图像中检测到的线.

为什么值5传入houghpeaks()

额外5输入会houghpeaks返回您想要理想检测的总行数.我们可以看到P5行,对应5行.如果找不到5行,那么MATLAB将返回尽可能多的行.

背后的逻辑是ceil(0.3*max(H(:)))什么?

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


希望这可以帮助!