Обнаружение линий с помощью преобразования Хафа
В данном примере мы рассмотрим возможности детекции линий на изображении, используя преобразование Хаара.
Для начала подключим все библиотеки, которые нам понадобятся в процессе этой работы.
Pkg.add(["ImageCore", "ColorVectorSpace", "ImageDraw", "Clustering", "ImageMorphology", "ImageFeatures"])
using ImageFeatures, FileIO, ImageDraw, ColorVectorSpace
using ImageCore, Clustering, ImageMorphology
gr()
Теперь загрузим изображения с белой линией по центру.
В данном примере мы рассмотрим два способа загрузки:
- через URL-ссылку,
- из файлового менеджера Engee.
# Скачать изображения из интернета
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" )
После того, как изображение было загружено в переменные, приведём его к бинарному виду.
img_g = Gray.(img)
thresh = otsu_threshold(img_g)
tf = img_g .> thresh;
Теперь выполним прореживание бинарной матрицы для нахождения выраженных линий.
t = thinning(tf)
heatmap(t)
Далее при помощи преобразования Хаара расчитаем кординаты, в которых расположена искомая линия.
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))
Теперь наложим найденную линию на исходное изображение и пометим её красным цветом.
img = RGB.(tf);
for (r, θ) in m
draw!(img, LineNormal(r, θ), RGB{N0f8}(1, 0, 0))
end
img
Как мы видим на рисунке, который приведён выше, наше исходное изображение и найденная линия совпадают по расположению и направлению.
Вывод
В данном примере мы разобрали, как применять преобразования Хаара для детекции объектов на изображениях. Эта функция работает корректно, её можно применять в ваших проектах.