Морфологические операции - это преобразования, основанные на форме изображения. Они применяются к бинарным изображениям и используют структурный элемент (ядро) для обработки:
python
Copy
import cv2
import numpy as np
# Загрузка изображения и бинаризация
img = cv2.imread('objects.jpg', 0)
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# Создание структурного элемента
kernel = np.ones((5,5), np.uint8)
Уменьшает белые области, удаляет мелкие объекты:
python
Copy
eroded = cv2.erode(binary, kernel, iterations=1)
Расширяет белые области, заполняет мелкие отверстия:
python
Copy
dilated = cv2.dilate(binary, kernel, iterations=1)
Открытие (Opening)
Эрозия + дилатация. Удаляет шум:
python
Copy
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
Закрытие (Closing)
Дилатация + эрозия. Заполняет отверстия:
python
Copy
closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
Разница между дилатацией и эрозией (контуры объектов):
python
Copy
gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)
Разница между исходным и открытым изображением:
python
Copy
tophat = cv2.morphologyEx(binary, cv2.MORPH_TOPHAT, kernel)
Разница между закрытым и исходным изображением:
python
Copy
blackhat = cv2.morphologyEx(binary, cv2.MORPH_BLACKHAT, kernel)
Разные формы ядер дают разные эффекты:
python
Copy
# Прямоугольное ядро
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
# Эллиптическое ядро
ellipse_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
# Крестообразное ядро
cross_kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))
python
Copy
# Загрузка изображения с монетами
coins = cv2.imread('coins.jpg', 0)
_, coins_binary = cv2.threshold(coins, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# Удаление мелкого шума
kernel = np.ones((3,3), np.uint8)
clean_coins = cv2.morphologyEx(coins_binary, cv2.MORPH_OPEN, kernel, iterations=2)
python
Copy
# Загрузка текстового изображения
text = cv2.imread('text.jpg', 0)
_, text_binary = cv2.threshold(text, 150, 255, cv2.THRESH_BINARY_INV)
# Заполнение пробелов
kernel = np.ones((3,3), np.uint8)
filled_text = cv2.morphologyEx(text_binary, cv2.MORPH_CLOSE, kernel, iterations=2)
1. Загрузите изображение и примените бинаризацию
2. Экспериментируйте с эрозией и дилатацией (разные ядра)
3. Сравните результаты открытия и закрытия
4. Примените морфологический градиент для выделения контуров
5. Решите задачу:
o Загрузите изображение с поврежденным текстом
o Восстановите текст с помощью морфологических операций
· Эрозия уменьшает объекты, дилатация расширяет
· Открытие удаляет шум, закрытие заполняет дыры
· Разные структурные элементы дают разные эффекты
· Морфологические операции критически важны для:
o Предобработки изображений
o Анализа формы объектов
o Улучшения результатов сегментации
Следующая тема: Детекция и распознавание объектов (шаблоны, гистограммы)