使用Hough变换的线检测
在这个例子中,我们将研究使用Haar变换检测图像中的线条的可能性。
首先,我们将连接在这项工作过程中需要的所有库。
In [ ]:
Pkg.add(["ImageCore", "ColorVectorSpace", "ImageDraw", "Clustering", "ImageMorphology", "ImageFeatures"])
In [ ]:
using ImageFeatures, FileIO, ImageDraw, ColorVectorSpace
using ImageCore, Clustering, ImageMorphology
gr()
现在让我们上传中间有一条白线的图像。
在这个例子中,我们将看到两种加载方法。:
- 通过URL链接,
- 从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]:
图像加载到变量后,我们将其转换为二进制格式。
In [ ]:
img_g = Gray.(img)
thresh = otsu_threshold(img_g)
tf = img_g .> thresh;
现在让我们细化二进制矩阵以找到明显的线条。
In [ ]:
t = thinning(tf)
heatmap(t)
Out[0]:
接下来,使用Haar变换,我们计算所需线所在的帘线。
In [ ]:
rθ = hough_transform_standard(t, stepsize = 3, vote_threshold = 500, max_linecount = 100, angles = range(0, pi, length = 10000))
R = kmeans(Matrix(hcat(vcat.(rθ...)...)'),3)
m = Tuple.(eachcol(R.centers))
Out[0]:
现在我们将在原始图像上复盖找到的线并将其标记为红色。
In [ ]:
img = RGB.(tf);
for (r, θ) in m
draw!(img, LineNormal(r, θ), RGB{N0f8}(1, 0, 0))
end
img
Out[0]:
正如我们在上图中看到的,我们的原始图像和找到的线在位置和方向上匹配。
结论
在这个例子中,我们已经想出了如何应用Haar变换来检测图像中的对象。 此功能可以正常工作,并且可以在您的项目中使用。

