2026a

# tyhoughlines


基于霍夫变换提取线段

函数库: TyImageProcessing

# 语法

lines = tyhoughlines(BW)
lines = tyhoughlines(BW,theta)
lines = tyhoughlines(BW,theta,rho)
lines = tyhoughlines(___;Name=Value)

# 说明

lines = tyhoughlines(BW) 提取图像 BW 中的线段。


lines = tyhoughlines(BW,theta) 提取图像 BW 中的线段, theta 为弧度单位的角度分辨率,默认为 pi / 180,即每个角度步长。


lines = tyhoughlines(BW,theta,rho) 提取图像 BW 中的线段, rho 为像素单位的距离分辨率, 默认为 1 像素。


lines = tyhoughlines(___;Name=Value) 使用名称-值对组参量来控制线条提取的各个方面。示例

# 示例

查找线段并突出显示最长的线段

将图像读入工作区。

using TyImageProcessing
using TyPlot
using TyMath

I = imread("circuit.tif");

旋转图像。

rotI = imrotate(I, 33; bbox="crop");

创建二值图像。

BW, = edge(rotI, "canny"; fig=false);

使用二值图像创建霍夫变换。

H, T, R = hough(BW);
imshow(H, []; xvalue=T, yvalue=R)
xlabel("θ"), ylabel("ρ");
axis("on"), axis("normal"), hold("on");

查找图像的霍夫变换中的峰值。

P = houghpeaks(H, 5; Threshold=ceil(0.3 * maximum(H[:])));
x = T[P[:, 2]];
y = R[P[:, 1]];
plot(x, y, "s"; color="white");

查找线条并对其绘图。

lines = tyhoughlines(BW; Threshold=40, FillGap=20, MinLength=50);
figure(), imshow(rotI), hold("on")
max_len = 0;
for k in 1:length(lines)
    xy = [lines[k].point1; 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]; marker="x", linewidth=2, color="yellow")
    plot(xy[2, 1], xy[2, 2]; marker="x", linewidth=2, color="red")

    # Determine the endpoints of the longest line segment
    len = norm(lines[k].point1 - lines[k].point2)
    if len > max_len
        global max_len = len
        global xy_long = xy
    end
end

将最长的线段设为青色以突出显示。

plot(xy_long[:, 1], xy_long[:, 2]; linewidth=2, color="cyan");

# 输入参数

BW — 二值图像
二维逻辑矩阵 | 二维数值矩阵

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

数据类型: Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | UInt8 | UInt16 | UInt32 | UInt64 | Bool

theta — 线条旋转角度
数值标量

线条旋转角度,以度为单位,指定为数值标量。角度是在 x 轴和 rho 向量之间测量的角度。

数据类型: Real

rho — 从原点到线条的距离
数值标量

距坐标原点的距离,指定为数值标量。坐标原点是图像的左上角 [0,0]。

数据类型: Real

# 名称-值参数

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

示例: lines = tyhoughlines(BW,T,R,P;FillGap=5,MinLength=7);

Threshold — 线段检测阈值
10 (默认)

线段检测阈值, 表示检测直线所需的最小投票数,正整数。数值越高,检测到的直线越少,数值越低,检测到的直线越多。通常需要根据具体图像的噪声和目标数量来调整。开始可以尝试使用一个较小的值,如 10,然后根据需要逐步增加。

数据类型: Real

FillGap — 与同一霍夫变换 bin 相关联的两个线段之间的距离
20 (默认) | 正数

与同一个霍夫变换 bin 相关联的两个线段之间的距离,指定为正数。当线段之间的距离小于指定值时,houghlines 函数会将这些线段合并为一条线段。

数据类型: Real

MinLength—最小线条长度
40 (默认) | 正数

最小线条长度,指定为正数。houghlines 丢弃短于指定值的线条。

数据类型: Real

# 输出参数

lines — 检测到的线条
结构体数组

检测到的线条,以结构体数组形式返回,其长度等于找到的合并线段数。结构体数组的每个元素都有以下字段:

字段 描述
point1 指定线段端点坐标的二元素向量 [X Y]
point2 指定线段端点坐标的二元素向量 [X Y]
theta 霍夫变换 bin 的角度(以度为单位)
rho 霍夫变换 bin 的 rho 轴位置

数据类型: Vector{TyHoughLine}