úloha 005: Filtr potlačující šum

Úkolem je implementovat nějakou kvalitnější metodu redukce šumu. Cílem je potlačit šum, ale zachovat co nejvíce informací, zejména ostré hrany.

Screenshot

Základ

Základem poslouží projekt 005denoise z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a ihned se automaticky spouští metoda Filter.Recompute() přepočítávající vstup do nové podoby. Výstup je poté zobrazen ve formuláři. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je v souboru Denoise.cs označen závorkami:

  // {{
  // }}

Technicky

Funkce Filter.Recompute() má tyto parametry:
  • Bitmap input vstupní obrázek (pokud by náhodou byl null, musí se s tím funkce vypořádat - smí též vrátit null)
  • string param - volitelný parametr ve formě řetězce, pokud ho použijete, budete muset sami zadefinovat co a v jakém formátu má smí obsahovat (pilotní implementace obsahuje několik parametrů: zadání velikosti okénka, režim rank filtru, zadání velikosti obdélníkové buňky - jedno nebo dvě celá čísla oddělená čárkou)
Návratovou hodnotou funkce je přepočítaný obrázek ve formátu Bitmap, smí být null.

Pokud nechcete používat rychlou (ale nebezpečnější a méně přehlednou) variantu přístupu k datům obrázků, nemusíte, prostě použijte kód založený na první větvi (normálně zakomentované pomocí #if SLOW). Pozn: pomalá verze nemá úmyslně implementovaný paralelní výpočet, nedával žádné urychlení, naopak se to celé kvůli nutnosti zamykání zpomalilo..

Stačí umět odšumovat monochromatické (šedotónové = "gray") obrázky. Já to ani na jiných datech zkoušet nebudu!

Programátorské detaily

Pilotní implementace demonstruje několik technických aspektů:
  1. vytvoření instance výstupního rastrového obrázku s pevným formátem Format8bppIndexed
  2. rychlý přístup k binárním datům pixelů - pomocí metody Bitmap.LockBits() a unsafe bloku s použitím ukazatelů do uzamčeného paměťovém bloku (pomalá alternativa /s jiným formátem obrázku a bez paralelismu/ je také k dispozici)
  3. volitelné použití Parallel.For - při zapnutí paralelismu se jednotlivé výstupní řádky počítají v samostatných vláknech; vše řídí runtime .NET, vy se nemusíte o nic dalšího starat. Pouze je potřeba implementovat tělo cyklu reentrantně.
  4. výpočet jako celek běží v samostatném vlákně - s vhodnou frekvencí je nutné v cyklech kontrolovat hodnotu globální logické proměnné Form1.cont (při hodnotě false by měl algoritmus co nejdříve předčasně skončit)
  5. Drag & Drop vstupního obrázku - vstupní soubor můžete do formuláře přenést myší z jakékoli aplikace Windows podporující D&D.

Náměty

N. Sladoje: Image analysis slides, Uppsala University, spring 2017, on line
Kuwahara/Nagao filtering, Wikipedia, on line
Lin Zhong et al.: Handling Noise in Single Image Deblurring using Directional Filters, Adobe Research, on line
Vinh Hong et al.: Edge Preserving Filters on Color Images, LNCS 3039:39-40, 2004, on line
A. Buades, B. Coll, J.M. Morel: "A review of image denoising methods, with a new one", Multiscale Modeling and Simulation, Vol4 (2), pp: 490-530, 2006, on line
A. Buades, B. Coll, J.M. Morel: "A non local algorithm for image denoising", IEEE Computer Vision and Pattern Recognition 2005, Vol 2, pp: 60-65, 2005, on line

Co odevzdat

Musíte poslat zdrojový soubor Denoise.cs.
V parametru 'name' procedury InitParams() vraťte své jméno.
Do procedury InitParams() můžete napsat sadu vhodných vstupních parametrů včetně stručné obláčkové nápovědy k nim ('tooltip'].
Pokud jste dosáhli nějakého pěkného výsledku s konkrétním vstupním obrázkem, můžete poslat i ten vstup. Ale pozor na velikost přílohy, radši ho někam vystavte (Dropbox, GoogleDrive) a pošlete jen URL.

Do odevzdaného zdrojáku připište podrobnější komentář o původu vašeho algoritmu: zda jste ho sami vymysleli, zda jste se inspirovali literaturou, nějakým filtrem ze známého programu (PhotoShop, GiMP, ..), apod.

Termín

Odevzdat do: 2. 12. 2018

Body

Základ: 8 bodů, bonus až 6 bodů.

Projekt

Visual Studio projekt: 005denoise.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Denoise.cs
Do funkce InitParams() napište své jméno!

Data

Váš algoritmus by měl fungovat na libovolný vstupní obrázek, pro testování můžete použít pár obrázků přímo z repository, z adresáře data, například Nadar-SarahBernhard1.png nebo dále noiseGauss05.pngnoiseGauss20.png.


Copyright (C) 2010-2018 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)