2. Огляд можливостей модуля imgproc бібліотеки OpenCV
2.1. Cвертка і лінійні фільтри
Лінійні фільтри - сімейство найпростіших фільтрів зображень з точки зору математичного опису [6]. Припустимо, що є півтонування. Тоді будь-який лінійний фільтр визначається вещественнозначной функцією, заданою на растрі. Ця функція називається ядром фільтра. а операція фільтрації виконується за допомогою обчислення дискретної згортки:
Як правило, ядро фільтра застосовується до деякої околиці 0 точки, тому межі зміни індексів і визначаються обраної формою і розміром околиці. Дана околиця в деяких джерелах називається шаблоном або апертурою. У процесі обчислення згортки виконується прохід по пікселях всього зображення, шаблон накладається на кожен поточний піксель за допомогою поєднання пікселя з конкретною точкою шаблону - провідною позицією шаблону. після чого обчислюється згортка. Необхідно окремо звернути увагу на ситуацію, коли поточний піксель знаходиться на кордоні зображення. Зазначену проблему можна вирішити кількома способами:
- Обрізати краї, тобто не проводити фільтрацію для всіх граничних пікселів, на які неможливо накласти шаблон без виходу за межі зображення.
- Чи не враховувати в процесі підсумовування піксель, який реально не існує.
- Довизначити околиці граничних пікселів за допомогою екстраполяції (наприклад, простим дублюванням граничних пікселів).
- Довизначити околиці граничних пікселів за допомогою дзеркального відображення, тобто загорнути зображення в тор.
Вибір рішення багато в чому залежить від програми, так наприклад, дзеркальне відображення на практиці не зовсім природний спосіб.
Для обчислення згорток в бібліотеці OpenCV присутня функція filter2D.
Розглянемо докладніше параметри наведеної функції.
- src - вихідне зображення.
- dst - згортка. Має таку ж кількість каналів і глибину, що і вихідне зображення.
- ddepth - глибина результуючого зображення. Якщо на вхід функції передано від'ємне значення, то глибина збігається з глибиною вхідного зображення.
- kernel - ядро згортки, одноканальна речова матриця.
- anchor - провідна позиція ядра. За замовчуванням приймає значення (-1, -1), яке означає, що провідна позиція розташована в центрі ядра.
- delta - константа, яка може бути додана до значення інтенсивності після фільтрації перед безпосереднім записом результату.
- borderType - параметр, що визначає метод доповнення кордону, щоб можна було застосовувати фільтр до граничних пикселям вихідного зображення. Приймає будь-яке значення виду BORDER_ * за винятком BORDER_TRANSPARENT і BORDER_ISOLATED.
Функція забезпечує застосування довільного лінійного фільтра з ядром kernel до зображення src. Результат фільтрації записується в масив dst. Якщо апертура виходить за межі зображення, то граничні пікселі доповнюються відповідно до методу, зазначеним в borderType. Нове значення інтенсивності пікселя обчислюється за формулою:
У разі багатоканального зображення ядро застосовується до кожного каналу окремо.
Нижче наведено приклад використання функції filter2D. Представлена програма забезпечує завантаження зображення і застосування лінійного фільтра з речовим ядром, заданим константою kernel. Також виконується відображення вихідного і результуючого зображень.
Далі на малюнку показаний результат роботи наведеної програми (рис. 7.1. Праворуч). Очевидно, що застосування фільтра з ядром, зафіксованим в програмної коді (виділено жирним шрифтом), призвело до зменшення контрасту вихідного тестового зображення (рис. 7.1. Зліва).
Мал. 7.1. Результат застосування фільтра
Відзначимо, що в разі великих ядер (розміру порядку 11x11 пікселів) для обчислення згортки використовується швидке перетворення Фур'є, в разі невеликих ядер - прямий алгоритм. Також якщо ядро сепарабельное, тобто може бути представлено у вигляді пари ядер, які можуть бути послідовно застосовані до рядках і стовпцях зображення окремо, то передбачена більш ефективна реалізація лінійного фільтра з використанням функції sepFilter2D. При виклику дана функція вимагає явної вказівки двох одновимірних ядер rowKernel і columnKernel.