Что такое морфологические операции (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)
Морфологические операции — это мощный инструмент в арсенале компьютерного зрения, позволяющий не только фильтровать и чистить изображения, но и управлять формой объектов, улучшать точность сегментации и анализа сцены.