Неделя 4 - Фильтрация изображений
1. Введение в фильтрацию
Фильтрация изображений - процесс модификации пикселей на основе их соседей. Основные цели:
Удаление шумов
Сглаживание изображений
Выделение границ
Улучшение деталей
2. Линейные фильтры (свёртка)
2.1. Принцип работы
Фильтр применяет ядро (матрицу) ко всем пикселям изображения:
Copy
Ядро 3x3: Изображение:
[ k1 k2 k3 ] [ p1 p2 p3 ]
[ k4 k5 k6 ] * [ p4 p5 p6 ]
[ k7 k8 k9 ] [ p7 p8 p9 ]
2.2. Основные типы ядер
python
Copy
import cv2
import numpy as np
# Единичное ядро (не изменяет изображение)
identity_kernel = np.array([[0, 0, 0],
[0, 1, 0],
[0, 0, 0]])
# Ядро размытия
blur_kernel = np.ones((3,3), np.float32) / 9
# Ядро для выделения границ
edge_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# Применение фильтра
image = cv2.imread('image.jpg', 0) # Загрузка в оттенках серого
filtered = cv2.filter2D(image, -1, edge_kernel)
3. Нелинейные фильтры
3.1. Усредняющее размытие
python
Copy
blurred = cv2.blur(image, (5,5)) # Ядро 5x5
3.2. Гауссово размытие
Эффективно удаляет гауссов шум:
python
Copy
gaussian = cv2.GaussianBlur(image, (5,5), 0) # 0 - автоопределение сигмы
3.3. Медианный фильтр
Лучше всего удаляет "соль и перец" шум:
python
Copy
median = cv2.medianBlur(image, 5) # 5 - размер ядра (нечётное)
3.4. Билатеральный фильтр
Сохраняет границы при сглаживании:
python
Copy
bilateral = cv2.bilateralFilter(image, 9, 75, 75) # d, sigmaColor, sigmaSpace
4. Морфологические операции
4.1. Эрозия и дилатация
python
Copy
kernel = np.ones((5,5), np.uint8)
# Уменьшает белые области
eroded = cv2.erode(image, kernel, iterations=1)
# Увеличивает белые области
dilated = cv2.dilate(image, kernel, iterations=1)
4.2. Открытие и закрытие
python
Copy
# Удаление мелких белых объектов
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
# Заполнение мелких чёрных дыр
closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
5. Выделение границ
5.1. Оператор Собеля
python
Copy
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)
sobel_combined = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
5.2. Оператор Лапласа
python
Copy
laplacian = cv2.Laplacian(image, cv2.CV_64F)
5.3. Детектор Канни
python
Copy
edges = cv2.Canny(image, 100, 200) # Пороги минимум и максимум
6. Практическое задание
1. Загрузите изображение с шумом и примените:
o Гауссово размытие
o Медианный фильтр
o Билатеральный фильтр
2. Сравните результаты
3. Примените детектор Канни с разными порогами
4. Экспериментируйте с морфологическими операциями
7. Итоги
Линейные фильтры используют матрицу свёртки
Гауссов фильтр эффективен против гауссова шума
Медианный фильтр лучше всего удаляет "соль и перец"
Билатеральный фильтр сохраняет границы
Морфологические операции изменяют структуру объектов
Детектор Канни - лучший для выделения границ
Следующая тема: Геометрические преобразования и перспектива