Closed. This question needs to be more
focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅关注
editing this post一个问题。
3年前关闭。
Improve this question
我正在尝试了解Hough变换的MATLAB代码。
在这张照片中我对某些项目很清楚
binary_image
是input_image
的单色版本。
hough_lines
是包含图像中检测到的线条的向量。我看到已检测到四行。
T
在图像的(ϴ, ρ)
空间中包含theta。
R
在图像的(ϴ, ρ)
空间中包含rhos。
我有以下问题
为什么在应用霍夫变换之前先旋转图像?
H
中的条目代表什么?
为什么H
(霍夫矩阵)的大小为45x180?这个大小从哪里来?
为什么T
的大小为1x180?这个大小从哪里来?
为什么R
的大小为1x45?这个大小从哪里来?
P
中的条目代表什么?他们是(x, y)
还是(ϴ, ρ)
?
29 162
29 165
28 170
21 5
29 158
为什么将值5传递给houghpeaks()
?
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');
这些是一些好问题。这是我为您提供的答案:
为什么在应用霍夫变换之前先旋转图像?
我不相信这是MATLAB的“官方示例”。 I just took a quick look at the documentation page for the function。我相信您是从另一个我们无权访问的网站上拉取的。无论如何,通常不需要使用霍夫变换之前先旋转图像。霍夫变换的目的是在图像的任何方向上找到线条。旋转它们不应影响结果。但是,如果我猜测旋转是一种先发制人的措施,因为“示例图像”中的线条最有可能沿顺时针方向以33度角定向。进行反向旋转将使线条或多或少笔直。
H
中的条目代表什么?
H
是所谓的accumulator matrix。在我们了解H
的目的以及如何解释矩阵之前,您需要了解霍夫变换的工作原理。通过霍夫变换,我们首先对图像执行边缘检测。您可以使用Canny边缘检测器完成此操作。如果您想起了霍夫变换,我们可以使用以下关系对线进行参数化:
rho = x*cos(theta) + y*sin(theta)
x
和
y
是图像中的点,最通常地,它们是边缘点。
theta
是从原点开始的线与通过边缘点绘制的线的交点形成的角度。
rho
是从原点到通过
(x, y)
的角度通过
theta
绘制到这条线的
垂直距离。
请注意,该方程可产生位于
(x, y)
的许多行的无穷大,因此将可能角度的总数合并或离散化到预定义的数量是很常见的。默认情况下,MATLAB假定存在
180个可能的角度,范围从
[-90, 90)
到1,采样因子为1。因此,
[-90, -89, -88, ... , 88, 89]
。通常要做的是针对每个边缘点搜索预定数量的角度,确定相应的
rho
是什么。之后,我们计算您看到每个
rho
和
theta
对的次数。这是从Wikipedia中提取的一个简单示例:
资料来源:
Wikipedia: Hough Transform
在这里,我们看到三个黑点沿着一条直线。理想情况下,霍夫变换应确定这些黑点一起形成一条直线。为了使您对计算有所了解,请看一下30度的示例。进行更早的咨询,当我们延伸一条线时,从原点到该线的角度通过每个点为30度,我们会发现从该线到原点的垂直距离。
现在有趣的是,如果您看到每个点在60度处显示的垂直距离,则该距离在大约80个像素处大致相同。霍夫变换背后的驱动力是看到这三个点的
rho
和
theta
对。同样,上述公式的好处是它将为您隐式找到垂直距离。
霍夫变换的过程非常简单。假设我们有一个边缘检测图像
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
因此,理想情况下,如果我们的边缘点遵循一条直线,则应该看到一个
rho
和
theta
对,其中看到该对的次数相对较高。
这是累加器矩阵H
的目的。行表示唯一的
rho
值,列表示唯一的
theta
值。
下面是一个示例:
资料来源:
Google Patents
因此,使用该矩阵中位于25至30之间的
theta
和4至4.5的
rho
的示例,我们发现有8个边缘点可以通过给定
rho, theta
范围对的线来表征。
请注意,
rho
的范围也是无限多个值,因此,您不仅需要限制所拥有的
rho
的范围,而且还必须使用采样间隔离散化
rho
。 MATLAB中的默认值为1。因此,如果计算
rho
值,它将不可避免地具有浮点值,因此您将删除小数精度以确定最终的
rho
。
对于上面的示例,
rho
分辨率为0.5,因此这意味着,例如,如果您计算的
rho
值介于2到2.5之间,则它位于第一列。还要注意,
theta
值以5的间隔进行装箱。传统上,您将使用
theta
采样间隔为1来计算霍夫变换,然后将这些装箱合并在一起。但是,对于默认的MATLAB,bin大小为1。此累加器矩阵告诉
边缘点适合特定rho
和theta
组合多少次。因此,如果我们看到许多点已映射到特定的
rho
和
theta
值,则这是在此处检测到由
rho = x*cos(theta) + y*sin(theta)
定义的线的巨大潜力。
为什么
H
(霍夫矩阵)的大小为45x180?这个大小从哪里来?
这是先前观点的结果。请注意,我们期望从原点到图像中任何点的最大距离以图像的对角线为界。这是有道理的,因为从左上角到右下角或从左下角到右上角将为您提供图像中预期的最大距离。通常,将其定义为
D = sqrt(rows^2 + cols^2)
,其中
rows
和
cols
是图像的行和列。
对于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列,因此
H
是
45 x 180
。
为什么
T
的大小为1x180?这个大小从哪里来?
这是一个数组,它告诉您霍夫变换中使用的所有角度。这应该是一个从
-90
到
89
的数组,步长为1。
为什么
R
的大小为1x45?这个大小从哪里来?
这是一个数组,告诉您霍夫变换中正在使用的所有
rho
值。这个数组应该是从
-22
到
22
的数组,步长为1。
您应该摆脱的是,
H
中的每个值确定我们看到一对特定的一对
rho
和
theta
的次数,例如
R(i) <= rho < R(i + 1)
和
T(j) <= theta < T(j + 1)
,其中
i
的范围是1到44,而
j
的范围是1到179,确定先前看到的特定
rho
和
theta
范围内,我们看到边缘点的次数。
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
,它将为您提供参数以表征图像中检测到的线。
为什么将值5传递给
houghpeaks()
?
5
中的多余
houghpeaks
返回理想情况下要检测的总行数。我们可以看到
P
是5行,对应5行。如果找不到5行,那么MATLAB将返回尽可能多的行。
ceil(0.3*max(H(:)))
背后的逻辑是什么?
其背后的逻辑是,如果要确定累加器矩阵中的峰值,则必须定义一个最小阈值,该阈值将告诉您特定的
rho
和
theta
组合是否被视为有效行。将该阈值设置得太低会报告很多错误行,而将该阈值设置得太高则会错过很多行。他们决定要做的是在累加器矩阵中找到最大的bin数量,取其中的30%,取数学上限,并且累加器矩阵中的任何大于该数量的值,将是候选行。
希望这可以帮助!
我是一名优秀的程序员,十分优秀!