Úkolem je navrhnout a implementovat algoritmus, který umí segmentovat vstupní rastrový obrázek do dvou množin pixelů: okolí a objekt. Uživatel interaktivně zadá, které oblasti považuje za okolí a které za segmentovaný objekt a algoritmus se potom snaží co nejlépe tyto složky oddělit.
Základem poslouží projekt 085segmentation z repository grcis. Je připravena aplikace, ve které uživatel zadává vstupní obrázek a poté má možnost do něj interaktivně kreslit dvěma barvami, objekt označuje levým tlačítkem myši (červená barva), okolí pravým tlačítkem (modrá barva). Po stisku tlačítka Recompute se spouští metoda Segmentation.DoSegmentation(), která má přístup ke zdrojovému obrázku i k zadané masce. Úkolem této metody je rozděli pixely obrázku do dvou skupin, okolí a objekt, výsledek se ukládá ve formě 1-bitového (Č/B) obrázku.
Vaše implementace se bude nacházet uvnitř třídy Segmentation. Tato třída slouží mj. jako datový kontejner uchovávající interaktivně nakreslenou masku mask ve formátu 8-bitového rastrového obrázku s paletou. Jednotlivé indexy 0 až 2 mají specifický význam: COL_BACKGROUND .. průhledné pozadí, COL_EXTERIOR .. barva označující okolí, COL_INTERIOR .. barva označující vnitřek objektu.
Interaktivní kreslení masky máte též pod kontrolou, i když jej pravděpodobně nebudete chtít měnit.
Funkčnost zde zajišťují obslužné funkce volané z nadřazeného GUI prvku: MouseDown(),
MouseUp(), MouseMove() a KeyPressed(). Pokud byste do nich zasahovali,
pamatujte, že musíte vrátit true v případě, že se má GUI prvek překreslit (invalidace).
Kreslicí funkce DrawTrace() ukazuje efektivní nakreslení jedné "tečky"
do vstupní masky. Funkce akceptuje desetinné tloušťky čáry od 1.0 do 5.0 pixelu.
Návratovou hodnotou funkce je segmentovaný obrázek ve formátu Bitmap, měl by mít 1-bitovou hloubku (pixelový formát Format1bppIndexed).
Pilotní implementace používá na několika místech rychlý přístup do paměti Bitmap.LockBits. To je nutné vzhledem k pixelovým formátům Format8bppIndexed a Format1bppIndexed. V projektu je tím demonstrována práce s indexovanými barevnými formáty. Zejména si všimněte (a respektujte) nutnost zapisovat výsledná 1-bitový obrázek pomocí bitového bufferu (int buffer) a povinně zarovnávat každou vodorovnou řádku na celistvý počet bajtů!
Zejména bych chtěl upozornit na efektivní a elegantní metody segmentace založené na hledání minimálního řezu v grafu. Rovinný graf tvoří pixely obrázku (propojení přes 4 sousedy), zdroj a výlevka jsou množiny pixelů označené interaktivně uživatelem. Ohodnocení hran záleží na rozdílech barev sousedních pixelů - čím menší rozdíl, tím větší hodnota hrany.
Musíte poslat zdrojový soubor Segmentation.cs.
Na první řádce v komentáři napište své jméno.
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 neposílejte mailem veliké přílohy.
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, apod.
Odevzdat do: 13. 12. 2015
Základ: 8 bodů, bonus až 8 bodů. Kdo implementuje nějakou variantu graph-cut algoritmu, dostaně minimálně 10 bodů.
Visual Studio projekt: 085segmentation.
Modifikujte a odevzdejte soubor: Segmentation.cs
Do komentáře na první řádce napište své jméno!
Váš algoritmus by měl fungovat na libovolný vhodný vstupní obrázek, pro testování můžete použít pár obrázků přímo z repository, z adresáře data (profileXX.jpg), dále můžete použít obrázky profile00.jpg, profile01.jpg, profile02.jpg, profile03.jpg, profile04.jpg. Možná by bylo vhodné zmenšit jejich rozlišení, to už necháme na vás.
Copyright (C) 2015 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)