Документация Engee
Notebook

Обнаружение линий с помощью преобразования Хаара

Открыть пример в Engee

В данном примере мы рассмотрим возможности детекции линий на изображении, используя преобразование Хаара.

Для начала подключим все библиотеки, которые нам понадобятся в процессе этой работы.

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

Как мы видим на рисунке, который приведён выше, наше исходное изображение и найденная линия совпадают по расположению и направлению.

Вывод

В данном примере мы разобрали, как применять преобразования Хаара для детекции объектов на изображениях. Эта функция работает корректно, её можно применять в ваших проектах.