Потискането на шума като дифузионен проблем
Наскоро, така се случи, изнесох лекция в стария си лицей на тема защо преподават математика и какво можете да направите с нея малко по-приложена по-късно. За учениците от 10 клас се оказа малко трудно може би. Надявам се, че тази тема ще заинтересува някой от общността на habra (ето вариант, който е малко по-сложен от това, което прочетох в лицея, но не мисля, че това е проблем).
Така. Ще говорим за обработката на изображения, по-специално за един от най-простите, но красиви от описателна гледна точка методи за намаляване на шума в изображението.
Не толкова отдавна открих за себе си колко много физика се крие в обработката на изображения. Това ме интересуваше много, предвид факта, че тези два клона на науката в главата ми никога не се пресичаха. В тази статия ще представя как можете да премахнете шума от изображение, като решите проблема с масовия трансфер в самолет.
Представяне на изображение
Първо, нека изясним какво считаме за изображение. За по-лесно описание сега ще разглеждаме само черно-бели изображения. Ще ги представим като матрица на насищане.

Така всеки пиксел от изображението съответства на матричен елемент. Стойностите в матрицата са плаващи в диапазона [0,255] .
Нека вземем изображение и да добавим шум към него (това е по-лесно, отколкото да търсите изображение, което вече има шум, тъй като можете да проверите колко добре алгоритъмът се справя с шума, като зададете различни интензитети на шума). Получаваме нещо подобно:

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


Имайки производни и в двете координати, логично е да изчислим градиента:
И неговата стойност:
Стойността на градиента може да се покаже като изображение:

Сега нека разгледаме по-отблизо величината на градиента. От голямо значение е къде се съхранява необходимата информация. За да се освободи изображението от шум, е логично то да бъде замъглено. При замъгляването обаче се губят важни детайли. Тоест, бихме искали да ограничим размазването в области, където градиентът е достатъчно голям. Остава само въпросът как да го направим.
Връзка с процеса на дифузия
Тук на помощ ни идва забележителният физически процес на дифузия. Нека си представим матрицата на изображението като индикатор за наличието на маса в определена точка от равнината. Процесът на дифузия се състои в това, че масата се "разпространява" от точки с голяма концентрация към точки с малка. В процеса на дифузия съществува концепцията за поток, който се подчинява на така наречения закон на Фик:
Където D е тензорът на дифузията, който определя посоката и количеството на дифузия.
Записваме и закона за запазване на масата, който казва, че разликата между входящия и изходящия поток е равна на промяната в масата в точка:
Ако потокът не е ограничен, т.е. D==1, масата ще се разпространи във всичкипосоки равномерно, тоест ще получим еквивалента на размазване по Гаус, което означава, че ще загубим важни детайли от изображението. Интересуваме се от метод, чрез който потокът може да бъде ограничен. Един от най-простите методи е да ограничите количеството на потока, без да ограничавате посоката му. Ще говорим за него по-нататък.
Нека въведем в разглеждане някаква намаляваща функция, на входа на която ще подадем стойността на градиента. Тази функция на този етап ще бъде тензорът на дифузията:
Тогава уравнението за запазване на масата приема формата:
След това записваме всички формули (аз, може би, пропускам тази стъпка) и записваме окончателното уравнение, с което можете да намерите решение на проблема:
По този начин получихме итеративна схема, която е стабилна за стойностите на параметъра tau. Доста е бавен, тъй като методът е основен и по-успешните алгоритми се базират на него.
В крайна сметка ще получим изображение, което е запазило почти всички важни детайли и е загубило почти всички шумове.
UPD:Моите искрени извинения, изображенията бяха объркани. Изображението, което е било преди, е заменено с това, което е получено в резултат на обработка на изображението с толкова много шум, колкото е представено в статията. Още веднъж се извинявам.

За сравнение, оригиналът и шумовата версия (отново):


Литература:
- П. Перона, Дж. Малик: Откриване на мащабно пространство и ръбове с помощта на анизотропна дифузия. IEEE Transactions on Pattern Analysis and Machine Intelligence 12(7):629-639, 1990.
- J. Weickert: Анизотропна дифузия при обработка на изображения. Teubner, Stuttgart, 1998. Книгата вече не е достъпна, но докторската дисертация на Йоахим Вайкерт, която е в основата на неговата книга, е достъпна на неговия уебсайт.
- Т. Брокс: Лекции по компютърно зрение. Фрайбург в Брайсгау, 2011 г
P.S. Ако се открият неточности, ще се радвам на критики и предложения.
Hardcore conf в C++. Каним само професионалисти.