úloha 085: Segmentace profilových obrázků

Ú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.

Segmentation

Základ

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.

Ovládání

  • Load image - načítá nový vstupní obrázek. Dosud nakreslená maska se smaže
  • Reset - reinicializuje (smaže) dosud nakreslenou masku. Stejný účinek má stisk klávesy Backspace
  • Load mask - načítá dříve uloženou poloprůhlednou masku (okolí/objekt)
  • Save mask - ukládá aktuální poloprůhlednou masku (okolí/objekt) do souboru PNG
  • Pen - tloušťka pera pro kreslení masky (od 1.0 do 5.0 pixelů)
  • White - volba barvy okolí pro výstupní segmentaci. Implicitní nastavení: okolí je bílé
  • Recompute - spuštění vlastní segmentace. Výsledek je po dokončení nakreslen v pravé části okna
  • Save result - uložení výsleku do souboru PNG

Technicky

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.

Klíčová funkce provádějící vlastní segmentaci Segmentation.DoSegmentation() má parametry:
  • Bitmap sourceImage - vstupní obrázek
  • bool whiteExterior - kladná hodnota signalizuje, že chceme na výstupu nakreslit okolí bílou barvou (interně můžete mít stále stejnou logiku /0 .. okolí, 1 .. objekt/ a barvy přepínat pouze v paletě - viz pilotní řešení)
Funkce dále používá interně uloženou masku mask, ze které lze číst pomocí GetPixel() (červená barva označuje objekt, modrá okolí).

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ů!

Náměty

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.

Literatura ke studiu:

Co odevzdat

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.

Termín

Odevzdat do: 13. 12. 2015

Body

Základ: 8 bodů, bonus až 8 bodů. Kdo implementuje nějakou variantu graph-cut algoritmu, dostaně minimálně 10 bodů.

Projekt

Visual Studio projekt: 085segmentation.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Segmentation.cs
Do komentáře na první řádce napište své jméno!

Data

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)