Что такое свёртка (convolution) и как она используется в CV?

Свёртка (convolution) — это математическая операция, применяемая к изображению для выделения признаков, трансформации или фильтрации данных. В компьютерном зрении (CV, computer vision) она играет ключевую роль в задачах обработки изображений, распознавания объектов, обнаружения границ, подавления шума и построения нейронных сетей (особенно сверточных нейронных сетей — CNN).

Математическая основа

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

Формально, для двумерной свёртки:

S(i, j) = ∑∑ K(m, n) * I(i - m, j - n)

  • I(i, j) — входное изображение

  • K(m, n) — ядро (фильтр)

  • S(i, j) — результат свёртки

На практике часто используется кросс-корреляция, в которой ядро не переворачивается:

S(i, j) = ∑∑ K(m, n) * I(i + m, j + n)

Компоненты операции свёртки

  1. Ядро (Kernel, Filter)
    Маленькая матрица, например 3×3 или 5×5. Каждый элемент — вес, применяемый к соответствующему пикселю подматрицы изображения.

  2. Stride (шаг)
    Количество пикселей, на которое сдвигается фильтр после каждого применения. Чем больше stride, тем меньше выходной размер.

  3. Padding (дополнение)
    Дополнительные пиксели (обычно нули), добавляемые вокруг изображения для сохранения размеров после свёртки.

  4. Output
    Новая матрица признаков (feature map), содержащая результаты применения фильтра по всему изображению.

Пример: фильтр для обнаружения границ

Фильтр Собеля по X (обнаружение вертикальных границ):

[-1, 0, 1]

[-2, 0, 2]

[-1, 0, 1]

Этот фильтр усиливает переходы яркости по горизонтали. При применении к изображению он выделяет вертикальные края объектов.

Пример вычисления вручную

Пусть изображение 3×3:

I = [[10, 10, 10],

[10, 50, 10],

[10, 10, 10]]

и фильтр 3×3:

K = [[ 0, -1, 0],

[-1, 5, -1],

[ 0, -1, 0]]

Результат S(1,1) вычисляется как сумма попарных произведений I(i,j) * K(i,j) по всем элементам 3×3. Это может усилить центральный пиксель (напр., при "sharpen").

Использование в классическом CV

1. Фильтрация изображений

  • Размытие (Blur): среднее или гауссово.

  • Резкость (Sharpen): усиление различий между пикселями.

  • Подавление шума: медианная фильтрация, гауссовы ядра.

2. Выделение признаков

  • Обнаружение границ (фильтры Собеля, Лапласа).

  • Детекторы углов (Harris Corner, FAST).

  • Фильтры Габора — имитация отклика зрительных рецепторов.

3. Преобразование изображений

  • Уменьшение/увеличение размерности.

  • Нормализация и стандартизация изображения.

  • Обнаружение паттернов (текстуры, направленности).

Использование в свёрточных нейронных сетях (CNN)

В машинном обучении, особенно в нейронных сетях, свёртки заменяют ручную разработку фильтров: модель сама обучает веса ядер во время тренировки.

Особенности:

  • Обучаемые фильтры: в отличие от фиксированных в классическом CV.

  • Многоканальные свёртки: свёртка применяется к каждому каналу (например, R, G, B) и результаты суммируются.

  • Глубокие представления: слои свёртки один за другим строят всё более абстрактные признаки (от краёв к формам и объектам).

Пример:

import cv2
import numpy as np
from scipy.signal import convolve2d
image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
kernel = np.array(\[\[0, -1, 0\],
\[-1, 5, -1\],
\[0, -1, 0\]\])
output = convolve2d(image, kernel, mode='same')

Разница между свёрткой и кросс-корреляцией

  • Свёртка: ядро отражается по обоим осям (формально).

  • Кросс-корреляция: ядро применяется напрямую без отражения.

На практике в OpenCV и PyTorch реализуется именно кросс-корреляция, хотя называют это "свёрткой" по привычке.

Пространственная и частотная интерпретация

Свёртка в пространственной области (через ядро) эквивалентна умножению в частотной области (через преобразование Фурье). Это активно используется в ускорении фильтрации:

F = fft2(image)

K = fft2(kernel, s=image.shape)

result = ifft2(F * K)

Применение в различных задачах

  • Детектирование объектов: выделение краёв, контуров, углов.

  • Сегментация изображений: идентификация границ объектов.

  • Оптический поток: фильтрация для извлечения движений.

  • Обнаружение лиц, номеров, текста: предварительная фильтрация.

  • Анализ текстур: Габоровы фильтры.

  • Data augmentation: свёртки с шумами или аугментированными ядрами.

  • Обработка видео: временные свёртки для анализа движения.

Производительность

Свёртка — вычислительно затратная операция, особенно при больших фильтрах и высоком разрешении. Оптимизация включает:

  • **Fast convolution через FFT
    **
  • **Глубинные библиотеки (OpenCV, CuDNN)
    **
  • **Параллелизация на GPU
    **
  • **Кэширование и использование dilated (расширенных) свёрток
    **

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