Фильтры и свёртка: ядро, которое скользит по картинке
Свёртка — это операция, на которой стоит почти всё компьютерное зрение, от размытия до свёрточных нейросетей.
Свёртка (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 — это свёртка с ядрами, которые подбираются обучением.