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

Морфологические операции, часть 2

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

В этой демонстрации мы рассмотрим такие морфологические операции, как заполнение, выкалывание и очистка границ.

Начнём с подключения необходимых библиотек.

In [ ]:
Pkg.add("ImageBinarization")
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using Images, Noise, ImageMorphology
using ImageBinarization
using ImageDraw
using TestImages

Загрузим изображение и выполним его пороговую обработку.

In [ ]:
img_src = testimage("morphology_test_512")
Out[0]:
No description has been provided for this image
In [ ]:
img_input = binarize(Gray.(img_src), UnimodalRosin()) .> 0.5
Out[0]:
512×512 BitMatrix:
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 ⋮              ⋮              ⋮        ⋱  ⋮              ⋮              ⋮  
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0  …  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0  0  0  0  0  0  0  0  0     0  0  0  0  0  0  0  0  0  0  0  0

Это изображение мы будем использовать в дальнейшей работе, присвоив ему формат оттенков серого цвета, поскольку указанные ниже операции применяются к изображениям в формате Gray.

In [ ]:
Gray.(img_input)
Out[0]:
No description has been provided for this image

Выделение границ

Функция convexhull выводит внешнюю наиболее похожую на покрытие границу изображения и возвращает вершины объекта границ в виде массива CartesianIndex.

In [ ]:
cordinates = convexhull(img_input)
img_convex = RGB.(copy(img_input))
push!(cordinates, cordinates[1])
draw!(img_convex, Path(cordinates), RGB(1))
img_convex
Out[0]:
No description has been provided for this image

Заполнение изображения

Операция заполнения изображения находит связанные компоненты изображения и используя их выдает результирующее изображение. После выполнения функции заполнения это изображение попадает в диапазон указанного интервала.

In [ ]:
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])
Out[0]:
No description has been provided for this image

Прореживание изображения

Операция прореживания применяет алгоритм Го, который определяет, какие пиксели оставить.

In [ ]:
img_thinning = thinning(img_input, algo = GuoAlgo());
Gray.([img_input img_thinning])
Out[0]:
No description has been provided for this image

Очистка границ

Метод Clearborder можно использовать для очистки объектов, связанных с границей изображения.

In [ ]:
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, он очищает все изображение из-за алгоритма заливки.

In [ ]:
Gray.([img_input cleared_img_1 cleared_img_2 cleared_img_3])
Out[0]:
No description has been provided for this image

Вывод

В данном примере мы разобрали некоторые полезные морфологические операции, которые можно применять к изображениям.