Морфологические операции, часть 1¶
Морфологическая обработка изображений — это область компьютерного зрения, которая занимается устранением недостатков бинарных и полутоновых изображений.
ImageMorphology содержит набор нелинейных операций, связанных с формой или морфологией элементов изображения.
В этой демонстрации мы рассмотрим 8 наиболее распространенных морфологических операций.
using Images
using ImageMorphology, TestImages
img = Gray.(testimage("morphology_test_512"))
Эрозия¶
Функция erode выполняет минимальную фильтрацию по ближайшим соседям. По умолчанию это 8 связей в 2d, 27 связей в 3d и т.д. Вы можете указать список измерений, которые хотите включить в связность, например, region = [1,2], чтобы исключить третье измерение из фильтрации.
Ниже приведен пример того, как эрозия работает на бинарном изображении с использованием 3x3 структурирующего элемента.
img_erode = @. Gray(img < 0.8); # keeps white objects white
img_erosion1 = erode(img_erode)
img_erosion2 = erode(erode(img_erode))
mosaicview(img_erode, img_erosion1, img_erosion2; nrow = 1)
Расширение¶
Функция dilate выполняет максимизирующую фильтрацию по своим ближайшим соседям. По умолчанию работает так же, как erode.
img_dilate = @. Gray(img > 0.9);
img_dilate1 = dilate(img_dilate)
img_dilate2 = dilate(dilate(img_dilate))
mosaicview(img_dilate, img_dilate1, img_dilate2; nrow = 1)
Открытие¶
Операция морфологии открытия эквивалентна dilate(erode(img)). В функции opening(img, [region]) region позволяет контролировать размеры, над которыми выполняется эта операция. Открытие может удалять небольшие яркие пятна и соединять небольшие темные трещины.
img_opening = @. Gray(1 * img > 0.5);
img_opening1 = opening(img_opening)
img_opening2 = opening(opening(img_opening))
mosaicview(img_opening, img_opening1, img_opening2; nrow = 1)
Закрытие¶
Закрытие операции морфологии эквивалентно erode(dilate(img)). Функция closing(img, [region]) работает аналогично opening. Закрытие может удалить небольшие темные пятна и соединить небольшие светлые трещины.
img_closing = @. Gray(1 * img > 0.5);
img_closing1 = closing(img_closing)
img_closing2 = closing(closing(img_closing))
mosaicview(img_closing1, img_closing1, img_closing2; nrow = 1)
Top-hat¶
Функция tophat определяется как изображение за вычетом его морфологического открытия. tophat(img, [region]) работает аналогично opening и closing. Эта операция возвращает яркие пятна изображения, которые меньше структурирующего элемента.
img_tophat = @. Gray(1 * img > 0.2);
img_tophat1 = tophat(img_tophat)
img_tophat2 = tophat(tophat(img_tophat))
mosaicview(img_tophat, img_tophat1, img_tophat2; nrow = 1)
Bottom-Hat¶
Операция морфологии Bottom-Hat определяется как морфологическое закрытие изображения за вычетом исходного изображения. bothat(img, [region]) определяется аналогично tophat. Эта операция возвращает темные пятна изображения, которые меньше структурирующего элемента.
img_bothat = @. Gray(1 * img > 0.5);
img_bothat1 = bothat(img_tophat)
img_bothat2 = bothat(bothat(img_tophat))
img_bothat3 = bothat(bothat(bothat(img_tophat)))
mosaicview(img_bothat, img_bothat1, img_bothat2; nrow = 1)
Градиент морфологии¶
Морфологический градиент является разницей между расширением и эрозией изображения. morphogradient(img, [region]) определяется так же, как и tophat.
img_gray = @. Gray(0.8 * img > 0.7);
img_morphograd = morphogradient(@. Gray(0.8 * img > 0.4))
mosaicview(img_gray, img_morphograd; nrow = 1)
Морфологический оператор Лапласа¶
Морфологический оператор Лапласа возращает значение, которое определяется как арифметическая разность между внутренним и внешним градиентом. Функция morpholaplace(img, [region]) определяется аналогично tophat.
img_gray = @. Gray(0.8 * Gray.(img) > 0.7);
img_morpholap = morpholaplace(img_gray)
mosaicview(img_gray, img_morpholap; nrow = 1)
Вывод¶
В данном примере мы разобрали некоторые морфологические операции, которые можно применять к изображениям.