Что такое морфологические операции (dilate, erode)?

Морфологические операции — это специальные операции обработки изображений, основанные на формах (структуре) объектов. Они применяются в основном к бинарным изображениям (чёрно-белым), но могут использоваться и для оттенков серого. Их основная задача — изменить геометрическую структуру объектов на изображении: удалить шум, сгладить границы, соединить разрывы, выделить контуры, "запаять" отверстия и др.

Две основные операции: эрозия (erode) и дилатация (dilate). На их основе строятся более сложные процедуры — открытие, закрытие, градиент, топ-хэт, блэк-хэт.

Основные понятия

Ядро (структурный элемент, kernel)

Морфологические операции используют ядро (обычно квадрат или круг), которое скользит по изображению. Это ядро определяет, как соседние пиксели влияют на результат в центре. Ядро задаётся матрицей (например, 3×3) и может быть разной формы:

  • Квадрат: cv2.MORPH_RECT

  • Эллипс: cv2.MORPH_ELLIPSE

  • Крест: cv2.MORPH_CROSS

Создание ядра в OpenCV:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

Эрозия (Erosion)

Операция уменьшения (съедания) белых объектов.

Каждый пиксель изображения заменяется минимумом среди соседей, заданных ядром. Если все пиксели под ядром равны 255, тогда центральный пиксель остаётся белым, иначе — становится чёрным.

Эффекты:

  • Уменьшение белых объектов

  • Удаление мелких белых шумов

  • Уменьшение толщины фигур

  • Удаление «выростов» или хвостов

Пример:

eroded = cv2.erode(image, kernel, iterations=1)

Используется для:

  • Удаления мелких белых пятен

  • Отделения слипшихся объектов

  • Тонкой фильтрации контуров

Дилатация (Dilation)

Операция расширения белых объектов.

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

Эффекты:

  • Увеличение белых объектов

  • Залатывание мелких чёрных дыр

  • Утолщение линий и границ

Пример:

dilated = cv2.dilate(image, kernel, iterations=1)

Используется для:

  • Заполнения отверстий внутри объектов

  • Расширения форм

  • Объединения близко расположенных элементов

Последовательности

Открытие (Opening)

opened = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

Эрозия → дилатация

Удаляет шум, сохраняя форму объектов.
Используется для:

  • Удаления мелких белых шумов

  • Отделения объектов

Закрытие (Closing)

closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

Дилатация → эрозия

Заполняет мелкие чёрные дыры в белых объектах.
Используется для:

  • Объединения разорванных объектов

  • Залатывания мелких чёрных дыр

Морфологический градиент

gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)

Разница между дилатацией и эрозией:

Gradient = Dilate - Erode

Показывает контур объектов (белый контур на чёрном фоне).

Top Hat (Белая шляпа)

tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)

Разница между исходным изображением и его открытием:

Tophat = Image - Opening

Выделяет мелкие белые объекты, которые меньше по размеру ядра.

Black Hat (Чёрная шляпа)

blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)

Разница между закрытием изображения и исходным:

Blackhat = Closing - Image

Выделяет мелкие чёрные элементы на светлом фоне.

Эрозия и дилатация для изображений в градациях серого

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

  • Усредняют яркость

  • Сглаживают шум

  • Расширяют/сужают яркие зоны

Практические применения

Задача Используемые операции
Удаление шума (белые точки) Эрозия → открытие
--- ---
Заполнение дыр внутри объекта Дилатация → закрытие
--- ---
Выделение контуров Морфологический градиент
--- ---
Распознавание текста Открытие (удалить фон), дилатация (укрупнить)
--- ---
Анализ формы и подсчёт объектов Закрытие, дилатация, эрозия
--- ---
Подготовка к сегментации Комбинация открытие/закрытие + бинаризация
--- ---

Примеры с OpenCV

Эрозия и дилатация:

import cv2
import numpy as np
img = cv2.imread('binary.png', 0)
kernel = np.ones((5, 5), np.uint8)
eroded = cv2.erode(img, kernel, iterations=1)
dilated = cv2.dilate(img, kernel, iterations=1)

Открытие и закрытие:

opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

Влияние параметров

Параметр Эффект
kernel size Чем больше, тем сильнее воздействие на структуру изображения. Например, ядро 7×7 "съест" гораздо больше при эрозии, чем 3×3.
--- ---
iterations Количество повторений операции. Больше итераций → сильнее эффект.
--- ---

Рекомендуется экспериментировать с ядрами разных размеров и форм для наилучшего результата.

Особенности

  • Работают по геометрии: важно, как расположены пиксели

  • Локальны: затрагивают только область, охватываемую ядром

  • Эффективны и быстры: часто используются в реальном времени

  • Идеальны в сочетании с бинаризацией (thresholding)

Морфологические операции — это мощный инструмент в арсенале компьютерного зрения, позволяющий не только фильтровать и чистить изображения, но и управлять формой объектов, улучшать точность сегментации и анализа сцены.