Ú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.
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í.
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:
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.
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é...
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").
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).
Odevzdat do: 14. 11. 2021
Základ: 8 bodů,
bonus až 4 body za zajímavost řešení.
Visual Studio projekt: 117raster
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)