Grafika I.
Kép mátrix Feladat: Egy N*M-es raszterképet nagyítsunk a két-szeresére pontsokszorozással: minden régi pont helyébe 2*2 azonos színű pontot rajzolunk a nagyított képen. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 2/35
Kép mátrix Problémák/válaszok: Hogyan ábrázoljunk egy képet? A kép rendezett pontokból áll, azaz biztosan valamilyen sorozatként adható meg. Nehézkes lenne azonban a pontokra egy sorszámozást adni. Könnyebb azt megmondani, hogy egy kép-pont a kép hányadik sorában, illetve oszlopá-ban található, azaz mátrixban tároljuk! Mi van a mátrixban? Fekete-fehér kép esetén fényerősség, színes képnél RGB kód. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 3/35
Kép mátrix Specifikáció: Bemenet: N,M:Egész A:Tömb[1..N,1..M:Egész] Kimenet: B:Tömb[1..2*N,1..2*M:Egész] Előfeltétel: N,M 0 Utófeltétel: i (1 i N): j (1 j M): B [2*i,2*j]=A[i,j] és B[2*i 1,2*j]=A[i,j] és B[2*i,2*j 1]=A[i,j] és B[2*i 1,2*j 1]=A[i,j] Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 4/35
Kép kétszeresre nagyítása Nagyítás pontsokszorozással: Nagyítás: Ciklus I=1-től N-ig Ciklus J=1-től M-ig B(2*I-1,2*J-1):=A(I,J) B(2*I,2*J-1):=A(I,J) B(2*I-1,2*J):=A(I,J) B(2*I,2*J):=A(I,J) Ciklus vége Ciklus vége Eljárás vége. Raszteres képek transzformálása Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 5
Kép kétszeresre nagyítása Raszteres képek transzformálása Nagyítás pontátlagolással: Nagyítás: Ciklus I=1-től N-1-ig Ciklus J=1-től M-1-ig B(2*I-1,2*J-1):=A(I,J) B(2*I,2*J-1):=(A(I,J)+A(I+1,J))/2 B(2*I-1,2*J):=(A(I,J)+A(I,J+1))/2 B(2*I,2*J):=(A(I,J)+A(I+1,J+1))/2 Ciklus vége Ciklus vége Eljárás vége. Színes pontok átlaga? Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 6
Kép kétszeresre nagyítása: Raszteres képek transzformálása Pontsokszorozással: Pontátlagolással: Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 7
Raszteres képek transzformálása Feladat: Egy N*M-es raszterképet kicsinyítsünk a felére (N/2*M/2 méretűre): a kicsinyített kép minden pontja az eredeti kép 2*2 pontjából számítódjon: pontelhagyással; átlagolással! Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 8
Raszteres képek transzformálása Specifikáció: Bemenet: N,M:Egész A:Tömb[1..N,1..M:Egész] Kimenet: B:Tömb[1..N/2,1..M/2:Egész] Előfeltétel: N,M 0 Utófeltétel: i (1 i N/2): j (1 j M/2): B[i,j]=A[2*i-1,2*j-1] vagy B[i,j]=(A[2*i,2*j]+A[2*i 1,2*j]+ A[2*i,2*j 1]+A[2*i 1,2*j 1])/4 Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 9
Kép felére kicsinyítése Raszteres képek transzformálása Kicsinyítés pontelhagyással: Kicsinyítés: Ciklus I=1-től N/2-ig Ciklus J=1-től M/2-ig B(I,J):=A(2*I-1,2*J-1) Ciklus vége Ciklus vége Eljárás vége. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 10
Raszteres képek transzformálása Kép felére kicsinyítése, pontelhagyással: Eredeti Kicsinyített Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 11
Kép felére kicsinyítése Raszteres képek transzformálása Kicsinyítés pontátlagolással: Kicsinyítés: Ciklus I=1-től N/2-ig Ciklus J=1-től M/2-ig B(I,J):=(A(2*I-1,2*J-1)+ A(2*I-1,2*J)+ A(2*I,2*J-1)+ A(2*I,2*J))/4 Ciklus vége Ciklus vége Eljárás vége. Színes pontok átlaga? Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 12
Kép felére kicsinyítése Raszteres képek transzformálása Pontátlagolással kicsinyített kép újra nagyítva: Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 13
Lineáris szűrés Raszteres képek transzformálása Sok képen véletlen zajok jelennek meg, amelyek a kép minőségét határozottan rontják, azaz minden egyes valódi értéket megváltoztathatott egy véletlen érték. A szűrés feladata ezen véletlen hatások minél jobb hatásfokú megszüntetése. Ennek legegyszerűbb változatában minden egyes képpont értékét helyettesítjük önmaga és közvetlen 8 szomszédja átlagával: B 1 i 1 i, j A k, l 9 k i 1 l j 1 j 1 Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 14
Raszteres képek transzformálása Lineáris szűrés Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 15
Rank szűrés Raszteres képek transzformálása Ennél a módszernél átlagszámítás helyett a szomszédos pontokkal más műveletet végzünk. Első lépésként vegyük a környező pontok fényesség értékét és rendezzük nagyság szerint sorba! Válasszuk ki a nagyság szerint K-adik elemet, s ezzel helyettesítsük az eredeti pontot! Ha K=1, akkor éppen a legsötétebb pontot választjuk, ha K=N, akkor pedig a legfényesebbet. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 16
Rank szűrés Raszteres képek transzformálása Speciális rank szűrő, a medián szűrő, amikor K=N/2, azaz éppen a nagyság szerint középső értéket választjuk. Ez a módszer a kiugró zajcsúcsokat tökéletesen eltünteti. Példa A Rák-köd képére alkalmazzunk Rank-szűrőt! Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 17
Raszteres képek transzformálása Eredeti K=1 szűrő K=5 szűrő K=8 szűrő Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 18
Grafikai alapok A képernyőn a normál koordináta-rendszer: Origó a bal-felső sarokban. A pixel az egység. Csak egész koordinátájú pontokkal jellemzett görbékkel, ívekkel foglalkozunk. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 19
Grafikai alapok PontRajzol(x,y): s:=kerekít(ks-y); o:=kerekít(ko+x) Ha s [0,MaxY] és o [0,MaxX] akkor Pont(o,s) Eljárás vége. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 20
Szakasz rajzolás A feladat: szakaszt rajzolni (x 1,y 1 ) és (x 2,y 2 ) között. A naiv megoldás: A két ponton húzható egyenes egyenlete: y=(y 2 -y 1 )/(x 2 -x 1 )*(x-x 1 )+y 1. Feltehető, hogy x 1 x 2. A megoldás lényege: vegyük sorra x lehetséges (egész) értékeit [x 1,x 2 ] között, és rajzoljuk ki az (x,y(x)) pontot! Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 21
Szakasz rajzolás SzakaszRajzolás(x 1,y 1,x 2,y 2 ): it:=(y 2 -y 1 )/(x 2 -x 1 ) Ciklus x=x 1 -től x 2 -ig y:=(x-x 1 )*it+y 1 ; PontRajz(x,y) Ciklus vége Eljárás vége. Problémák: x 1 =x 2 eset 0-val osztás külön vizsgálandó; x 1 >x 2 eset üres ciklus a ciklus-változónak visszafelé kellene haladni; Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 22
Szakasz rajzolás Problémák: it 1 (legfeljebb 45 lejtésszög) esetén folytonos pixelek sorozata a szakasz, it>1 (több, mint 45 lejtésszög) esetén szakadozott pixelek sorozata. it 1 it>1 Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 23
Szakasz rajzolás A feladat: szakaszt rajzolni (x 1,y 1 ) és (x 2,y 2 ) között. Egy helyes megoldás: Válasszuk meg úgy az x-irányú lépésközt, hogy az megfelelő legyen minden esetben. A megoldás lényege: Az x-irányú eltérés (hx) és az y-irányú eltérés (hy) maximumával normáljuk a lépésközöket! Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 24
Szakasz rajzolás SzakaszRajzolás(x 1,y 1,x 2,y 2 ): hx:=x 2 -x 1 ; hy:=y 2 -y 1 Ha hx > hy akkor h:= hx különben h:= hy Ha h=0 akkor PontRajz(x 1,y 1 ) különben lx:=hx/h; ly:=hy/h x:=x 1 ; y:=y 1 ; PontRajz(x 1,y 1 ) Ciklus k=1-től h-ig x:=x+lx; y:=y+ly; PontRajz(x,y) Ciklus vége Elágazás vége Eljárás vége. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 25
Kör rajzolás A feladat: (x 0,y 0 ) középpontú, r sugarú kör rajzolása. A kör szimmetriája miatt, ha az (x,y) pont rajta van az íven, akkor a (-x,y), (x,-y), (-x,-y) pontok is rajta lesznek. További szimmetria-tengelyei is vannak, amelyek kihasználhatók! Az (x 0,y 0 ) középpontú kör a (0,0) középpontú eltolásával egyszerűen megkapható, amelyet ismét rábízhatunk a PontRajzol eljárásra. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 26
A kör egyenlete: A körív pontjai: Kör rajzolás x 2 y 2 2 ( x, x 2 r ) Mivel a körív pontjai kielégítik az y 2 =r 2 -x 2 egyenletet, kapjuk a kézenfekvő megoldást: KörRajzolás(r): Ciklus x=0-tól r-ig y:=egész(négyzetgyök(r*r-x*x)) PontRajz(x,y); PontRajz(-x,y) PontRajz(x,-y); PontRajz(-x,-y) Ciklus vége Eljárás vége. r 2 Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 27
Kör rajzolás Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 28
Kör rajzolás A körív pontjai: (r*cos( ), r*sin( )) KörRajzolás(r): Ciklus alfa=0-tól 6.28-ig L-esével x:=egész(r*cos(alfa)) y:=egész(r*sin(alfa))) PontRajz(x,y); PontRajz(-x,y) PontRajz(x,-y); PontRajz(-x,-y) Ciklus vége Eljárás vége. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 29
Kör rajzolás A körív pontjai: (r*cos( ), r*sin( )) L=0.3 L=0.2 L=0.01 Kérdés: mekkora legyen az L? Legyen L-nyi fordulat az r-sugarú íven kb. 1 pixelnyi! L / (2* ) = 1 / (2*r* ) L = 1 / r Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 30
Kör rajzolás A körív követése (görbék rajzolására általánosan alkalmazható ötlet): kiindulás a görbe egy alkalmas kezdő-pontjából, válasszunk valamilyen elképzelhető haladási (rajzolási) irányt (balra/jobbra, fel/le), az irányba eső szomszédos pontokat vizsgáljuk meg: melyik tér el legkevésbé a görbétől, majd arra lépjünk tovább! Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 31
Kör rajzolás A körív követése : KörRajzolás(r): x:=0; y:=r Ciklus amíg y 0 PontRajz(x,y); PontRajz(-x,y) PontRajz(-x,y); PontRajz(-x,-y) Következő(x,y) Ciklus vége Eljárás vége. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 32
Kör rajzolás A körív követése (belülről): Következő(x,y): Ha (x+1) 2 +y 2 r 2 akkor x:=x+1 különben ha (x+1) 2 +(y-1) 2 r 2 akkor y:=y-1; x:=x+1 különben y:=y-1 Eljárás vége. A fekete pontból indulva kék-zöld-piros vizsgálati sorrenddel. Választhatnánk közülük a körvonalhoz legközelebbit is. Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 33
Kör rajzolás Ugyanezt az elvet körív helyett tetszőleges görbére is alkalmazhatjuk: Pillangó-görbe: y 6 =x 2 -x 6 Pap Gáborné-Zsakó László: Algoritmizálás, adatmodellezés 34
Vége Zsakó Zsakó László: László: Programozási Szövegfeldolgozás alapismeretek I. M 35