Úloha 120: Omezené přebarvení obrázku

Úkolem je implementovat přebarvení obrázku (změnu veličiny Hue) při zachování pleťových odstínů – aby se algoritmus dal použít na portréty.

Example

Základ

Budete pracovat v prostředí projektu 117raster z repository grcis (GIT). Je připravena aplikace, jejíž popis je na této stránce

Svoje nové třídy (formuláře) umístíte do zvláštního adresáře a řešení na konci odevzdáte tak, že zazipujete tento adresář a pošlete mailem jako přílohu. Můžete přidat/vylepšit i formulář[e]... Jen nezasahujte do zdrojových souborů projektu 117raster.

Pro všechny Vaše nové třídy použijte prosím "namespace" obsahující Vaše jméno, např. namespace JanVoprsalek;

Pokud byste narazili na nějakou překážku (a měli nutkání základ projektu upravovat), radši mne okamžitě kontaktujte a opravíme to společně, aby z toho měli užitek i ostatní.

Pilotní verze

Jednodušší modul pro globání přebarvování obrázku pomocí barevného systému HSV je implementován jako modul (viz interface IRasterModule) a umístěn v adresáři modules/HSV. Tam najdete několik souborů:

ModuleHSV.cs – obsahuje třídu ModuleHSV, která implementuje požadovaný interface IRasterModule. Modul umí pracovat s jedním vstupním a jedním výstupním obrázkem, parametrů ovlivňujících výpočet je několik:

  • dH – změna Hue ve stupních (přičte se k Hue vstupního pixelu)
  • mulS – multiplikativní konstanta pro sytost (Saturation)
  • mulV – multiplikativní konstanta pro jas (Value)
  • gamma – exponent případné gamma-korekce (vstupní hodnota se převede do rozsahu [0.0, 1.0] a pak se na ni aplikuje mocnina s exponentem 1 / gamma – tedy hodnoty exponentu větší než 1 zesvětlují obrázek a hodnoty menší než 1 obrázek ztmavují)
  • par – má se používat paralelní počítání (vícejádrové CPU)?
  • slow – má se používat pomalý systém přístupu k pixelům (GetPixel/SetPixel)

Dva poslední parametry určují pouze implementaci algoritmu: lze přepínat mezi velmi pomalým výpočtem, používajícím GetPixel / SetPixel funkce a výpočtem s přímýmn přístupem do binární reprezentace obrázku v paměti (pointery, "unsafe" řešení). Druhou variantu lze ještě urychlit na vícejádrových CPU zapnutím paralelizace (Parallel.For).

Algoritmus přebarvení je jednoduchý: bez výjimky se prochází všechny pixely vstupního obrázku a podle daného předpisu se přebarví a zapíší do obrázku výstupního. Vaším úkolem bude implementovat nějakou myšlenkově složitější metodu, kde se některé pixely budou muset zachovat...

FormHSV*.cs – formulář pro zadávání parametrů přepočtu barev. Všechny výše uvedené parametry lze zadávat interaktivně, z formuláře lze navíc přímo spustit výpočet – bez nutnosti vracet se do hlavního formuláře aplikace.

Náměty

Barevná transformace bude v našem případě používat jako mezistupeň barevnou reprezentaci HSV. Každý pixel se musí přečíst ze vstupní bitmapy (RGB), pak převést do HSV, modifikovat úhel H (Hue – to je přebarvení, o které nám jde) a nakonec trojici H'SV transformovat zpět do RGB. Ponechání S (Saturation) a V (Value) na původních hodnotách znamená, že budou zachovány stíny, odlesky, ... Základní světelné podmínky se tedy měnit nebudou, jen barevné odstíny (Hue).

Barevné převody si nemusíte sami implementovat, v knihovně najdete různé varianty převodu mezi RGB a HSV: ColorToHSV(), HSVToColor(), RGBtoHSV(), HSVtoRGB() ... Věnujte pozornost komentářům, rozsahy vstupních a výstupních veličin se mohou funkce od funkce lišit.

Omezené přebarvení obrázku znamená, že budete muset definovat nějaký rozsah vstupních barev, které nebudou transformací ovlivněny. Doporučujeme prozkoumat (třeba Vaším lokálním HSV histogramem), které rozsahy barev tvoří pleťové odstíny a pak do přebarvovacího algoritmu přidat vhodnou podmínku.

Ideální by bylo, kdyby se podmínka přebarvení dala konfigurovat pomocí parametrů (z textového pole "Param" a/nebo ve Vašem formuláři).

Pokud vymyslíte a implementujete nějakou "fuzzy" podmínku, můžete dosáhnout velmi pěkných výsledků i bonusových bodů navíc. Zkuste si se selektivním přebarvováním trochu ve svém algoritmu pohrát.
"Fuzzy" podmínka – pixely se rozdělí do tří skupin: A. úplně přebarvené, C. úplně nepřebarvené (ponechané) a B. částečně přebarvené (dáno například konstantou P mezi 0.0 a 1.0). Jestliže navrhnete vhodný přechod mezi oblastmi A.-B.-C. (spojitou změnu konstanty P), měly by být výsledky nejlepší a hranice mezi oblastmi nezřetelné...

Parametry modulu

Analýza parametrů z textového pole "Param" – s výhodou můžete použít funkce z pomocné knihovny Util: funkce Util.ParseKeyValueList(param); nejprve rozdělí text na úseky oddělené čárkami a v nich se poté mohou hledat definice ve tvaru <key>=<value>. Funkce bool Util.TryParse(p, "name", ref val) vrací true pokud byl daný klíč nalezen a současně je přepsána hodnota parametru val.

Příklad použití parametru "Param" najdete ve vzorovém modulu ModuleHSV. Tam se všechny parametry ukládají do instance class ModuleHSV a modifikují se jak z hlavního formuláře (analýza textového řetězce Param), tak pomocí speciálního formuláře FormHSV.

Pro pohodlnou práci s Vaším modulem doporučuji navrhnout si též podobný speciální formulář, který se na obrazovce objeví vždy při aktivaci Vašeho modulu a uživatelé budou moci nejenom měnit parametry, ale třeba i spouštět opakovaný výpočet ("Recompute").

Co odevzdat

Svoji novou třídu – modul (potomka DefaultRasterModule) a příp. další třídy (formulář), které jste implementovali, umisťujte do zvláštního adresáře a řešení na konci odevzdejte tak, že zazipujete celý tento adresář a archiv pošlete svému cvičícímu mailem jako přílohu. Nezasahujte prosím do zdrojových souborů projektu 117raster (my bychom takové změny stejně ignorovali).

Pro všechny Vaše nové třídy použijte prosím "namespace" obsahující Vaše jméno, např. namespace JanVoprsalek;

Ještě jinak řečeno: Vámi odevzdané řešení musí být kompatibilní s projektem 117raster tak, že až se do 117raster.csproj přidají Vaše soubory (váš adresář), bude v systému viditelný a použitelný Váš nový modul (Vaše nové moduly).

Termín

Odevzdat do: 14. 11. 2021

Body

Základ: 8 bodů,
bonus až 4 body za zajímavost řešení.

Projekt

Visual Studio projekt: 117raster

Zdrojový soubor

Zazipovaný podadresář, který lze zapojit do projektu 117raster.


Copyright (C) 2010-2021 J.Pelikán, last change: 2021-10-19 23:16:35 +0200 (Tue, 19 Oct 2021)