15.10  KRESLICÍ ALGORITMY

Součástí programů pro úpravy kvality obrazů bývají také různé kreslicí algoritmy. Jsou určeny především pro úpravy obrazů k prezentaci, pro zviditelnění dočasných oblastí v obraze, ale mohou přispět také ke zlepšení kvality obrazů retušováním defektů. Některé z těchto rutin však mohou také výrazně přispět k vlastnímu vyhodnocovacímu procesu, kdy speciálně zabarvené části obrazů nemusí podléhat úpravám kvality obrazu a algoritmům pro vyhledávání objektů. Někdy lze speciální zabarvení různých objektů využít i pro jejich identifikaci.

V oblasti zpracování vizualizačních experimentů se často používají kreslicí algoritmy pro kreslení bodů, úseček, obdélníků, polygonů, hvězdic, kružnic a elips, algoritmy pro vyplňování oblastí po hranici s definovanou barvou, algoritmy pro vyplňování oblastí stejné barvy jinou barvou, algoritmy pro záměnu barev v celém obraze a algoritmy pro psaní textů. V následujícím textu budou stručně popsány některé z těchto algoritmů, i když současné programovací jazyky jsou již dostatečně vybaveny různými grafickými podprogramy či příkazy, které uvedené kreslicí algoritmy obsahují.

Kreslení úseček

Pro kreslení úseček je třeba znát souřadnice počátečního bodu (x1, y1) a konečného bodu (x2, y2). Rovnici přímky, jejíž částí je daná úsečka, lze pak vyjádřit vztahem

.

(15-16)

Při kreslení úseček vycházíme ze skutečnosti, že máme k dispozici instrukci, či podprogram pro kreslení bodu. Pro x měnící se po jedné od x1 do x2 (po jednom obrazovém bodu) lze pak počítat hodnoty y a vykreslovat postupně jednotlivé body úsečky. Tento postup je vhodný pouze pro úsečky, jejichž strmost je menší než 45°, jelikož při větší strmosti by byla úsečka nespojitá. Pro větší strmosti je vhodné měnit naopak souřadnici y po jedné od y1 do y2 a z ní počítat hodnoty x.

Kreslení úseček se provádí dle celé řady osvědčených algoritmů. Tyto algoritmy jsou modifikovány tak, aby byly rychlé, jednoduché a spolehlivé. Příklady algoritmů pro kreslení úseček, a to přírůstkového algoritmu DDA (digital differential analyzer) a Bresenhamova algoritmu, lze nalézt např. v lit. [4-19], [4-21] a další.

Na základě znalosti kreslení úseček můžeme kreslit také obdélníky, polygony či hvězdice (úsečky vycházející z jednoho bodu).

Kreslení kružnic

Pro kreslení kružnic (také kruhových oblouků) je třeba znát souřadnice středu kružnice (m, n) a poloměr kružnice r. Kružnici v polárních souřadnicích lze pak popsat dvojicí rovnic

(15-17)

Proměnná úhlu a zde nabývá hodnot od 0 do 2p. Při změně a o konstantní velikost budou body na kružnici kresleny v pravidelných vzdálenostech. Pro rastrová zařízení lze zvolit přírůstek úhlu a velikosti 1/r, při kterém jsou generovány body o souřadnicích lišících se přibližně o jeden obrazový bod. Využijeme-li symetrie kružnice, lze uvedený postup výpočtu bodů na kružnici značně urychlit. Dle rovnic kružnice postačí totiž počítat pouze souřadnice na oblouku o velikosti 1/8 kružnice, a to pro úhly a = 0 až a = p/4, nebo také pro x = 0x = y. Ostatní body kružnice (na zbývajících sedmi obloucích) lze získat záměnou souřadnic a záměnou znaménka souřadnic.

Uvedený postup kreslení kružnice je však náročný, jelikož používá trigonometrické funkce. Zvýšení rychlosti generování kružnic dosáhneme pouze pomocí metod, které provádějí výpočty pokud možno v celočíselné aritmetice. Takový algoritmus pro kreslení kružnic a kruhových oblouků najdeme např. v lit. [4-21].

Vyplňování oblasti barvou

Vyplnění části obrazu jednou barvou patří ke standardním rutinám pro práci s obrazem. Rozlišujeme vyplňování oblastí stejné barvy jinou barvou a vyplňování oblastí po hranici s definovanou barvou.

Poměrně jednoduchým algoritmem pro vyplňování oblastí po hranici s definovanou barvou je tzv. semínkové vyplňování. Algoritmus v jazyce Pascal je obsažen v následujícím podprogramu:

 

 procedure Seed_Fill (x, y, vyplnovaci_barva, hranicni_barva:  integer);
 
 var skutecna_barva: integer;
 
 begin
   skutecna_barva := Get_pixel (x, y);
   if (skutecna_barva <> hranicni_barva) and (skutecna_barva <> vyplnovaci_barva) then
     begin
       Put_color_pixel (x, y, vyplnovaci_barva);
       Seed_Fill (x + 1, y, vyplnovaci_barva, hranicni_barva);
       Seed_Fill (x - 1, y, vyplnovaci_barva, hranicni_barva);
       Seed_Fill (x, y + 1, vyplnovaci_barva, hranicni_barva);
       Seed_Fill (x, y - 1, vyplnovaci_barva, hranicni_barva);
     end
 end; {Seed_Fill}

 

Je zřejmé, že se jedná o elegantní rekurzívní řešení, které však může u složitějších vyplňovaných oblastí vyčerpat zásobník návratových adres podprogramu Seed_Fill. Jiné algoritmy pro vyplňování oblastí barvou najdeme např. v lit. [4-19], [4-21].

Výše uvedený algoritmus lze snadno modifikovat na vyplňování oblastí stejné barvy jinou barvou. V tom případě je hraniční barvou jakákoliv jiná barva, než počáteční barva zjištěná poprvé procedurou Get_pixel (x, y). Při vyplňování oblastí stejné barvy jinou barvou se někdy může stát, že není vyplněna celá oblast, kterou jsme chtěli vyplnit. To se stává především v obrazech s velkým množstvím barevných úrovní, kdy v některých částech zamýšlené oblasti, a to především na okrajích, je již jiný atribut barvy, i když to není na obrazovce zcela zřejmé. Pak je vhodné redukovat počet barev či odstínů šedí v obraze (viz kap. 15-4) a znovu aplikovat vyplnění oblasti.

Pozn.:  Do problematiky vyplňování oblastí barvou lze zařadit i algoritmus záměny barev v obraze. Při tomto postupu procházíme všechny obrazové body a pokud se tam nachází předem vybraná barva, nahradíme ji jinou předem vybranou barvu. Tato funkce je užitečná např. tehdy, chceme-li uměle zvýraznit jisté detaily, případně je uchránit před další úpravou kvality obrazu.