Згортка використовується для багатьох речей, таких як обчислення похідних, виявлення країв, застосування розмиття тощо, і все це робиться за допомогою «ядра згортки». Ядро згортки — це дуже маленька матриця, і в цій матриці кожна комірка має число, а також точку прив’язки.
Точка прив’язки використовується для визначення положення ядра відносно зображення. Він починається у верхньому лівому куті зображення та послідовно переміщується на кожен піксель. Ядро перекриває декілька пікселів у кожній позиції на зображенні. Кожен піксель, який перекривається, множиться, а потім додається. А сума встановлюється як значення поточної позиції.
Згортка — це процес, у якому кожен елемент зображення додається до його локальних сусідів, а потім зважується ядром. Це пов’язано з формою математичної згортки.
У Convolution матриця не виконує традиційне множення матриць, але позначається *.
Припустимо, є дві матриці 3x3, одна є ядром, а інша є частиною зображення. Під час згортки рядки та стовпці ядра перевертаються, потім перемножуються, а потім виконується підсумовування. Елементи, які присутні в центрі матриці, тобто в [2,2] зображення, будуть зваженою комбінацією матриці зображення, а ваги будуть задані ядром. Подібним чином, усі інші елементи матриці будуть зважені, а потім будуть обчислені ваги.
Нижче наведено псевдокод для опису процесу згортання:
For each image row in input image: For each pixel in image row: Set accumulator to zero For each kernel row in kernel: For each element in kernel row: If element position corresponding* to pixel position then Multiply element value corresponding*to pixelvalue Add result to accumulator Endif Set output image pixel to accumulator
Згортку можна обчислити за допомогою кількох циклів for. Але використання циклів for викликає багато повторних обчислень, а також збільшується розмір зображення та ядра. Використовуючи техніку дискретного перетворення Фур’є, обчислення згортки можна виконати швидко. У цій техніці вся операція згортки перетворюється на просте множення.
У згортці проблема виникає, коли ядро знаходиться біля краю або кутів, оскільки ядро є двовимірним.
Щоб подолати ці проблеми, можна зробити наступне:
- Одиниці можна ігнорувати
- Біля країв можна створити додаткові пікселі.
Додаткові пікселі можна створити такими способами:
- Дубльований крайовий піксель.
- Відбивати краї
- Пікселі можна скопіювати з іншого кінця.