Завдання фільтрації зображень. Загальні поняття фільтрації зображень

У статті піде мова про використання convolution matrix (матриці скручування або матриці згортки), за допомогою якої можна створювати та накладати на зображення фільтри, такі як blur, sharpen та багато інших.

Стаття буде цікава не тільки веб-програмістам, але й усім, хто так чи інакше займається програмною обробкою зображень, оскільки функції для роботи з матрицею скручування є у багатьох мовах (точно відомо про php і flash). Також стаття буде цікава дизайнерам, які використовують Adobe Photoshop, оскільки в ньому є відповідний фільтр (Filter-Other-Custom).

Приклади будуть мовою PHP за допомогою бібліотеки GD. Теорія, практика, приклади (обережно, багато картинок!)

Теорія

Говорячи не математичною мовою, convolution- це перетворення однієї матриці за допомогою іншої, яка називається ядром("Kernel"). При обробці зображень як вихідні виступають матриці RGB-каналів пікселів у прямокутних координатах.

Як ядро ​​зазвичай використовується матриця розміром 3x3, але можливо і більше (5x5, 7x7 і т.д.). Ядро містить ступеня впливу ("цінності")навколишніх значень елемента сам елемент.

Перетворення відбувається в такий спосіб. Кожен елемент вихідної матриці збільшується центральне значення матриці ядра. Крім цього на відповідні значення множаться навколишні елементи (при розмірі ядра 3x3 їх буде 8), після чого результати підсумовуються і приймаються як перетворене значення.

Ось простий графічний приклад:

Перетворюване значення виділено червоним, область дії матриці ядра зеленим.

Що напівчисло в результаті перетворення. Цінності всіх навколишніх пікселів, включаючи власне значення дорівнює нулю, крім верхнього середнього, де вона дорівнює одиниці. Таким чином, результат:

(40*0)+(42*1)+(46*0)+(46*0)+(50*0)+(55*0)+(52*0)+(56*0)+(58*0) = 42

Як видно, це перетворення зміщує зображення вниз на 1 піксель.

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

Значення div і offset

При обробці зображень одним тільки перетворенням не відбудешся, потрібна ще нормалізація. Що робити, якщо значення, що вийшло більше 255 або менше 0? Квітів таких немає. Більше того, що вихід за межі кольору явище досить часте.

Для нормалізації результату використовуються додаткові змінні: div (дільник) та offset (коефіцієнт). Вони працюють дуже просто: результат перетворення ділиться на div і до нього додається offset.

Не важко здогадатися, що за умовчанням div = 1, offset = 0 (div = 0 виставляти не можна!).

При перетвореннях як div зазвичай приймається сума всіх елементів матриці скручування. Ця умова дозволяє не допустити спотворень кольорів, якщо вони не потрібні.

Дійсно, якщо область, що перетворюється, містить один і той же колір, то результат вийде як сума елементів ядра помножене на цей колір. Відповідно, щоб залишити колір без змін, треба розділити результат перетворення на цю суму.

Простий приклад: фільтр "негатив".

Як вихідне ми візьмемо наступне зображення:

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

Відповідно до матриці, виходить, що в результаті перетворення всі кольори матимуть негативну величину. Щоб кольори були негативними, потрібно встановити offset = 256, таким чином кольори всіх пікселів віднімаються з 256, що є негативним зображенням:

Як це робиться на PHP

У бібліотеці GD на PHP існує функція imageconvolution, яка містить 4 параметри. Перший – це ідентифікатор зображення. Другий - це матриця у вигляді масиву з трьох масивів з трьома змінними. Третій і четвертий - це div і offset.

