úloha 054: Redukce barev obrázku

Úkolem je implementovat výpočet co nejlepší barevné palety přizpůsobené vstupnímu rastrovému obrázku a přemapování obrázku na tuto paletu. Vstupem je "true-color" obrázek uložený v paměti s velkým počtem barev (24bpp), výstupem musí být obrázek s barevnou paletou co nejlépe aproximující vstup. Vstup i výstup musí mít stejné rozměry v pixelech.

Základem poslouží projekt 054colorreduction z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a po stisku tlačítka "Recompute" se spouští metoda ColorReduction.Reduce() přepočítávající vstupní obrázek do výstupu. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku ColorReduction.cs označen závorkami:

  // !!!{{
  // !!!}}
Pilotní implementace: používá 3-3-2 paletu z knihovny RasterDrawing.cs a demonstruje několik důležitých technických detailů:
  1. vytvoření instance rastrového obrázku s paletou - instance třídy Bitmap s těmito vlastnostmi zatím nebyla na cvičeních použita
  2. modifikace barevné palety - vy budete muset nějakým algoritmem nejprve paletu spočítat ze vstupního obrázku
  3. 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
  4. výpočet 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)

Náměty: doporučuji implementovat Heckbertův algoritmus středního řezu nebo můžete zkusit i výpočetně náročnější shlukovou analýzu. V obou případech experimentujte s metrikami či různými přístupy při rozdělování/spojování skupin barev (pro snadnou změnu těchto parametrů použijte textový argument předávaný vaší funkci). Nezapomeňte reagovat na uživatelské předčasné ukončení výpočtu, viz níže. Nepoužívejte přístup "Octree"!
Můžete (ale nemusíte) používat nějakou formu rozptylování barev, např. některou variantu distribuvce chyby.

Technicky: vstupní i výstupní obrázky jsou předávány jako parametry (typ Bitmap) spolu s parametrem string param pro další řízení vašeho algoritmu (parsování číselné hodnoty je v pilotním řešení naznačeno). Výsledný obrázek musíte v metodě ColorReduction.Reduce() sami vytvořit - viz vzorový kód. Rozměry okopírujte ze vstupního obrázku, pixelový formát nastavte na Format8bppIndexed. Paletu přiřaďte podle vzoru Draw.Palette332() (jednotlivé barvy musíte zapisovat do již existujícího objektu ColorPalette).

TERMÍN: do 25. 11. 2012

BODY: až 15 bodů

PROJEKT: 054colorreduction

ZDROJOVÝ SOUBOR: ColorReduction.cs

TESTOVACÍ DATA: anime.png (3461 různých barev), sail.png (102077 různých barev), silverstone-17671.png (120856 různých barev).

OSTRÁ DATA: maran-18587.png (400x300, 45022 různých barev), monarch.png (576x384, 116907 různých barev), skyline129-178-246.png (400x300, 64293 různých barev).

Výsledky soutěže


[Cvičení NPGR003]  [Návody k zápočtům v C#]  [Přednášky a semináře]  [Odkazy na demonstrace]

Valid XHTML 1.1 Copyright (C) 2012-2013 J.Pelikán, last change: $Date: 2014-10-03 15:44:39 +0200 (Fri, 03 Oct 2014) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz