Engee 文档
Notebook

使用哈尔变换进行线条检测

在本例中,我们将使用哈尔变换来检测图像中的线条。

首先,让我们连接工作中需要的所有库。

In [ ]:
Pkg.add(["ImageCore", "ColorVectorSpace", "ImageDraw", "Clustering", "ImageMorphology", "ImageFeatures"])
In [ ]:
using ImageFeatures, FileIO, ImageDraw, ColorVectorSpace
using ImageCore, Clustering, ImageMorphology
gr()

现在,让我们加载中间有白线的图片。 在本例中,我们将研究两种上传方式:

  1. 通过 URL 链接、
  2. 通过 Engee 文件管理器。
In [ ]:
# Скачать изображения из интернета
file = download("https://grizly.club/uploads/posts/2023-08/1691448777_grizly-club-p-kartinki-belaya-poloska-bez-fona-31.jpg")
img = FileIO.load(file)
# Подгрузить изображения из файлов Engee
#img = load( "$(@__DIR__)/line.jpg" )
Out[0]:
No description has been provided for this image

将图像载入变量后,我们将其转换为二进制形式。

In [ ]:
img_g = Gray.(img)
thresh = otsu_threshold(img_g)
tf = img_g .> thresh;

现在,让我们对二进制矩阵进行稀疏化处理,以找到所表达的线条。

In [ ]:
t = thinning(tf)
heatmap(t)
Out[0]:

然后,利用哈尔变换计算出所需线条所在的坐标。

In [ ]:
 = hough_transform_standard(t, stepsize = 3, vote_threshold = 500, max_linecount = 100, angles = range(0, pi, length = 10000))
R = kmeans(Matrix(hcat(vcat.(...)...)'),3) 
m = Tuple.(eachcol(R.centers))
Out[0]:
3-element Vector{Tuple{Float64, Float64}}:
 (-451.5, 3.141278462905366)
 (454.5, 0.0)
 (-448.5, 3.1375081746922366)

现在,让我们将找到的线条叠加到原始图像上,并用红色标记出来。

In [ ]:
img = RGB.(tf);
for (r, θ) in m
    draw!(img, LineNormal(r, θ), RGB{N0f8}(1, 0, 0))
end
img
Out[0]:
No description has been provided for this image

从上图中我们可以看到,原始图像和找到的线在位置和方向上是重合的。

结论

在本例中,我们学习了如何应用哈尔变换来检测图像中的物体。该功能运行正常,您可以在您的项目中使用它。