Морфологические операции, часть 2¶
В этой демонстрации мы рассмотрим такие морфологические операции, как заполнение, выкалывание и очистка границ.
Начнём с подключения необходимых библиотек.
Pkg.add("ImageBinarization")
using Images, Noise, ImageMorphology
using ImageBinarization
using ImageDraw
using TestImages
Загрузим изображение и выполним его пороговую обработку.
img_src = testimage("morphology_test_512")
img_input = binarize(Gray.(img_src), UnimodalRosin()) .> 0.5
Это изображение мы будем использовать в дальнейшей работе, присвоив ему формат оттенков серого цвета, поскольку указанные ниже операции применяются к изображениям в формате Gray.
Gray.(img_input)
Выделение границ¶
Функция convexhull выводит внешнюю наиболее похожую на покрытие границу изображения и возвращает вершины объекта границ в виде массива CartesianIndex.
cordinates = convexhull(img_input)
img_convex = RGB.(copy(img_input))
push!(cordinates, cordinates[1])
draw!(img_convex, Path(cordinates), RGB(1))
img_convex
Заполнение изображения¶
Операция заполнения изображения находит связанные компоненты изображения и используя их выдает результирующее изображение. После выполнения функции заполнения это изображение попадает в диапазон указанного интервала.
img_noise = salt_pepper(img_input, 0.5)
fill_image_1 = imfill(img_noise, (0.1, 1))
fill_image_2 = imfill(img_noise, (0.1, 10)) # this configuration gets us best results
fill_image_3 = imfill(img_noise, (1, 10))
fill_image_4 = imfill(img_noise, (5, 20)) # objects of smaller sizes gets left out
Gray.([img_noise fill_image_1 fill_image_2 fill_image_3 fill_image_4])
Прореживание изображения¶
Операция прореживания применяет алгоритм Го, который определяет, какие пиксели оставить.
img_thinning = thinning(img_input, algo = GuoAlgo());
Gray.([img_input img_thinning])
Очистка границ¶
Метод Clearborder можно использовать для очистки объектов, связанных с границей изображения.
cleared_img_1 = clearborder(img_input, 20); # 20 is the width of border that's examined
cleared_img_2 = clearborder(img_input, 30); # notice how it remove the inner circle even if it's outside its range
cleared_img_3 = clearborder(img_input, 30, 1);
Цвет по умолчанию для удаления — 0, что означает удаление RGB(0), но теперь, поскольку он равен 1, он очищает все изображение из-за алгоритма заливки.
Gray.([img_input cleared_img_1 cleared_img_2 cleared_img_3])
Вывод¶
В данном примере мы разобрали некоторые полезные морфологические операции, которые можно применять к изображениям.