主要内容

hough

霍夫变换

说明

[H,theta,rho] = hough(BW) 计算二值图像 BW 的标准霍夫变换 (SHT)。您可以使用霍夫变换矩阵 H 来检测线条。

该函数使用线条的参数化表示:rho = x*cos(theta) + y*sin(theta)。此处,rho 是沿垂直于一个线条的向量从原点到该线条的偏移量,thetax 轴与垂直于该线条的向量之间的角度(以度为单位)。该函数针对许多 rhotheta 值的组合对 SHT 进行采样,并分别在 rhotheta 中返回采样值。有关详细信息,请参阅霍夫变换

示例

[H,theta,rho] = hough(BW,Name=Value) 还使用名称-值参量来调整函数对 thetarho 值进行采样的方式。例如,指定 RhoResolution=0.5 以每隔 0.5 像素对 rho 的值进行采样。

示例

示例

全部折叠

读取并显示图像。

RGB = imread("gantrycrane.png");
imageshow(RGB)

将图像转换为灰度图,然后找到图像中的边缘。

I  = im2gray(RGB);
BW = edge(I,"canny");

计算霍夫变换。

[H,T,R] = hough(BW,RhoResolution=0.5,Theta=-90:0.5:89);

霍夫矩阵的数据类型为 double,其值在范围 [0, 1] 之外。要显示霍夫矩阵,请将数据重新缩放到范围 [0, 1] 内。使用 imadjust 函数改进图像对比度以便显示。

Hdisp = rescale(H);
Hdisp = imadjust(Hdisp);

imshow(Hdisp,XData=T,YData=R)
xlabel("\theta")
ylabel("\rho")
axis on
axis normal
hold on
colormap(gca,hot)

Figure contains an axes object. The axes object with xlabel theta, ylabel rho contains an object of type image.

读取一个图像。

RGB = imread("gantrycrane.png");

将图像转换为灰度图,然后找到图像中的边缘。

I  = im2gray(RGB);
BW = edge(I,'canny');

计算有限角度范围内的霍夫变换。

[H,T,R] = hough(BW,Theta=44:0.5:46);

霍夫矩阵的数据类型为 double,其值在范围 [0, 1] 之外。要显示霍夫矩阵,请将数据重新缩放到范围 [0, 1] 内。使用 imadjust 函数改进图像对比度以便显示。

Hdisp = rescale(H);
Hdisp = imadjust(Hdisp);
imshow(Hdisp,XData=T,YData=R)
xlabel("\theta")
ylabel("\rho")
axis on
axis normal
hold on
colormap(gca,hot)

Figure contains an axes object. The axes object with xlabel theta, ylabel rho contains an object of type image.

输入参数

全部折叠

二值图像,指定为二维逻辑矩阵或二维数值矩阵。对于数值输入,任何非零像素都被视为 1 (true)。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

示例: [H,theta,rho] = hough(BW,RhoResolution=0.5) 将沿 rho 维度的霍夫变换 bin 的间距指定为 0.5 像素。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: [H,theta,rho] = hough(BW,"RhoResolution",0.5)

沿 rho 维度的 bin 间距(以像素为单位),指定为正数。RhoResolution 必须小于 norm(size(BW))

示例: RhoResolution=2 使用沿 rho 维度的宽度为 2 的霍夫变换 bin。

数据类型: double

相对于线条的垂直投影的角度(以度为单位),指定为元素在 [-90, 90) 范围内的数值向量。角度是从 x 轴顺时针方向测量的。

示例: -90:0.5:89.5

数据类型: double

输出参量

全部折叠

霍夫变换矩阵,以数值矩阵形式返回。矩阵的大小为 nrho×ntheta,其中 nrhorho 的长度,nthetatheta 的长度。有关详细信息,请参阅算法

相对于线条的垂直投影的角度(以度为单位),以数值向量形式返回。角度是从 x 轴顺时针方向测量的。有关详细信息,请参阅算法

使用此输出参量作为 houghlineshoughpeaks 函数的输入。

数据类型: double

从原点到线条的垂直偏移量(以像素为单位),以数值向量形式返回。有关详细信息,请参阅算法

向量的长度是 2*ceil(D/RhoResolution)+1,其中 D 是以笛卡尔坐标表示的图像对角线的长度。由于坐标系的原点位于左上角像素的中心,因此 D = norm(size(BW)-1)

rho 的值的范围是从 -diagonaldiagonal,其中 diagonal = RhoResolution*ceil(D/RhoResolution)

使用此输出参量作为 houghlines 函数的输入。

数据类型: double

算法

标准霍夫变换 (SHT) 使用线条的参数化表示:

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

坐标系的原点假定位于左上角像素的中心。

变量 theta 是从原点到线条的垂直投影相对于正 x 轴顺时针测量的角度(以度为单位)。theta 的范围是 –90° ≤ theta < 90°。线条本身的角度是 theta + 90°,也是相对于正 x 轴顺时针测量的。

变量 rho 是从原点到线条的垂直偏移量。rho 的大小等效于原点和线条之间的垂直距离。然而,hough 函数支持负的 rho 值,以表示有效旋转角度超出 theta 支持范围的线条。从图形上看,当线条穿过由 theta 定义的法向量相对的象限时,rho 为负值。换句话说,rho 为负值表示有效旋转角度为 –180° ≤ theta < –90°90° ≤ theta < 180° 的线条。

Graphical representation of how theta and rho are defined for a line, in green, relative to the perpendicular projection, in black.

霍夫变换矩阵 H 是参数空间矩阵,其行和列分别对应于 rhotheta 值。对于 rhotheta 的每一种组合,SHT 都会计算由这些参数确定的线条,并返回 BW 中沿该线条的所有 true 像素的总和。当许多像素沿一个参数化线条具有 true 值时,结果在霍夫变换矩阵中形成一个峰值。峰值表示输入图像中的潜在线条。您可以通过使用 houghpeaks 函数在霍夫变换矩阵中找到峰值。

由于原点位于左上角像素的中心,图像中不存在 rho 为负且 theta 为正的线条。霍夫变换矩阵中对应于负 rho 和正 theta 的元素具有值 0

扩展功能

全部展开

版本历史记录

在 R2006a 之前推出

全部展开