Ось код, який робить зображення негативним:

    $img = imagecreatefromjpeg ("images/pattern.jpg") ;

    $ matrix = array (

    array (0, 0, 0),

    array ( 0 , - 1 , 0 ) ,

    array ( 0 , 0 , 0 )

    imageconvolution ($img, $matrix, 1, 256);

    imagejpeg ($img, "images/pattern_negative.jpg", 100);

Відразу варто сказати про одну дуже неприємну особливість GD: при перетвореннях за допомогою зображенняконvolution "руйнується" альфа-канал. Цей баг був описаний уже давно, але, наскільки я знаю, його так і не виправили. У flash цього немає, навіть там є ще додаткові параметри, які відповідають за обробку країв зображень, коли частина пікселів випадає. У php краї просто не обробляються.

Blur, sharpen, emboss

Ось стандартний набір матриць ефектів:

Зверніть увагу для blur коефіцієнт div = 9. Для такої матриці тільки такий коефіцієнт не веде до спотворення кольорів. Ще треба сказати, що варіантів blur-а кілька, вони трохи відрізняються силою ефекту.

І ось які виходять зображення:

Sharpen:

"Акуратні" ефекти

Як очевидно з минулого прикладу з blur, ефект накладається зображення, але досить сильно. Чи можна зменшити силу ефекту на зображення? Виявляється, можна. Але для цього треба змінювати не ступінь впливу навколишніх пікселів, як можна здатися на перший погляд, а кількість пікселів, що впливають:

Тоді отримаємо ефекти, які виглядатимуть набагато акуратніше:

Light-blur:

Light-sharpen:

Light-emboss:

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

На закінчення

Хочу сказати, що ви самі можете створити якийсь цікавий ефект. Для цього достатньо поекспериментувати з матрицею скручування.

Матриця скручування може бути успішно застосована при:

  • створення "маленьких" картинок, напр. генерації аватарів та переглядів (особливо тут добре виглядає light-blur).
  • для створення "тіней" (якби ще з альфа-каналом:)
  • при створенні CAPTHCA (текст + сильний Sharpen чи Emboss)
  • та ін. :-)

