Úkolem je navrhnout algoritmus vybírající typickou paletu barev ze vstupního rastrového obrázku. Inspirací je projekt "Ciname Palettes" My Modern Met. Vstupem je libovolný rastrový obrázek, např. políčko z Vašeho oblíbeného filmu. Váš algoritmus obrázek barevně analyzuje a navrhne pro něj 3 až 10 charakteristických barev. Pokud bude mít obrázek málo významně odlišných barevných odstínů, smíte paletu doplnit dalšími barvami, např. podle některého schematu z Adobe Color CC.
Jako základ poslouží projekt 051colormap z repository grcis (GIT). Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a ihned se automaticky spouští metoda Colormap.Generate() přepočítávající barevnou paletu. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku Colormap.cs označen závorkami:
// !!!{{ // !!!}}
Svoje úpravy kódu nemusíte omezovat na oblast vyznačenou těmito závorkami. Můžete samozřejmě přidat nějakou pomocnou třídu, datovou strukturu, apod. Všechny modifikace však musíte soustředit do tohoto jednoho odevzdávaného souboru.
Vstupní obrázek je předán Vaší metodě v parametru
Bitmap input, můžete z něj číst metodou BitMap.GetPixel(x,y)
(detaily viz referenci Bitmap).
Pilotní řešení tento přístup ukazuje, tak se inspirujte. Počet barev zadávaný
uživatelem najdete v parametru numCol (pokud budete mít vážný
důvod, nemusíte respektovat požadovanou délku palety, byli bychom však rádi, abyste to
nějak při odevzdávání řešení okomentovali).
Výstupní barevná paleta se píše do pole colors,
pole byste si měli alokovat ve správné velikosti, např.
colors = new Color[ 4 ]; pro čtyři barvy..
Jako řešení úlohy posílejte mailem pouze modifikovaný zdrojový soubor Colormap.cs! (nezapomeňte ve funkci InitForm() vracet svoje jméno). Nepřijímáme celé VS projekty. V případě použití nějakého zajímavého obrázku (se kterým dává Váš program pěkné výsledky), přiložte i ten obrázek. Ale prosíme v rozumně malém rozlišení!
Jako vstupní obrázek zadávejte jenom malé soubory, pro analýzu barev stačí cca 600x400px. Urychlíte si tak výpočet v případě, že budete vymýšlet nějaké složitější algoritmy...
Pokud byste si chtěli zmenšit prostor barev, můžete odříznout jeden nebo dva nejméně významné bity barevných kanálů...
Mohli byste potřebovat funkce pro převody mezi barevnými prostory apod., ty najdete v common/MathSupport.cs. Převody RGB<->HSV jsou dokonce přímo demonstrovány v pilotním řešení.
Výsledky na stránce My Modern Met, materiály o shlukové analýze (např. Cluster analysis), speciálně k-means clustering, na zajímavé nápady můžete přijít i studiem algoritmů na redukci barev (Color quantization). Generování vizuálně hezké palety – Adobe Color CC (viz ukázka na cvičení).
Odevzdat do: 30. 10. 2022
Základ: 8 bodů (nesmí havarovat, musí dávat aspoň trochu rozumné výsledky)
Bonusových 1 až 6 bodů:
za respektování délky palety,
za kvalitu reprezentace vstupu,
za dobrou práci i s obtížnými obrázky (málo nebo moc barev v obrázku,
výrazná ale málo četná barva...),
za rychlost běhu Vašeho algoritmu...
Visual Studio projekt: 051colormap
Modifikujte a odevzdejte pouze soubor: Colormap.cs
Ve funkci Colormap.InitForm() vracejte své jméno!
Pro testování můžete použít pár obrázků přímo z repository, z adresáře data. Vyzkoušejte i několik dalších obrázků, třeba málo barevných - Váš algoritmus by měl pokaždé navrhnout pěknou paletu.
Copyright (C) 2010-2022 J.Pelikán, last change: 2023-10-16 02:32:07 +0200 (Mon, 16 Oct 2023)