理解霍夫变换[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解霍夫变换[关闭]相关的知识,希望对你有一定的参考价值。

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

enter image description here

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

  1. binary_imageinput_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
  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');
答案

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

为什么在应用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是什么。之后,我们计算你看到每个rhotheta对的次数。这是从维基百科中提取的一个简单示例:

资料来源:Wikipedia: Hough Transform

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

现在有趣的是,如果您看到每个点的垂直距离显示为60度,则距离大约为80像素时或多或少相同。看到这三个点中的每个点的rhotheta对是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

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

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

enter image description here

资料来源:Google Patents

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

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

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

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

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

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

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

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

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


你应该从中得到的是,H中的每个值都决定了我们看到一对rhotheta的次数,以便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

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

为什么值5传递到houghpeaks()

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

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

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


希望这可以帮助!

以上是关于理解霍夫变换[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

广义霍夫变换和 OpenCv [关闭]

Hough变换-理解篇

使用 Matlab 进行霍夫变换

C语言中的霍夫变换有问题

opencv霍夫变换

霍夫变换和openCV