Ноу Інти, лекція, базові операції обробки зображень

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.

Схожі статті