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

2.4. оператор Собеля

Оператор Собеля - дискретний диференціальний оператор, який обчислює наближені значення похідних різного порядку для функції яскравості пікселів [1]. Найбільш поширеним прикладом практичного використання є визначення меж (ребер) об'єктів на зображенні, тобто точок різкої зміни яскравості.

Даний оператор заснований на згортку зображення з цілочисельними фільтрами. У найпростішому випадку оператор побудований на обчисленні згорток вихідного зображення з ядрами і. забезпечують обчислення перших похідних за напрямками:

Даний оператор використовується для наближеного обчислення градієнта функції інтенсивності пікселів. Застосування оператора дозволяє визначити наближене значення першої похідної зміни інтенсивності в горизонтальному напрямку, - в вертикальному. На підставі цієї інформації можна обчислити магнітуду градієнта для пікселя з координатами згідно з формулою. Також використовуючи отримані дані, можна визначити напрямок градієнта як.

У бібліотеці OpenCV підтримується обчислення перших, других, третіх і змішаних похідних функції інтенсивності пікселів з використанням розширеного оператора Собеля [7]. Нижче наведено прототип відповідної програмної функції.

Перерахуємо вхідні параметри функції Sobel.

  • src - вихідне зображення.
  • dst - результуюче зображення.
  • ddepth - глибина результуючого зображення.
  • xorder - порядок похідної по осі Ox.
  • yorder - порядок похідної по осі Oy.
  • ksize - розмір розширеного ядра оператора Собеля. Приймає одне зі значень 1, 3, 5 або 7. У всіх випадках ядро ​​має розмір kSize x kSize. крім ситуації, коли kSize = 1. При kSize = 1 ядра мають розмір 3x1 або 1x3, по суті застосовується фільтр Гаусса. Вказане значення можна використовувати тільки при обчисленні перших і других приватних похідних по осях Ox і Oy. За замовчуванням ядро ​​має розмір 3x3. Відзначимо, що додатково передбачено спеціальне значення параметра kSize = CV_SCHARR = -1. який відповідає ядру розміру 3x3 фільтра Щарри (Scharr) і може давати більш точні оцінки похідних в порівнянні з оператором Собеля:
  • scale - опціональний параметр, який задає коефіцієнт масштабування для обчислюваних значень похідних. За замовчуванням масштабування не застосовується.
  • delta - опціональний параметр зміщення інтенсивності, додається перед збереженням результату в матрицю dst.
  • borderType - параметр, що визначає метод доповнення кордону.
  • Нижче наведено приклад виділення ребер на зображенні за допомогою застосування горизонтального і вертикального операторів Собеля і усереднення отриманих градієнтів за напрямками. Зауважимо, що попередньо застосовується фільтр Гаусса (GaussianBlur) для видалення шумів на оригінальному документі і виконується перетворення отриманого зображення у відтінки сірого (cvtColor). В результаті застосування оператора Собеля виходять зображення, глибина яких відрізняється від глибини вихідного зображення, тому перед подальшими операціями виконується перетворення зазначених матриць в 8-бітові цілочисельні (convertScaleAbs).

    Нижче на малюнку (рис. 7.7) показаний результат виконання наведеної програми на тестовому зображенні (рис. 7.2. Зліва).

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


    Мал. 7.7. Результат застосування оператора Собеля в горизонтальному і вертикальному напрямках, усереднене значення проекцій

    Очевидно, що застосування горизонтального оператора Собеля дозволяє чітко виділити вертикальні ребра, а вертикального - горизонтальні ребра. Суміш зазначених градієнтів з ваговими коефіцієнтами, рівними 0.5 забезпечує обчислення наближеного значення градієнта. Для цього використовується виклик функції addWeighted.

    Відзначимо, що бібліотека OpenCV містить функцію getDerivKernels. яка дозволяє отримати ядро ​​для обчислення конкретної приватної похідною з певною апертурою. Детальний опис параметрів даної функції можна знайти в документації [7].