Фильтры и свёртка: ядро, которое скользит по картинке

Свёртка — это операция, на которой стоит почти всё компьютерное зрение, от размытия до свёрточных нейросетей.

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

Идея: окрестность важнее одного пикселя

Точечные операции смотрели на пиксель в одиночку. Но для размытия, резкости, поиска границ важна окрестность: каков пиксель на фоне соседей. Свёртка как раз учитывает соседей. Берём ядро 3×3 — табличку весов. Накладываем её центром на пиксель, перемножаем каждый вес на пиксель под ним, складываем — и это новое значение центра. Потом сдвигаем ядро на пиксель вправо и повторяем по всей картинке.

Свёртка-усреднение вручную

Возьмём ядро из одних единиц и поделим сумму на 9 — это усреднение (box blur): каждый пиксель заменяется средним по окрестности 3×3.

image = [
    [10, 10, 10, 10, 10],
    [10, 50, 50, 50, 10],
    [10, 50, 90, 50, 10],
    [10, 50, 50, 50, 10],
    [10, 10, 10, 10, 10],
]
kernel = [
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1],
]
kdiv = 9

H, W = len(image), len(image[0])
out = []
for y in range(1, H - 1):          # пропускаем края
    out_row = []
    for x in range(1, W - 1):
        acc = 0
        for ky in range(3):
            for kx in range(3):
                acc += image[y - 1 + ky][x - 1 + kx] * kernel[ky][kx]
        out_row.append(round(acc / kdiv))
    out.append(out_row)

print("Результат свёртки (усреднение 3x3):")
for r in out:
    print(r)

Вывод:

Результат свёртки (усреднение 3x3):
[32, 41, 32]
[41, 54, 41]
[32, 41, 32]

Яркий центр (90) «размазался» по соседям: был резкий пик 90, стало плавное 54 с подсветкой вокруг. Это и есть размытие.

Что такое ядро

Магия в том, что один и тот же механизм делает разные вещи — меняется только ядро (веса):

ЯдроЭффект
все единицы / 9размытие (усреднение)
центр большой, края отрицательныерезкость
веса по горизонтали против вертикаливыделение границ
центр 1, остальное 0тождество (ничего не меняет)

Края и «паддинг»

У пикселей на самом краю нет полного набора соседей — ядро «свешивается» за пределы. В примере мы просто пропустили крайнюю рамку, поэтому результат 3×3 меньше исходных 5×5. На практике края дополняют (padding): нулями, отражением или повтором крайнего пикселя — чтобы размер сохранился.

Почему свёртка — это так важно

Запомните этот механизм: «ядро скользит, считает взвешенную сумму соседей». В разделе про CNN мы увидим, что свёрточная нейросеть делает ровно то же самое — но веса ядра она не задаёт вручную, а подбирает обучением. Свёртка — общий язык классического CV и глубокого обучения.

Итог

  • Свёртка: ядро скользит по картинке, в каждой точке — взвешенная сумма соседей.
  • Эффект задаёт ядро: усреднение, резкость, границы, тождество.
  • Края обрабатывают паддингом, чтобы сохранить размер.
  • CNN — это свёртка с ядрами, которые подбираются обучением.
Проверьте себя
1. Что такое ядро (kernel) в контексте свёртки?
AЦентральный процессор компьютера
BМаленькая матрица весов, которая скользит по картинке и определяет эффект свёртки
CСамый яркий пиксель изображения
DФормат хранения картинки
2. Что делает свёртка с ядром из всех единиц, делённая на 9?
AПовышает резкость
BУсредняет окрестность 3×3 — то есть размывает картинку
CИнвертирует цвета
DНаходит границы
3. Чем свёрточный слой нейросети принципиально отличается от классической свёртки?
AОн не использует ядра
BВеса ядра не задаются вручную, а подбираются в процессе обучения
CОн работает только с цветными картинками
DОн не скользит по изображению
Поддержать проект