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

Таким чином, кожному пікселю зображення відповідає елемент матриці. Значення в матриці числа типу float з проміжку [0,255] .
Візьмемо якесь зображення і додамо до нього шум (це простіше, ніж шукати зображення вже з шумом, тому що можна перевірити на скільки алгоритм добре справляється з шумами, задаючи різну інтенсивність шуму). Отримаємо щось таке:

Зображення як функція
Для подальшого пояснення методу, мені потрібно ввести деякі позначення: По-перше, далі ми розглядатимемо наше зображення як функцію від координат пікселів. Таким чином, якщо ми хочемо сказати, що піксель з координатами х і білий, то миможемо записати це як I(x,y)==255
Далі, якщо ми маємо функцію, то ми можемо взяти від неї похідну і далі нам це знадобиться. Так як функція у нас дискретна, тобто задана в осередках, з встановленим кроком між ними, то ми можемо її записати як (оскільки функція двовимірна, то і похідних, відповідно дві):
Тут k = = 1 оскільки різниця між сусідніми пікселями = 1 піксель.
Таким чином, похідні будуть також матрицями такого ж розміру як і вихідне зображення:


Маючи похідні за обома координатами логічно порахувати градієнт:
І його величину:
Величину градієнта можна вивести у вигляді зображення:

Тепер уважно подивимося на величину градієнта. Вона має велике значення там, де зберігається потрібна нам інформація. Щоб позбавити зображення шуму логічно, що його потрібно розмити. Однак при розмитті губляться важливі деталі. Тобто ми хотіли б обмежити розмиття у зонах, де градієнт досить великий. Залишилося лише питання як це зробити.
Зв'язок із процесом дифузії
Тут нам на допомогу приходить чудовий фізичний процес дифузії. Представимо матрицю зображення як індикатор наявності маси у тій чи іншій точці площини. Процес дифузії полягає в тому, що маса «розтікається» з точок з великою її концетрацією в крапки з малою. У процесі дифузії є поняття потоку, який підпорядковується так званому закону Фіка:
Де D - Тензор дифузії, який задає напрямок і величину дифузії.
Запишемо також закон збереження маси, який говорить про те, що різниця вхідного та вихідного потоків дорівнює зміні маси в точці:
Якщо потік не обмежувати, тобто D==1 — маса поширюватиметься у всіхнапрямки рівномірно, тобто ми отримаємо еквівалент Гаусівського розмиття, а значить втратимо важливі деталі зображення. Нас цікавить метод, за допомогою якого можна обмежувати потік. Однією з найпростіших методів є обмеження величини потоку, не обмежуючи його напрями. Про нього й говоритимемо далі.
Введемо на розгляд деяку спадну функцію, на вхід якої будемо подавати величину градієнта. Ця функція на даному етапі буде тензором дифузії:
Тоді рівняння збереження маси набуває вигляду:
Далі розпишемо всі формули (цей крок я, мабуть, опущу) і запишемо кінцеве рівняння, за допомогою якого можна знайти розв'язання задачі:
Таким чином, ми отримали ітераційну схему, яка стабільна при значеннях параметра tau . Вона задоволена повільна, оскільки метод базовий і успішні алгоритми базуються у ньому.
Зрештою ми отримаємо зображення, яке зберегло майже всі важливі деталі та втратило майже весь шум.
UPD:Приношу щирі вибачення, зображення були переплутані. Замінив зображення, яке було раніше на те, що виходить в результаті обробки зображення з такою кількістю шуму, як представлено в статті. Ще раз приношу вибачення.

Для порівняння - оригінал та версія з шумом (ще раз):


Література:
- P. Perona, J. Malik: Швидкий-простір і ступінь визначення використання анізотропічної diffusion. IEEE Transactions on Pattern Analysis and Machine Intelligence 12(7):629-639, 1990.
- J. Weickert: Anisotropic Diffusion in Image Processing. Teubner, Stuttgart, 1998. Book is not available anymore, but the PhD thesis of Joachim Weickert, which was the basis of its book, is available on his website.
- T. Brox: Lectures on Computer Vision. Freiburg im Breisgau, 2011
P.S. При виявленні неточностей буду радий почути критику і побажання.
Хардкорна конфа за С++. Ми запрошуємо лише профі.