Úloha 068: Speciální půltónování pro laserovou tiskárnu

Úkolem je implementovat speciální algoritmus na půltónování (halftoning), který bude fungovat na laserové tiskárně s rozlišením 1200dpi. Jde o algoritmus popsaný v článku Velho, Gomes: Stochastic Screening Dithering with Adaptive Clustering (pro barvy: Color Halftoning with Stochastic Screening and Adaptive Clustering)

AdaptiveClustering

Princip

Obrázek je procházen po tzv. "Space-Filling-Curve" (fraktální křivka vyplňující celou rovinu). Na křivce jsou určeny úseky dlouhé typicky 6 až 100 pixelů. Každý úsek obsahuje právě jednu souvislou vybarvenou část. Poměr délky vybarvené části a celého úseku udává úroveň jasu, délka úseku má vliv na rozlišovací schopnost rastru. Algoritmus je adaptivní proto, že přizpůsobuje délku úseků lokálním vlastnostem obrázku (přítomnost ostrých hran).

Výsledek budu tisknout na laserové tiskárně s rozlišením 1200dpi (např. HP LaserJet 1320 nebo P2015). Pro představu, jak vypadá kvalita takového tisku, každý ode mne dostane testovací obrázek s tečkami velikosti 1x1 až 10x10 pixelů vytištěnými právě na takové tiskárně..

Základ

Jako základ poslouží projekt 068laser z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel může zadat vstupní obrázek a ihned se automaticky spouští metoda Dither.TransformImage() přepočítávající vstupní obrázek do nové podoby. Výstup je poté zobrazen ve formuláři. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je v souboru Dither.cs označen závorkami:

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

Pilotní implementace

  1. pokud není načten žádný vstup, použije se vestavěný testovací obraz obsahující šedotónové přechody (viněty) apod.
  2. vytvoření instance výstupního rastrového obrázku s pevným formátem Format1bppIndexed (dvouprvková paleta obsahuje pouze černou a bílou barvu)
  3. výstupní obrázek je uložen po jednotlivých bitech, je tedy nutné používat vhodné bitové operace při jeho zapisování
  4. 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
  5. 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)
  6. 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
  7. je implementováno náhodné rozptylování s daným rozsahem náhody (viz druhý číselný parametr předávaný řetězcem param)

Technické detaily

Vstupní obrázek je předán Vaší metodě v parametru Bitmap input, navrhuji ponechat rychlý přístup do vstupních dat. Dva číselné parametry udávají požadované rozlišení výstupu. Uživatelem zadaný textový parametr použijte k příp. modifikaci chování vašeho algoritmu, pilotní implementace čte dvě desetinná čísla, první z nich je škálovacím koeficientem, druhé rozsahem uplatnění náhody (od 0.0 do 1.0). Výstupní obrázek vracíte pomocí výstupního parametru out Bitmap output.

Čtení šedého odstínu ze vstupní bitmapy (včetně bilineární interpolace mezi sousedními pixely) implementuje přiložená metoda Dither.GetGray(), musíte však zachovat rychlý přístup k vstupní bitmapě zafixované v paměti..

Materiály

Přehledné shrnutí zdrojů informací:
Space-Filling-Curve
Context-based Space Filling Curves
Velho, Gomes: Stochastic Screening Dithering with Adaptive Clustering
Velho, Gomes: Color Halftoning with Stochastic Screening and Adaptive Clustering

Odevzdání

Při odevzdání je potřeba dostatečně podrobně popsat parametry - jaký mají význam, jejich přípustné hodnoty, ..
Můžete rovněž přiložit zajímavý vstupní obrázek nebo dva, na kterých jste dosáhli pěkných výsledků.

Termín

Odevzdat do: 7. 12. 2014

Body

Základ: 6 bodů (neadaptivní varianta půltónování)
dalších 5 až 10 bodů navíc za adaptivitu a další vylepšení

Projekt

Visual Studio 2010 projekt: 068laser

Zdrojový soubor

Modifikujte a odevzdejte soubor: Dither.cs
Do komentáře na první řádce napište své jméno!
Nezapomeňte popsat parametry a alespoň stručně upřesnit metodu.

Testovací data

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 frozentree.png, cate1600x1200bw.png nebo egsr1.png.


Copyright (C) 2013-2014 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)