úloha 084: Umělecký filtr - tahy štětcem

Úkolem je navrhnout a implementovat algoritmus, který počítá efekt nad rastrovým obrázkem. Výsledek by se měl podobat některé z impresionistických malířských technik, např. viz Wiki stránka o impresionismu.

Renoir

Základ

Základem poslouží projekt 084filter 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 Filter.Recompute() přepočítávající vstup do nové podoby. Výstup je poté zobrazen ve formuláři. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku Filter.cs označen závorkami:

  // !!!{{
  // !!!}}

Technicky

Funkce Filter.Recompute() má tyto parametry:
  • Bitmap input vstupní obrázek (pokud by náhodou byl null, musí se s tím funkce vypořádat - smí též vrátit null)
  • string param - volitelný parametr ve formě řetězce, pokud ho použijete, budete muset sami zadefinovat co a v jakém formátu má smí obsahovat (pilotní implementace obsahuje zadání velikosti obdélníkové buňky - jedno nebo dvě celá čísla oddělená čárkou)
Návratovou hodnotou funkce je přepočítaný obrázek ve formátu Bitmap, smí být null.

Pokud nechcete používat rychlou (ale nebezpečnější a méně přehlednou) variantu přístupu k datům obrázků, nemusíte, prostě použijte kód založený na druhé větvi #if.

Programátorské detaily

Pilotní implementace demonstruje několik technických aspektů:
  1. vytvoření instance výstupního rastrového obrázku s pevným formátem Format24bppRgb
  2. 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 (pomalá alternativa /s jiným algoritmem/ je také k dispozici)
  3. 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)
  4. Drag & Drop vstupního obrázku - vstupní soubor můžete do formuláře přenést myší z jakékoli aplikace Windows podporující D&D.

Náměty

Při návrhu Vašeho algoritmu můžete uvažovat myšlenky:
  • rozmazání na neobvyklém tvaru okénka
  • nějaký rank filtr (medián) na neobvyklém tvaru okénka
  • tvar okénka závislý na průběhu obrazu (např. úsečka kolmá na gradient)
  • použití vhodné redukce množiny barev (viz volitelná prezentace Zobrazování barev)
  • nějaká technika podobná (nebo založená na) mozaice ("tiling")

Originální nebo nekonvenční přístupy oceníme při bodování. Důležitý je zde vzhled výsledku a snadnost zadávání parametrů algoritmu (flexibilita je téměř vždy vítána), ne nutně rychlost práce algoritmu nebo obtížnost implementace.

Podpora

Pokud byste potřebovali, funkce pro převody mezi RGB a HSV najdete v souboru common/MathSupport.cs. Funkci na převod do odstínů šedé najdete v common/RasterDrawing.cs

Co odevzdat

Musíte poslat zdrojový soubor Filter.cs.
Do procedury InitParams() napište sadu vhodných vstupních parametrů. V parametru 'name' vraťte své jméno.
Pokud použijete stringový parametr param, nezapomeňte popsat jeho formát a sémantiku.
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 pozor na velikost přílohy, radši ho někam vystavte (Dropbox, GoogleDrive, uloz.to) a pošlete jen URL.

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, nějakým efektem (PhotoShop, GiMP...), apod. Na jaká data se má filtr aplikovat, jaký má být výsledek výpočtu..

Termín

Odevzdat do: 4. 12. 2022

Body

Základ: 7 bodů za funkční filtr modifikující smysluplně vstupní obrázek,
bonus až 7 bodů za zajímavost výsledku, rychlost, pracnost, estetiku (subjektivně).

Projekt

Visual Studio projekt: 084filter.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Filter.cs
Do funkce InitParams() napište své jméno!

Data

Váš algoritmus by měl fungovat na libovolný vstupní obrázek, pro testování můžete použít pár obrázků přímo z repository, z adresáře data, dále můžete použít třeba obrázky sail.png, silverstone-17671.png, maran-18587.png, monarch.png, skyline129-178-246.png.


Copyright (C) 2013-2022 J.Pelikán, last change: 2022-11-03 00:29:02 +0100 (Thu, 03 Nov 2022)