Створення симпатичної тіні

    * Створює гарну тінь

    * Увага! Операція ресурсомістка!

    * @param res $image - вихідна картинка

    * @param int $shadow_width - товщина тіні (1..10, вище не рекомендується)

    * @param int $shadow_deep - глибина кольору тіні (1..20, чим вище, тим чорніше)

    * @param string $bg_color - колір тла у форматі #7def34

    function imageaddshadow (& $image , $shadow_width = 4 , $shadow_deep = 7 , $bg_color = false )

    $w = imagesx ($image);

    $h = imagesy ($image);

    $iw = $w + 4 * $shadow_width;

    $ih = $h + 4 * $shadow_width;

    $img = imagecreatetruecolor ($iw, $ih);

    $shadow_deep = 255 - $shadow_deep * 12;

    $shadow = imagecolorallocate ($img, $shadow_deep, $shadow_deep, $shadow_deep);

    if (! $bg_color ) (

    // Білий колір за промовчанням

    $ bg = image colorlocalocate ( $ img , 255 , 255 , 255 ) ;

    else (

    list ($r, $g, $b) = array_map ("hexdec", str_split (ltrim ($bg_color, "#"), 2)));

    $bg = imagecolorallocate ($img, $r + 1, $g + 1, $b + 1);

    // Заливаємо область кольором тла

    imagefilledrectangle ($img, 0, 0, $iw, $ih, $bg);

    // Створюємо тінь

    imagefilledrectangle ($img ,

    1 + $shadow_width ,

    1 + $shadow_width ,

Анотація: Вступ. Лінійні фільтри: визначення, фільтри, що згладжують, контрастопідвищують фільтри, різницеві фільтри. Нелінійні фільтри: приклади нелінійних фільтрів, морфологічні оператори

8.1. Вступ

Уявімо, що, дивлячись на якусь сцену одним оком, ми підносимо до нього скляну пластину. Якщо ця пластина не була ідеально прозорою, зображення, що спостерігається, зміниться. Залежно від скла, з якого зроблена пластина, зміна може бути найрізноманітнішою. Наприклад, якщо це скло було кольоровим, то зображення набуде відповідного відтінку, а від каламутного скла стане розмитим.

Фільтрування зображеньаналогічна такому розгляданню світу через скляну пластину, хоч і дозволяє досягти набагато більшого розмаїття ефектів, ніж експерименти з різними пластинами. Під фільтрацією зображень розуміють операцію, що має своїм результатом зображення того ж розміру, отримане з вихідного за деякими правилами. Зазвичай інтенсивність (колір) кожного пікселя результуючого зображення обумовлена ​​інтенсивностями (квітами) пікселів, розташованих у його околиці у вихідному зображенні.

Правила, що задають фільтрацію (їх називають фільтрами), можуть бути найрізноманітнішими. У цій лекції ми розглянемо найпростіші фільтри. Зауважимо, що, згідно з запропонованим визначенням, операція, що полягає в послідовному застосуванні двох або більше фільтрацій, теж є фільтрацією. Таким чином, можна говорити про складових фільтрах, що відповідають комбінаціям простих. Вивчивши основні типи фільтрів у цій лекції, ми матимемо справу із застосуванням фільтрів, складених із них, на вирішення різноманітних завдань у наступних лекціях. Фільтрування зображень є однією з фундаментальних операцій комп'ютерного зору, розпізнавання образів та обробки зображень. Фактично, з тієї чи іншої фільтрації вихідних зображень починається робота переважної більшості методів. Розглянуті у цій лекції фільтри мають, таким чином, надзвичайну важливість з погляду їх застосування різних додатках.

8.2. Лінійні фільтри

Визначення

(8.1)

Результатом є зображення B . У визначенні (8.1) ми опустили межі підсумовування. Зазвичай ядро ​​фільтра відмінно від нуля тільки в околиці N точки (0, 0) . За межами цієї околиці F(i, j) або точно дорівнює нулю, або дуже близько до нього, так що можна їм знехтувати. Підсумовування (8.1) проводиться по , і значення кожного пікселя B(x, y) визначається пікселями зображення A , які лежать у вікні N , центрованому в точці (x, y) (ми позначатимемо це безліч N(x, y) ) . Ядро фільтра, задане на прямокутній околиці N може розглядатися як матриця m на n , де довжини сторін є непарними числами. При заданні ядра матрицею M kl її слід центрувати:

(8.2)

Також потребує додаткового прояснення ситуація, коли піксель (x, y) знаходиться на околиці країв зображення. У цьому випадку A(x + i, y + j) у визначенні (8.1) може відповідати пікселю A , що лежить за межами зображення A . Цю проблему можна вирішити кількома способами.

  • Не проводити фільтрацію для таких пікселів, обрізавши зображення B з обох боків або зафарбувавши їх, наприклад, чорним кольором.
  • Не включати відповідний піксель у підсумовування, розподіливши його вага F(i, j) рівномірно серед інших пікселів околиці N(x, y).
  • Визначити значення пікселів за межами зображення за допомогою екстраполяції. Наприклад, вважати постійним значення інтенсивності поблизу кордону (для пікселя (-2, 5) маємо A(-2, 5) = A(0, 5) ) або вважати постійним градієнт інтенсивності поблизу кордону ( A(-2, 5) = A(0, 5) + 2(A(0, 5) - A(1, 5))).
  • Визначити значення пікселів за межами зображення за допомогою дзеркального відображення (A(-2, 5) = A(2, 5) ).

Вибір конкретного способу потрібно проводити з урахуванням конкретного фільтра та особливостей конкретної програми.

Розібравши загальне визначення лінійних фільтрів, перейдемо до прикладів.

Фільтрування з використанням функції imfilter

Фільтрування зображень, у тому числі кореляція та конволюція, можуть бути реалізовані за допомогою функції imfilter. Розглянемо приклад фільтрації зображення ковзною апертурою з розмірами 5×5 та однаковими ваговими складовими. Такий фільтр називається середнім фільтром.

I = imread("coins.png"); h = ones (5,5) / 25 h = 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.040 0.0400 400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 I2 = imfilter(I,h); imshow(I); % Вихідне зображення figure, imshow(I2); % Зображення після фільтрації

Типи даних

Типи даних функції imfilter встановлюються так само, як і при використанні інших схожих арифметичних функцій. Результуюче зображення буде представлено у тому форматі даних, що й вихідне зображення. Функція imfilter обчислює значення кожного результуючого пікселя у форматі подвоєної точності, проводячи арифметичні операції з плаваючою комою. Якщо результуючі значення перевищують діапазон, визначений для даного типу даних, функція imfilter може обрізати їх до потрібного діапазону. Це залежить від формату представлення даних. Якщо дані представлені у форматі integer, тоді функція imfilter округляє дрібну частину.

Таким чином, при використанні функції imfilter необхідно враховувати формат представлення даних зображення. Розглянемо приклад, де в результаті застосування функції imfilter отримано негативні значення. Вихідні дані представлені у форматі double.

A = magic(5) A = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 h = [-1 0 1] h = -1 0 1 imfilter(A ,h) ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2

Зазначимо, що результат представлений також негативними значеннями. Якщо матрицю A уявити не у форматі double, а у форматі uint8, то отримаємо такий результат:

A = uint8(magic(5)); imfilter(A,h) ans = 24 0 0 14 0 5 0 9 9 0 6 9 14 9 0 12 9 9 0 0 18 14 0 0 0

Після того, як вихідні дані були представлені у форматі uint8, результуючі дані також подаються у форматі uint8, а негативні значення будуть обрізані до 0. Таким чином, вихідні дані перед застосуванням функції imfilter можна перетворити і в інші формати, наприклад, signed integer, single або double.

Опції кореляції та згортки

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

Однак, якщо необхідно виконати фільтрацію з використанням згортки, потрібно вказати опцію "conv" як необов'язковий аргумент функції imfilter. Розглянемо приклад.

A = magic(5); h = [-1 0 1] imfilter(A,h) % фільтрація з використанням кореляції ans = 24 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -2 imfilter(A,h,"conv") % фільтрація з використанням згортки ans = -24 16 16 -14 8 -5 16 -9 -9 14 -6 -9 -14 -9 20 -12 -9 -9 16 21 -18 -14 16 16 2

Опція доповнення краю зображення

При обчисленні результуючих пікселів на краю зображення частина маски фільтра вийде за межі зображення так, як показано на зображенні.


Вихід значень маски фільтра за межу зображення

Зазвичай, при виході маски фільтра за кордон зображення, функція imfilter заповнює комірки, що відсутні, нульовими значеннями. Приклад такого заповнення показаний малюнку внизу.


Заповнення пікселів, що бракують, нульовими значеннями

Якщо відфільтрувати зображення, заповнюючи відсутні пікселі нулями, то на результуючому зображенні на межі зображення з'явиться темна лінія. Це показано малюнку.

I = imread("eight.tif"); h = ones (5,5) / 25; I2 = imfilter(I,h); imshow(I), title("Початкове зображення"); figure, imshow(I2), title("Зображення після фільтрації");

Для усунення артефактів, які обумовлені тим, що відсутні елементи були заповнені нулями, imfilter застосовує альтернативні методи заповнення відсутніх елементів. Один з цих методів полягає в тому, що пікселі, що відсутні, заповнюються значеннями крайніх пікселів зображення. Цей метод показано на зображенні внизу.


Заповнення маски крайніми пікселями зображення

При реалізації фільтрації з використанням заповнення відсутніх елементів крайніми елементами зображення, необхідно додатково функції imfilter вказувати опцію "replicate".

I3 = imfilter(I,h,"replicate"); figure, imshow(I3);

Функція imfilter підтримує також інші способи заповнення пікселів, що бракують, при обробці крайніх елементів зображення. Для цього є такі опції як "circular" та "symmetric". Для більш детальної інформації див. опис функції imfilter.

Багатомірна фільтрація

Функція imfilter може обробляти також багатовимірні зображення. Відмінності між фільтрацією двовимірних і тривимірних зображень полягають у тому, що при обробці тривимірних зображень фільтрації підлягає окремо кожен колірний шар, який є двовимірним зображенням і може оброблятися двовимірним фільтром.

Розглянемо приклад обробки кольорового зображення, де реалізована фільтрація кожного кольорового шару:


Система MATLAB має в своєму розпорядженні кілька двомірних і багатовимірних функцій фільтрації. Функція filter2 виконує двовимірну лінійну фільтрацію, conv2 виконує згортку двовимірних сигналів, а convn - згортку багатовимірних сигналів. При роботі з кожною з цих функцій необхідно, щоб вихідні дані були представлені у форматі double. Результат буде представлений у форматі double. Ці функції завжди використовують заповнення нулями пікселів, що бракують, при роботі на краю зображення і не підтримують інших способів заповнення.

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

Використання визначених типів фільтрів

Функція fspecial має можливість формування кількох видів зумовлених фільтрів, що відбивається на формі маски. Після створення фільтра за допомогою функції fspecial його можна застосувати для обробки даних зображення за допомогою функції imfilter. Розглянемо приклад реалізації фільтра типу нечіткого маскування обробки повнокольорового зображення. Метод нечіткого маскування ефективно застосовується для посилення кордонів та підвищення деталізації зображень.

I = imread("moon.tif"); h = fspecial("unsharp") h = -0.1667 -0.6667 -0.1667 -0.6667 4.3333 -0.6667 -0.1667 -0.6667 -0.1667 I2 = imfilter(I,h); imshow(I), title("Початкове зображення") figure, imshow(I2), title("Оброблене зображення")

Частотні методи перетворень

Частотні методи перетворень використовують як одновимірні, і двовимірні фільтри з кінцевої імпульсної характеристикою. Ці методи використовують матрицю перетворень, елементи якої визначають частотні перетворення.

Функція програми ftrans2 призначена реалізації частотних методів обробки зображень. Ця функція формує маску лінійного двовимірного фільтра, використовуючи метод перетворення частот трансформації одновимірного фільтра з кінцевою імпульсною характеристикою. (Для більш детальної інформації див. Jae S. Lim, 2-Dimensional Signal and Image Processing, 1990.

Зазначимо, що частотні методи перетворень забезпечують дуже добрі результати обробки. Розглянемо приклад.

B = remez(10,,); h = ftrans2(b); = freqz(b,1,64,"whole"); colormap(jet(64)) plot(w/pi-1,fftshift(abs(H))) figure, freqz2(h,)


Одновимірний частотний відгук (ліворуч) та відповідний йому двовимірний частотний відгук (праворуч)

Приклад частотного методу

У частотних методах маска лінійного фільтра формується з урахуванням бажаної амплітудно-частотної характеристики.

У додатку функція fsamp2 формує маску двовимірного лінійного фільтра на основі бажаної амплітудно-частотної характеристики двовимірного фільтра. Сформована маска призначена для передачі у відповідні функції (наприклад, filter2 або conv2), які виконують двовимірну лінійну фільтрацію. Розглянемо сказане вище конкретному прикладі.

Hd = zeros (11,11); Hd(4:8,4:8) = 1; = freqspace(11,"meshgrid"); mesh(f1,f2,Hd), axis([-1 1 -1 1 0 1.2]), colormap(jet(64)) h = fsamp2(Hd); figure, freqz2(h,), axis([-1 1 -1 1 0 1.2])


Локальні (віконні) методи

У програмі Image Processing Toolbox існують функції, які формують маски лінійного фільтра за бажаною амплітудно-частотною характеристикою з використанням одновимірного або двовимірного вікна. При формуванні матриці бажаної амплітудно-частотної характеристики для більш точного результату рекомендується використовувати відліки частоти, які повертаються функцією freqspace.

Розглянемо це з прикладу.

Hd = zeros (11,11); Hd(4:8,4:8) = 1; = freqspace(11,"meshgrid"); mesh(f1,f2,Hd), axis([-1 1 -1 1 0 1.2]), colormap(jet(64)) h = fwind1(Hd,hamming(11)); figure, freqz2(h,), axis([-1 1 -1 1 0 1.2])


Бажаний двовимірний частотний відгук (ліворуч) та реальний двовимірний частотний відгук (праворуч)

Створення бажаної амплітудно-частотної характеристики

Функції проектування фільтрів fsamp2, fwind2 та fwind2 створюють фільтри на основі матриці значень бажаної амплітудно-частотної характеристики. Відповідну бажану амплітудно-частотну характеристику можна створювати за допомогою функції freqspace.

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

Freqspace(25,"meshgrid"); Hd = zeros (25,25); d = sqrt(f1.^2 + f2.^2)


Ідеальний кругоподібний низькочастотний відгук

Обчислення частотного відгуку фільтра

Функція freqz2 обчислює частотний відгук двовимірного фільтра. Якщо для фільтра з кінцевою імпульсною характеристикою прийняти, що

H =;

то розглянемо обчислення та візуалізацію 64×64 точок частотного відгуку h.

Freqz2(h)


Частотний відгук двовимірного фільтра

Для отримання частотного відгуку H і вектора частот f1 і f2 використовуємо наступний код

Freqz2(h);

приклад.

Розглянемо приклад розмиття зображення. Реалізуємо цю процедуру за допомогою двовимірного фільтра низьких частот (ФНЧ) з кінцевою імпульсною характеристикою (КІХ), який сформований із одновимірного ФНЧ методом перетворення частот.

Деякі види перетворень в обробці зображень

У більшості випадків, математично зображення представляють у вигляді функції від двох просторових змінних ƒ(x,y). Значення функції у точці (x, y)еквівалентно рівню інтенсивності у цій точці.

  1. Перетворення Фур'є;
  2. Дискретні косинусні перетворення
  3. Перетворення Радону
  4. Проекційні перетворення

Також розглянемо деякі терміни, які будуть застосовуватися при різноманітних перетвореннях.

Термін

Визначення

Дискретні перетворення

Це вид перетворень, у яких вихідні і результуючі дані представляються як дискретних значень. Дискретні перетворення, які реалізовані в MATLAB і, зокрема, у Image Processing Toolbox, включають дискретне перетворення Фур'є та дискретні косинусні перетворення.

Частотна область Область, в якій зображення подано у вигляді суми періодичних сигналів з різними частотами.
Просторова область Область, в якій зображення представлене у вигляді точок у просторі, кожній з яких відповідає деяке значення інтенсивності.
Перетворення

Альтернативне математичне подання зображень. Наприклад, при перетвореннях Фур'є зображення подається у вигляді суми комплексних експоненційних змінних амплітуди, частоти та фази. Цей тип перетворень найчастіше використовується при аналізі, покращенні та стисканні зображень.

Багато підходів до поліпшення зображень розпадається на дві категорії: методи обробки в просторовій області (просторові методи) та методи обробки в частотній області (частотні методи). До просторової області відноситься сукупність пікселів, що становлять зображення. Функція попередньої обробки у просторовій області записується у вигляді

де f(x, y) – вхідне зображення,

g(x, y) – вихідне (оброблене) зображення,

h- Оператор функції f, визначений у деякій області ( x, y).

Операції такого виду відносяться до загального класу операцій над сусідніми елементами. Ці операції є основним інструментарієм при низькорівневій обробці зображеньабо обробці зображень у просторовій області.

Основним підходом щодо околиці точки ( x, y) є використання квадратної або прямокутної області частини зображення з центром у точці ( x, y). Центр цієї частини зображення переміщається від пікселя до пікселя, починаючи, наприклад, з лівого верхнього кута. При цьому для отримання g(x, y) оператор застосовується для кожного положення ( x, y). Хоча використовуються іноді й інші форми околиці (наприклад, коло), квадратні форми кращі через простоту їх реалізації.

Один з методів просторової області, що найбільш застосовується, заснований на використанні фільтрів (масок згортки, шаблонів, вікон). Зазвичай маска фільтра є невеликою (наприклад, розмірність 3*3) двовимірною системою, коефіцієнти якої вибираються таким чином, щоб виявити задану властивість зображення (рис. 1.5, а).

Мал. 1.5: а – маска фільтра; б - коефіцієнти маски фільтра

Якщо величини w 1 ,w 2 ,…,w 9 являють собою коефіцієнти, маски пікселя ( x, y) та його восьми сусідів (рис.1.5, б), то алгоритм можна представити як виконання наступної операції на околиці 3*3 точки (x, y) :

Під завданням фільтрації зображень у сенсі розуміють будь-які процедури обробки зображень, у яких на вхід процедури подається растрове зображення і на виході формується растрове зображення. Проте найчастіше під «фільтрацією» розуміють так звану перешкодну фільтрацію. Головна мета перешкодової фільтрації полягає в такій обробці зображень, при якій результат виявляється більш відповідним з точки зору застосування. У випадку можна виділити лінійні фільтри(згладжуючі фільтри, контрастопідвищуючі фільтри, різницеві фільтри) та нелінійні фільтри(Медіанний фільтр).

Наведемо короткий опис найпоширеніших методів фільтрації.

Низькочастотний фільтр– послаблює високочастотні компоненти та посилює роль низькочастотних. Частота у застосуванні до зображень відображає кількість наявних у зображенні деталей. Різкі перепади яскравості, перешкоди та шуми є прикладом високочастотних елементів у зображенні. Згладжування зображення реалізується за допомогою наступних ядер:

,

,

.

Високочастотний фільтр– послаблює низькочастотні компоненти у зображенні та посилює роль високочастотних. Фільтри високої частоти застосовуються для виділення таких деталей, як контури, межі або підвищення різкості зображення. Кожен стрибок яскравості і контур являють собою інтенсивні деталі, пов'язані з підвищеними частотами. Виділення високочастотних компонентів здійснюється за допомогою наступних ядер:

,

,

.

Оператор Робертса.Оператор Робертса є прикладом нелінійного фільтра. Перетворення кожного пікселя перехресним оператором Робертса може показати похідну зображення вздовж ненульової діагоналі, і комбінація цих перетворених зображень може розглядатися як градієнт від двох верхніх пікселів до двох нижніх. Оператор Робертса використовується для швидкості обчислень, але програє в порівнянні з альтернативами через значну проблему чутливості до шуму. Він дає лінії тонші, ніж інші методи виділення кордонів.

В обробці беруть участь чотири пікселі, розташовані в такий спосіб (рис. 1.6).

Мал. 1.6. Пікселі, які беруть участь у обробці оператором Робертса

Відгук оператора Робертса:

Ядра згортки в даному випадку виглядатимуть таким чином:

,

.

Згортка для кожного ядра обчислюється окремо. Як відгук даного фільтра виступає величина

, (1.17)

де Pі Q- відгук ядер H 1 і H 2 .

Іноді як оператор Робертса береться величина
.

Оператор Собеля.Оператор Собеля застосовують у алгоритмах виділення кордонів. Це дискретний диференціальний оператор, який обчислює наближене значення градієнта яскравості зображення. Результатом застосування оператора Собеля в кожній точці зображення є вектор градієнта яскравості в цій точці, або його норма. Метод посилення краю за допомогою оператора Собеля розглядає два різні ядра згортки:

Виходячи з цих згорток обчислюється величина та напрямок країв. Згортка для кожного ядра обчислюється окремо. Як відгук даного фільтра виступає величина

, (1.19)

де Pі Q- відгук ядер H 1 і H 2 .

Іноді як оператор Собеля береться величина
.

Оператор Превітт.Аналогічно оператору Собеля діє оператор Превітта. Детектор кордонів Превітта є відповідним способом оцінки величини і орієнтації кордону. У той час як детектор з диференціальним градієнтом потребує трудомісткого обчислення оцінки орієнтації за величинами у вертикальному та горизонтальному напрямках, детектор кордонів Превітта дає напрямок прямо з ядра з максимальним результатом. Метод посилення краю за допомогою оператора Превітта розглядає два різні ядра згортки:

Результат роботи оператора Превітта є

, (1.21)

де Pі Q- відгук ядер H 1 і H 2 .

Оператор Лапласа.Дискретний оператор Лапласа часто використовується в обробці зображень, наприклад завдання виділення кордонів або в додатках оцінки руху. Дискретний лапласіан визначається як сума других похідних та обчислюється як сума перепадів на сусідах центрального пікселя. Метод посилення краю Лапласом розглядає цілу низку різних ядер згортки. Наведемо деякі з них:

Як бачимо, сума елементів матриць дорівнює нулю, тому відгук фільтра може бути негативним. У цьому випадку значення відгуку береться за модулем. В результаті обробки області з постійною або лінійно зростаючою інтенсивністю стають чорними, а значень інтенсивності, що швидко змінюються, яскраво висвічуються.

Нижче наведемо деякі просторові процеси, які підпадають під категорію згортки і можуть застосовуватися усунення різного виду шуму.

Фільтр «гармонійне середнє». Гармонічне середнє ряду
обчислюється за формулою

. (1.23)

У процесі фільтрації значення поточного пікселя зображення замінюється на
безлічі значень дев'яти пікселів, включаючи поточний та сусідні.

Min- Фільтр.У процесі фільтрації значення поточного пікселя замінюється мінімальне значення сусідніх пікселів. Так, наприклад, для ядра розмірності 3 матимемо:

Max- Фільтр.У процесі фільтрації значення поточного пікселя замінюється на максимальне значення сусідніх пікселів (за аналогією з попереднім фільтром).

Min- Max-фільтр.У процесі фільтрації значення поточного пікселя зображення спочатку замінюється мінімальне значення сусідніх пікселів, а при повторному проході на максимальне.

Медіанний фільтр.Усереднене фільтрування використовує значення елементів, які у області примикання, визначення нового значення. Фільтр має в своєму розпорядженні елементи області примикання в відсортованому порядку і відбирає середнє значення. Так, наприклад, для ядра розмірності 3 медіа значення буде п'ятим:

За допомогою методів просторової обробки зображень можна отримати низку цікавих ефектів. Наведемо деякі з них.

Ефект тиснення.За допомогою операції згортки можна реалізувати перетворення, що дає ефект тиснення на зображенні.

(1.24)

Бінарне «псевдонапівтонове» зображення.Вихідне зображення обробляється за допомогою маски D2 або D4: якщо значення пікселя менше пропорційного значення відповідного йому елемента маски, він обнулюється, інакше йому присвоюється 255. Маска накладається на зображення без перекриття. Маски D2 та D4:

,

.

При використанні просторових процесів можуть виникнути такі питання, пов'язані з особливостями обробки пікселів:

    Усунення крайових ефектів;

    Значення відгуку виходить за межі.

Для першого питання можливі такі шляхи вирішення:

    Виключити з перетворення граничні пікселі зображення

у цьому випадку вихідне зображення матиме менші розміри або зафарбувати граничні пікселі, наприклад чорним кольором;

    Не включати відповідний піксель у підсумовування, рівномірно розподіливши його вагу серед інших пікселів околиці;

    Доповнити (добудувати) вихідне зображення, додавши необхідну кількість пікселів за кордоном. Кількість рядків стовпців, що добудовуються, як правило, залежить від розміру ядра. Тут можливі два варіанти:

    • Визначити значення пікселів за межами зображення за допомогою екстраполяції. Наприклад, вважати постійним значення інтенсивності поблизу кордону або вважати постійним градієнт інтенсивності поблизу кордону;

      Визначити значення пікселів за межами зображення за допомогою дзеркального відображення.

Для вирішення проблем, пов'язаних з виходом значення за межі, можливі такі дії:

    Масштабувати отримані значення при позитивних відгуках фільтра;

    При негативному відгуку фільтра брати або абсолютне значення (модулем), або призводити до нуля.

Також у цьому розділі варто навести можливу «класифікацію» шуму на зображенні:

    Шум «сіль та перець» – випадкові білі та чорні пікселі;

    Імпульсний шум – випадкові білі пікселі;

    Гаусов шум - коливання інтенсивності, розподілені за нормальним законом.

Ця стаття розповідає не лише про найбільш поширені фільтри обробки зображень, але у зрозумілій формі описує алгоритми їх роботи. Стаття орієнтована, передусім, на програмістів, котрі займаються обробкою зображень.

Матриця згортки

Фільтрів, що використовують матрицю згортки багато, нижче будуть описані основні з них.

Матриця згортки – це матриця коефіцієнтів, яка «помножується» на значення пікселів зображення щоб одержати необхідного результату.
Нижче наведено застосування матриці згортки:

div – це коефіцієнт нормування, щоб середня інтенсивність залишалася не зрадою.

У прикладі матриця має розмір 3x3, хоча розмір може бути більшим.

Фільтр розмиття

Найчастіше використовуваним фільтром, заснованим на матриці згортки, є фільтр розмиття.

Зазвичай матриця заповнюється за нормальним (гаусовим законом). Нижче наведено матрицю розмиття 5x5 заповнену за законом Гаусівського розподілу.


Коефіцієнти вже нормовані, так що div для цієї матриці дорівнює одному.

Від розміру матриці залежить сила розмиття.


Варто згадати про граничні умови (ця проблема актуальна для всіх матричних фільтрів). У верхнього лівого пікселя не існує «сусіда» з права від нього, отже, нам нема на що множити коефіцієнт матриці.

Існує 2 вирішення цієї проблеми:

1. Застосування фільтра лише до «вікна» зображення, яке має координати лівого верхнього кута , а для правого нижнього . kernelSize – розмір матриці; width, height – розмір зображення.

Це не найкращий спосіб, оскільки фільтр не застосовується до всього зображення. Якість при цьому дуже страждає, якщо розмір фільтра великий.

2. Другий метод вимагає створення проміжного зображення. Ідея в тому, щоб створювати тимчасове зображення з розмірами (width + 2* kernelSize/2, height + 2* kernelSize/2). У центрі зображення копіюється вхідна картинка, а краї заповнюються крайніми пікселями зображення. Розмиття застосовується до проміжного буфера, та був із нього витягується результат.


Даний метод не має недоліків як, але необхідно проводити зайві обчислення.

Фільтр розмиття по Гаусс має складність O(hi * wi * n * n), де hi, wi - розміри зображення, n - розмір матриці (ядра фільтра). Цей алгоритм можна оптимізувати з прийнятною якістю.

Квадратне ядро ​​(матрицю) можна замінити двома одновимірними: горизонтальним та вертикальним. Для розміру ядра 5 вони матимуть вигляд:

Фільтр застосовується в два проходи: спочатку горизонтальний, а потім до результату вертикальний (або на оборот).

Складність даного алгоритму буде O(hi * wi * n) + O (hi * wi * n) = 2 * O (hi * wi * n), що для розміру ядра більше двох, швидше, ніж традиційний метод з квадратною матрицею.

Фільтр покращення чіткості

Для покращення чіткості необхідно використовувати таку матрицю:

Ця матриця підвищує різницю значень на межах. Div для цієї матриці дорівнює 1.


У програмі GIMP є фільтр «Матриця згортки», який полегшує пошук необхідного Вам матричного перетворення.

Більш детальну інформацію про фільтри засновані на матриці згортки ви можете знайти у статті «Графічні фільтри на основі матриці скручування» .

Медіанний фільтр

Медіанний фільтр зазвичай використовується для зменшення шуму або згладжування зображення.

Фільтр працює з матрицями різного розміру, але на відміну від матриці згортки, розмір матриці впливає тільки на кількість пікселів, що розглядаються.

Алгоритм медіанного фільтра наступний:

Для поточного пікселя пікселі, які «попадають» у матрицю, сортуються, і вибирається середні значення з відсортованого масиву. Це значення є вихідним для поточного пікселя.

Нижче представлена ​​робота медіанного фільтра для розміру ядра, що дорівнює трьом.


Фільтри нарощування та ерозія служать для отримання морфологічного розширення або звуження відповідно. Простіше кажучи, це означає вибір пікселя з максимальною або мінімальною інтенсивністю з околиці.


Внаслідок нарощування відбувається збільшення яскравих об'єктів, а ерозії – збільшення темних об'єктів.

Фільтр використовує вхідне зображення та бінарну матрицю. Бінарна матриця визначає форму околиці. Зазвичай околиця має круглу форму.

Фільтр нарощування може бути використаний для збільшення відблисків, яскравих відбитків.

Висновок

У статті було описано деякі з фільтрів обробки зображення, описано їх алгоритми та особливості застосування.