# 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}