Cvičení 7 - Diskrétní konvoluce
A) Teoretický úvod
Vzhledem k tomu, že konvoluce je důležitou operací v teorii signálů a že obraz sám je dvojrozměrný diskrétní signál, používá se konvoluce v souvislosti se zpracováním obrazu velmi často. Kromě toho, že konvoluce je jádrem téměř všech pokročilejších transformací obrazu je rovněž nedílnou součástí některých základních metod jako např. detekce hran, kde se jako konvoluční jádro používá některý ze známých hranových detektorů.
Operaci konvoluce lze pro dvojrozměrný obraz vyjádřit následujícím vztahem, v němž symbol g(x,y) značí výstupní obraz, f(x,y) vstupní obraz a h(x,y) konvoluční jádro o rozměrech RxS.
Graficky si lze konvoluci dvou signálů (zde zpravidla obrazu a masky) představit jako postupné prostorové posouvání převrácené masky (konvolučního jádra) po obrazu a stanovení odezvy. Pro každou vzájemnou polohu obrazu a masky je vypočítán součet hodnot pixelů obrazu vážených příslušnými koeficienty masky přičemž tento součet určuje výstupní hodnotu signálu (obrazu) v daném bodě.
Výsledná hodnota obrazu je tedy stanovena jako lineární kombinace části obrazové matice a zvoleného filtru – jedná se tedy o lineární filtraci. Vhodně zvolenými filtry lze řešit filtraci typu dolní nebo horní propust ve stanoveném okolí. Lineární filtry typu dolní propust se využívají pro potlačení vysokých frekvencí tedy zejména pro redukci nežádoucího šumu v obrazu. Může se jednat o šum typu sůl a pepř, o šum s Gaussovým rozložením, šum aditivní, multiplikativní, bílý atd. Jednou možností redukce šumu je prosté průměrování. Při této metodě zaniká šum o velikosti zvoleného okolí průměrování, ale také malé detaily v obrazu. Rozměry filtru záleží na konkrétním obrazu a lze je volit téměř neomezeně, zpravidla se však používá jedno nebo dvou pixelové okolí. Nutnou nevýhodou takové filtrace je, že rozmazává i ostré hrany objektů. Čím větší je velikost filtru, tím větší je rozmazání. Konvoluční maska pro prosté průměrování a pro průměrování se zvýrazněným středem vypadá následovně.
Jinou variantou zvýšení vlivu bodů kolem středu analyzovaného pixelu (váhování na základě vzdálenosti od středu) je filtrace Gaussovým filtrem. Výpočet samotného filtru se provádí na základě vztahu pro dvourozměrné Gaussovo (normální) rozložení.
Charakteristickou vlastností lineárního filtru typu dolní propust je, že součet koeficientů je roven 1, naopak součet koeficientů lineárního filtru typu horní propust je vždy rovna 0 (viz např. hranové detektory).
B) Úkoly
- Vytvořte funkci [J] = ImageConv(I,M) realizující konvoluci vstupního obrazu I a konvolučního jádra M. Funkci implementujte pro obecný rozměr jádra RxS podle definičního vzorce bez použití interní funkce tak, aby rozměry vstupního a výstupního obrazu byly totožné.
- Navrhněte a pomocí funkce z minulého bodu ověřte správnost jádra pro
tyto operace:
- posunutí obrazu o pět pixelů vpravo s ořezáním
- roztažení histogramu obrazu o 30 % se saturací
- inverze obrazu
- průměrování maskou velikosti 3×3, 5×5 a 7×7
- Správnost implementace ověřte i srovnáním s použitím vhodné knihovní funkce nad obrazem obraz01.bmp při průměrování maskou o velikosti 3×3, 5×5 a 7×7. Určete časovou náročnost všech výpočtů a odhadněte typ časové závislosti výpočtu na velikosti masky. Výsledky zobrazte přehledně do jednoho okna včetně časových poměrů.
- Napište funkci [G] = Gauss2D(SizeX,SizeY,SigmaX,SigmaY) pro generování konvoluční masky odpovídající Gaussově normálnímu rozložení. Velikost masky udávají první dva parametry funkce, směrodatné odchylky rozložení v obou uvažovaných směrech druhé dva parametry. Vrchol funkce musí být umístěn uprostřed masky. Filtr vhodně zobrazte.
- Na obrazu obraz06.bmp proveďte filtraci šumu pomocí vámi vygenerované Gaussovy masky. Sledujte vliv parametrů Gaussovy funkce na kvalitu filtrace z hlediska dalšího zpracování obrazu.
C) Dobré vědět
- Z hlediska realizovatelnosti různých výpočtů pomocí konvoluce je důležité uvědomit si mechanismus výpočtu výsledné hodnoty. Matematicky se jedná o součet součinů, čili ve funkci se objevují pouze aditivní a multiplikativní složky. Pomocí konvoluce např. nelze na obraz aplikovat operaci přičtení konstanty (změna jasu).
- Povolené funkce: imread, conv2, imfilter, tic, toc, clock, etime
- Nepovolené funkce: fspecial, imgaussfilt, imgaussfilt3.