使用哈尔变换进行线条检测
在本例中,我们将使用哈尔变换来检测图像中的线条。
首先,让我们连接工作中需要的所有库。
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]:
然后,利用哈尔变换计算出所需线条所在的坐标。
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]:
从上图中我们可以看到,原始图像和找到的线在位置和方向上是重合的。
结论
在本例中,我们学习了如何应用哈尔变换来检测图像中的物体。该功能运行正常,您可以在您的项目中使用它。