Memoria PFC - Marina Artigas Pérez - 33455
Memoria PFC - Marina Artigas Pérez - 33455
Memoria PFC - Marina Artigas Pérez - 33455
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Morphological antialiasing: implementació i<br />
anàlisi<br />
<strong>Marina</strong> <strong>Artigas</strong> <strong>Pérez</strong><br />
Projecte Final de Carrera<br />
Director: Joan Abadia<br />
Juny de 2011<br />
Enginyeria en Informàtica<br />
Universitat Pompeu Fabra
“Empleado según las instrucciones, resulta totalmente inofensivo”<br />
Philip K. Dick, Ubik<br />
Agraïments especials a Hernan, Kitus, la meva família i amics
Resum<br />
En aquest Projecte de Final de Carrera analitzarem la tècnica Morphological Antialiasing.<br />
Aquesta anàlisi es durà a terme a partir de l’estudi i la implementació de l’algorisme proposat a<br />
l’article oficial [1].<br />
El Morphological Antialiasing és un algorisme que detecta les discontinuïtats que es<br />
produeixen a les vores dels objectes d’una imatge. Mitjançant la cerca d’uns patrons<br />
característics, l’algorisme suavitzarà aquestes discontinuïtats per tal d’intentar recuperar el<br />
contorn original dels objectes de la imatge.<br />
Aquest algorisme presenta alguns avantatges respecte a les tècniques d’antialiasing<br />
utilitzades fins el moment. El més significatiu de tots és el fet de treballar sobre imatges ja<br />
processades. Donat que l’algorisme treballa en l’espai de pantalla enlloc de l’espai 3D, la<br />
correcció de la imatge serà totalment independent de la complexitat de l’escena. Per tant, el fet<br />
de no haver de realitzar càlculs amb la geometria de l’escena, permetrà tenir un cost<br />
computacional més baix respecte a d’altres algorismes, proporcionant alhora imatges d’alta<br />
qualitat.<br />
L’objectiu principal d’aquest projecte serà obtenir una valoració del Morphological<br />
Antialiasing respecte a aquestes altres tècniques.<br />
En la documentació de l’algorisme, l’autor fa una descripció poc detallada del seu mètode,<br />
de manera que hem fet un estudi complet de la tècnica proposada per tal de prendre les<br />
decisions més adients a l’hora d’encarar la seva implementació.<br />
La implementació s’ha composat de dues fases: una primera fase on només hem tractat<br />
imatges en blanc i negre; i una segona, ampliació de la primera, on hem incorporat el<br />
processament d’imatges en color.<br />
Finalment, per tal de presentar una anàlisi de resultats exhaustiu, hem preparat un conjunt<br />
d’imatges de prova a les que posteriorment hem aplicat les tècniques d’antialiasing més<br />
conegudes. La comparativa amb els resultats obtinguts de la nostra implementació, ens ha<br />
permès identificar els beneficis i inconvenients del Morphological Antialiasing envers la resta<br />
d’algorismes.
Índex<br />
1. Introducció ............................................................................................................................................. 9<br />
1.1 Motivació ......................................................................................................................................... 10<br />
2. Conceptes generals i estat de l’art ...................................................................................................... 11<br />
2.1 Aliasing ............................................................................................................................................ 11<br />
2.2 Antialiasing ...................................................................................................................................... 12<br />
2.2.1 Supersampling Anti-aliasing (SSAA) ....................................................................................... 13<br />
2.2.2 Multisampling Anti-aliasing (MSAA) ...................................................................................... 15<br />
2.2.3 Alpha-to-Coverage .................................................................................................................... 17<br />
2.2.4 High-Resolution Anti-aliasing (HRAA) ................................................................................... 17<br />
3. Descripció general del Morphological Antialiasing .......................................................................... 19<br />
4. Eines utilitzades.................................................................................................................................... 21<br />
5. Estat actual de l’MLAA....................................................................................................................... 23<br />
6. Cronologia del desenvolupament del projecte ................................................................................... 25<br />
7. Aplicació de l’MLAA ........................................................................................................................... 27<br />
7.1 Descripció detallada de l’MLAA ..................................................................................................... 27<br />
7.1.1 Cerca de discontinuïtats ............................................................................................................ 27<br />
7.1.2 Identificació de patrons ............................................................................................................. 28<br />
7.1.3 Assignació de colors ................................................................................................................. 30<br />
7.2 Blanc i negre vs. Color..................................................................................................................... 34<br />
7.2.1 Cerca de discontinuïtats ............................................................................................................ 34<br />
7.2.2 Identificació de patrons i assignació de color ........................................................................... 34<br />
7.3 Limitacions ...................................................................................................................................... 37<br />
8. Implementació en C++ ........................................................................................................................ 39<br />
8.1 B&W ................................................................................................................................................ 39<br />
8.1.1 Estructures de dades .................................................................................................................. 39<br />
8.1.2 Explicació detallada de la implementació de l’algorisme en blanc i negre ............................... 40<br />
8.1.3 Decisions ................................................................................................................................... 45<br />
8.2 Color ................................................................................................................................................ 47<br />
8.2.1 Estructures de dades .................................................................................................................. 47<br />
8.2.2 Explicació detallada de la implementació de l’algorisme en color ........................................... 48<br />
8.3 Codi per comparar ........................................................................................................................... 53<br />
9. Comparativa de resultats .................................................................................................................... 55<br />
9.1 Siluetes en blanc i negre: flors ......................................................................................................... 56<br />
9.1.1 NAA i MLAA .......................................................................................................................... 57<br />
9.1.2 4xMSAA ................................................................................................................................... 58<br />
9.1.3 16xSSAA .................................................................................................................................. 59<br />
9.1.4 Zoom ......................................................................................................................................... 60<br />
9.2 Siluetes en blanc i negre: nena ......................................................................................................... 61<br />
9.2.1 Zoom ......................................................................................................................................... 68<br />
9.3 Patrons de freqüència variable ......................................................................................................... 69<br />
9.3.1 Cercles ...................................................................................................................................... 70<br />
9.4 Checker 1 ......................................................................................................................................... 75<br />
9.5 Checker 2 ......................................................................................................................................... 79<br />
9.6 Potrace ............................................................................................................................................. 83<br />
9.7 Escàner ............................................................................................................................................. 85<br />
9.8 DirectX ............................................................................................................................................ 87<br />
9.8.1 NAA i MLAA ........................................................................................................................... 88<br />
9.8.2 2xMSAA ................................................................................................................................... 90<br />
9.8.3 4xMSAA ................................................................................................................................... 92<br />
9.8.4 8xMSAA ................................................................................................................................... 94<br />
9.9 Maya ................................................................................................................................................ 96<br />
9.9.1 4xSSAA .................................................................................................................................... 99<br />
9.9.2 16xSSAA ................................................................................................................................ 100<br />
9.9.3 Zoom ....................................................................................................................................... 101<br />
7
8<br />
9.10 Half-Life 2: Imatge 1 ................................................................................................................... 104<br />
9.10.1 2xMSAA ............................................................................................................................... 107<br />
9.10.2 4xMSAA ............................................................................................................................... 108<br />
9.10.3 8xMSAA ............................................................................................................................... 109<br />
9.10.4 Zoom ..................................................................................................................................... 110<br />
9.11 Half-Life 2: Imatge 2 ................................................................................................................... 113<br />
9.11.1 2xMSAA ............................................................................................................................... 115<br />
9.11.2 4xMSAA ............................................................................................................................... 116<br />
9.11.3 8xMSAA ............................................................................................................................... 117<br />
9.11.4 Zoom ..................................................................................................................................... 118<br />
9.12 Half-Life 2: Imatge 3 ................................................................................................................... 119<br />
9.12.1 2xMSAA ............................................................................................................................... 121<br />
9.12.2 4xMSAA ............................................................................................................................... 122<br />
9.12.3 8xMSAA ............................................................................................................................... 123<br />
9.12.4 Zoom ..................................................................................................................................... 124<br />
9.13 Autor ............................................................................................................................................ 125<br />
9.13.1 Fada ....................................................................................................................................... 125<br />
9.13.2 Silueta ................................................................................................................................... 127<br />
9.14 Half-Life 2: Imatge 1 ................................................................................................................... 130<br />
10. Conclusions ....................................................................................................................................... 137<br />
11. Glossari ............................................................................................................................................. 139<br />
12. Referències ........................................................................................................................................ 141<br />
13. Bibliografia ....................................................................................................................................... 143<br />
13.1 Llibres .......................................................................................................................................... 143<br />
13.2 Recursos electrònics ..................................................................................................................... 143
1. Introducció<br />
L’aliasing és la distorsió que es produeix en una senyal quan aquesta és mostrejada per<br />
sota de la seva freqüència de mostreig.<br />
Visualment, és el fenomen que es mostra en les imatges, quan algunes corbes o línies<br />
inclinades es veuen de forma esglaonada. Aquest efecte és una interferència que es produeix<br />
quan no hi ha suficients píxels per capturar tots els detalls de la imatge, donant com a resultat<br />
una imatge de baixa qualitat.<br />
Figura 1. Exemple de figures amb aliasing i sense aliasing [1]<br />
Existeixen diferents tipus d’aliasing, com per exemple: l’aliasing temporal, que podem<br />
identificar a les animacions; l’aliasing espacial, que es pot apreciar en els patrons que es<br />
mostregen per sota de la freqüència necessària, o bé en les alteracions que es produeixen als<br />
contorns dels objectes d’una imatge.<br />
No obstant, existeixen mètodes per corregir l’aliasing, són les anomenades tècniques<br />
d’antialiasing. Els més coneguts són el Supersampling i el Multisampling, els quals detallarem<br />
en el capítol següent.<br />
El Morphological Antialiasing és una altra de les tècniques existents, i serà la que<br />
analitzarem en detall en aquest projecte. Aquesta va ser presentada l’any 2009 pel treballador<br />
d’Intel Alexander Reshetov i, degut als seus avantatges, s’està establint en l’actualitat com a una<br />
bona alternativa envers altres metodologies més antigues.<br />
La major novetat d’aquesta tècnica respecte a les altres, és la de tractar directament la<br />
imatge resultant del renderitzat de l’escena per tal d’aplicar l’antialiasing a la zona més adient.<br />
D’aquesta manera, s’obtenen imatges de bona qualitat amb un considerable augment del<br />
rendiment.<br />
9
10<br />
1.1 Motivació<br />
Introducció<br />
L’objectiu principal d’aquest Projecte Final de Carrera, és estudiar en detall el<br />
Morphological Antialiasing.<br />
Per dur a terme aquesta tasca, hem realitzat un estudi previ de l’algorisme proposat a partir<br />
del qual, hem establert la base necessària per al següent pas: la implementació.<br />
La implementació de l’algorisme s’ha aconseguit interpretant les indicacions suggerides<br />
per l’autor, a partir de les quals, hem experimentat amb diferents tècniques fins establir quina<br />
és la més adequada per obtenir un resultat efectiu.<br />
En aquest projecte, hem decidit centrar-nos en la qualitat de la imatge resultant, i no hem<br />
tingut en compte cap tipus d’optimització respecte al rendiment. Per aquest motiu, hem escollit<br />
aquesta primera versió de l’algorisme enfocada a ser executada per la CPU en temps diferit.<br />
Existeixen altres tècniques però, que basant-se en aquest algorisme, han aconseguit portar<br />
el concepte del Morphological Antialiasing a la GPU de forma eficient.<br />
Per tal d’analitzar i comparar els resultats reals del Morphological Antialiasing envers a<br />
d’altres tècniques de correcció d’aliasing ja conegudes, hem fet servir un conjunt d’imatges de<br />
prova de diferents àmbits.<br />
Finalment, mitjançant l’avaluació d’aquests resultats, arribarem a unes conclusions on<br />
s’exposaran els avantatges i inconvenients de l’ús d’aquesta tècnica.
2. Conceptes generals i estat de l’art<br />
2.1 Aliasing<br />
L’aliasing, en termes de processament del senyal, és la distorsió de la informació que es<br />
produeix quan mostregem digitalment senyals contínues a una freqüència molt baixa. Quan això<br />
succeeix, aquestes senyals que en origen eren diferents es tornen indistingibles, de manera que<br />
no és possible reconstruir la senyal original a partir de les mostres discretes, doncs les baixes<br />
freqüències han provocat la pèrdua de detall en la senyal. Bàsicament, l’aliasing es produeix<br />
quan altes freqüències es mostren com a baixes freqüències.<br />
Per evitar aquesta pèrdua d’informació, necessitem canviar la freqüència de mostreig a<br />
almenys dues vegades la major freqüència de l’objecte, que anomenem freqüència de mostreig<br />
de Nyquist (fs):<br />
fs = 2 fmax<br />
Podem distingir entre aliasing espacial, que són els problemes que sorgeixen en el<br />
mostreig en l’espai; i aliasing temporal, que són els problemes que es poden trobar en el<br />
mostreig al llarg del temps. La seva solució, tot i basar-se en el mateix principi de la freqüència<br />
de mostreig de Nyquist, tenen solucions molt diferents.<br />
En l’àmbit de la infografia, que és el que analitzarem, dos exemples típics d’aliasing<br />
espacial són els jaggies [G1] i els patrons de moiré.<br />
Els jaggies es poden identificar, visualment, com defectes (artifacts [G2] ) amb forma<br />
“d’arestes dentades” a la vora dels polígons. Aquests artifacts es produeixen quan s’intenta<br />
representar una línia corba o una recta inclinada en una imatge en la que, pel fet de tenir una<br />
resolució final finita, no és possible mostrar la línia correctament. Aquests graons que trobem a<br />
les línies, no són més que la forma quadrada que tenen els píxels que la composen.<br />
Els patrons de moiré són patrons d’interferència que es produeixen quan intentem mostrar,<br />
amb molt detall, patrons amb un alt grau de regularitat. Per exemple, dos conjunts de línies<br />
superposades amb una diferència mínima en la seva mida.<br />
11
12<br />
Figura 2. Patró de Moiré [2]<br />
Conceptes generals i estat de l’art<br />
L’animació és un àrea en la que es poden apreciar molt bé els efectes de l’aliasing<br />
temporal. Això és conseqüència dels canvis que s’originen d’un frame [G3] a un altre: les textures<br />
poden variar i els objectes petits podrien aparèixer i desaparèixer. Aquest efecte s’anomena<br />
aliasing temporal, i es produeix quan la freqüència de mostreig d’una escena és molt baixa en<br />
comparació amb la velocitat a la que es transformen els objectes que conté.<br />
Per evitar l’aliasing temporal, s’ha de complir la freqüència de mostreig de Nyquist: la<br />
freqüència de mostreig de l’escena ha de ser, com a mínim, dues vegades més gran que la<br />
velocitat màxima que trobem als objectes de l’escena. Un aproximació a l’antialiasing temporal<br />
seria afegir motion blur [G4] a la imatge.<br />
D’altra banda, no és possible evitar l’aliasing espacial, però poden camuflar-se els seus<br />
efectes mitjançant l’ús de tècniques d’antialiasing.<br />
2.2 Antialiasing<br />
L’antialiasing és la tècnica que s’encarrega de suavitzar els defectes que produeix<br />
l’aliasing. Existeixen diferents mètodes que aconsegueixen millorar la percepció de la imatge de<br />
forma notable.<br />
Alguns algorismes, com el Morphological Antialiasing, treballen amb un sol valor per<br />
cada píxel: és a dir, només agafaran una mostra del color de cada píxel que consultin. En aquest<br />
cas, es tindran en compte el valors dels píxels veïns per tal d’obtenir un nou color per a un píxel<br />
en concret.<br />
En el cas del supersampling i el multisampling, es pot obtenir més d’un valor a partir d’un<br />
sol píxel. Segons el nombre de mostres que s’agafa de cada píxel, l’antialiasing s’identificarà<br />
com a 2X, 4X, 8X, etc. Quan més alt és el valor millor és el resultat, però també més costós,<br />
doncs requereix un alt nivell de càlcul i processament.<br />
Generalment, les tècniques d’antialiasing es centren en reduir les transicions brusques a la<br />
vora dels objectes. La idea principal consisteix en fer creure a l’ull que el contorn de l’objecte es<br />
troba completament suavitzat, quan en realitat només s’ha retocat de manera que pugui passar<br />
desapercebut.<br />
Existeixen diferents tècniques d’antialiasing que s’aprecien per la qualitat de les imatges<br />
generades i el cost en el rendiment que això comporta. A continuació, analitzarem les més<br />
importants.
Conceptes generals i estat de l’art<br />
2.2.1 Supersampling Anti-aliasing (SSAA)<br />
Supersampling, també conegut com Full-scene anti-aliasing (FSAA), és una tècnica de<br />
força bruta. El seu funcionament consisteix en renderitzar la imatge a més alta resolució. A<br />
continuació, s’escala la imatge a la seva mida original mitjançant un filtre de reducció.<br />
La idea principal es basa en el fet que la imatge en alta resolució conté més píxels que els<br />
que finalment es mostraran, per tant contenen més informació de color. Al reduir la imatge<br />
estarem utilitzant aquesta informació de tal manera, que cada píxel de la imatge final tindrà el<br />
valor promig dels píxels de la imatge més gran.<br />
Les imatges resultants d’aplicar l’SSAA són un referent per la seva altíssima qualitat, però<br />
el seu consum en el rendiment és extremadament costós.<br />
El nombre de mostres determinarà la qualitat resultant de la imatge, alhora que<br />
incrementarà de forma considerable el cost de computació. Les imatges al doble de resolució,<br />
4xSSAA (2x2 supersampling,) renderitzaran 4 subpíxels per cada un dels píxels de la imatge<br />
original.<br />
Figura 3. 4xSSAA (4 subpíxels per píxel) i 16xSSAA (16 subpíxels per píxel) [6]<br />
És habitual que els algorismes de supersampling assignin més pes als subpíxels pròxims al<br />
centre que a la resta, ja que s’espera que la informació d’aquests serà més important alhora de<br />
determinar la intensitat global del píxel.<br />
Els pesos específics es poden identificar mitjançant una màscara de ponderació: una matriu<br />
de valors que indica la importància relativa de cada subpíxel.<br />
Figura 4. Màscara de ponderació<br />
13
14<br />
Conceptes generals i estat de l’art<br />
Cal destacar però, l’ús de tècniques de filtratge. Es tracta d’utilitzar una superfície de pesos<br />
contínua que cobreix el píxel. El mètode és similar a l’utilitzat amb la màscara de ponderació,<br />
amb la diferència que ara s’integra sobre la superfície del píxel per tal d’obtenir la intensitat<br />
promig. En aquest cas, l’alçada proporciona el pes relatiu de cada posició del subpíxel.<br />
Distingim tres tipus: filtre de cub, de con i gaussià.<br />
Figura 5. Funcions de filtratge [3]<br />
Existeixen altres tipus de supersampling basats en el mètode utilitzat per obtenir les<br />
mostres a l’interior de cada píxel.<br />
El més senzill, conegut com supersampling ordenat, és aquell en el que es divideix el píxel<br />
en subpíxels i s’escull la mostra que correspon al centre de cada un d’ells.<br />
Figura 6. Supersampling ordenat [4]<br />
El supersampling rotat és un mètode similar a l’anterior. La única diferència és que les<br />
mostres s’obtenen a partir d’una graella de subpíxels que ha estat rotada prèviament. D’aquesta<br />
manera, s’evita que les mostres estiguin alineades amb els eixos, i produeix una millora en la<br />
correcció en la majoria de casos, amb el mateix cost computacional del supersampling ordenat.
Conceptes generals i estat de l’art<br />
Figura 7. Supersampling rotat [4]<br />
Els altres tipus de supersampling es basen en el concepte d’aleatorietat. El problema de<br />
seleccionar les mostres de forma aleatòria és que, en alguns casos, estarem deixant zones<br />
importants sense cobrir.<br />
Figura 8. Supersampling aleatori [4]<br />
Per tal de solucionar això, existeixen algunes variacions d’aquest mètode, com per<br />
exemple: el disc de Poisson, on es comprova que cada parell de mostres escollides no siguin<br />
molt properes l’una de l’altra. El cost de realitzar aquestes comprovacions és elevat.<br />
Figura 9. Supersampling disc de Poisson [4]<br />
Una tècnica per alleugerir el cost de seleccionar les mostres d’una manera o altre, és a amb<br />
l’Adaptative Supersampling. Aquesta tècnica s’encarrega d’escollir només una mostra per píxel<br />
quan no hi ha un canvi significatiu d’un píxel a l’altre; en cas contrari, es recullen les mostres<br />
necessàries. El resultat d’aplicar aquesta tècnica recau en una millora en el rendiment.<br />
2.2.2 Multisampling Anti-aliasing (MSAA)<br />
L’MSAA és una de les tècniques d’antialiasing més utilitzades, i es pot considerar com un<br />
cas especial de supersampling, encara que es tracta d’un procés més sofisticat. NVIDIA va<br />
incorporar-lo per primer cop a les targes de vídeo GeForce 3.<br />
El principal avantatge de l’MSAA és que només s’aplica en aquelles àrees que és necessari.<br />
La tarja de vídeo processa la imatge avaluant en quins punts serà necessari corregir l’aliasing<br />
que, generalment, es localitza a la vora dels objectes de l’escena.<br />
15
16<br />
Conceptes generals i estat de l’art<br />
D’aquesta manera, el filtre ignorarà la resta de la imatge i s’aplicarà només en les zones<br />
especificades. Per tal de decidir quins píxels han de ser filtrats, es realitzen càlculs sobre la<br />
profunditat dels diferents polígons que intervenen en l’escena.<br />
Gràcies a aquests càlculs, l’algorisme pot identificar els píxels que pertanyen a un mateix<br />
objecte, i d’aquesta manera reconeixerà com a un conjunt tots aquells píxels iguals que<br />
pertanyen a una mateixa zona. Això permetrà assignar el mateix color a tot el conjunt i millorarà<br />
el rendiment de forma significativa.<br />
D’altre banda, aquest procés de selecció de píxels és el causant d’un dels principals<br />
desavantatges de l’algorisme: els càlculs per decidir quines zones necessiten correcció es<br />
realitzen de tal manera, que la filtració es limitarà a les àrees externes dels polígons, i en<br />
conseqüència, les textures internes seran ignorades i no rebran cap tipus de correcció. Tot i així,<br />
és un filtre molt adequat per a objectes sòlids.<br />
Un cop s’hagin detectat les zones que seran filtrades, s’agafen mostres de colors a partir<br />
dels píxels de la imatge. Un dels avantatges del multisampling respecte el supersampling, és que<br />
només és calcularà un valor de textura per píxel enlloc d’un valor per cada subpíxel.<br />
Les mostres de color obtingudes, seran combinades entre elles amb l’objectiu de crear<br />
transposicions graduals entre els colors que siguin diferents i ens permetran suavitzar la zona<br />
amb aliasing.<br />
En aquest cas, tal com succeeix amb el supersampling, el número de mostres que<br />
s’utilitzarà en el procés és molt significatiu de cara a obtenir bona qualitat d’imatge (2x, 4x...).<br />
També existirà una matriu de ponderació, de manera que el pes de les mostres a l’hora<br />
d’assignar els colors no és el mateix per tots els subpíxels.<br />
L’MSAA és molt més lleuger que l’SSAA. El supersampling renderitzarà tota la imatge a<br />
una resolució molt alta independentment de la necessitat de cada zona. El multisampling en<br />
canvi, donat que només s’aplica en les zones que és estrictament necessari, deixarà gran part de<br />
les textures sense processar. Això desembocarà en un estalvi tant en el bandwidth [G5] com en el<br />
fillrate [G6] .<br />
Figura 10. Exemple de l’MSAA i l’SSAA a 8x amb una Radeon de la sèrie HD 5000 [7]
Conceptes generals i estat de l’art<br />
El fet que el multisampling seleccioni prèviament les zones a tractar pot proporcionar una<br />
qualitat d’imatge similar amb un rendiment superior al del supersampling.<br />
2.2.3 Alpha-to-Coverage<br />
L’inconvenient més gran de l’MSAA és el fet de no tractar les textures internes dels<br />
objectes. En conseqüència, les textures alpha (transparents), que són habituals a les escenes amb<br />
reixes, fulles... tampoc es veuran corregides.<br />
Aquest cas específic resulta molt problemàtic, doncs aquests objectes s’acostumen a<br />
construir només a base de textures per tal d’estalviar processament. A més a més, les textures<br />
alpha produeixen el Texture Shimmering, un efecte òptic en el que les textures donen la<br />
sensació de moure’s amb la càmera. Òbviament, suposa una pèrdua de qualitat de la imatge<br />
molt gran.<br />
L’Alpha-to-Coverage és una ampliació de l’MSAA que respon a la necessitat de solucionar<br />
aquest problemes amb les textures alpha.<br />
Bàsicament, es realitza una anàlisi de textures transparents avaluant la quantitat d’espai del<br />
píxel de la imatge estan ocupant. A continuació, es creen varies màscares de filtrat que<br />
permetran recombinar el resultat. Tot i ser un procés bastant complex, el seu rendiment és<br />
superior al de l’SSAA, i la qualitat de la imatge és molt satisfactòria.<br />
L’únic inconvenient que té aquesta tècnica és que les textures queden una mica més<br />
borroses a la vora en comparació amb el supersampling. Però això és corregible fent les textures<br />
més visibles mitjançant un multiplicador de contrast.<br />
2.2.4 High-Resolution Anti-aliasing (HRAA)<br />
L’HRAA es distingeix de l’SSAA en que no necessita tractar amb imatges de resolució més<br />
gran. Això li proporciona un augment considerable en el seu rendiment.<br />
Aquest antialiasing utilitza la tècnica Quincunx, que consisteix en emmagatzemar cada<br />
píxel en dues zones diferents del frame buffer [G7] .<br />
D’aquesta manera, en renderitzar tota l’escena, el motor gràfic de la tarja desplaçarà<br />
virtualment una de les dues escenes, el desplaçament serà de mig píxel en diagonal.<br />
Figura 11. Desplaçament dels píxels d’una escena respecte als de l’altre [5]<br />
17
18<br />
Conceptes generals i estat de l’art<br />
Aquest mètode provocarà la situació següent: cada píxel de la primera escena es trobarà<br />
rodejat per quatre píxels de la segona, que es troben exactament a una distància de 1 /√2.<br />
Finalment, el motor filtrarà aquests cinc píxels per tal d’obtenir el valor final. No tots els<br />
píxels tindran el mateix pes, doncs el valor del píxel central (½) tindrà més rellevància que els<br />
del voltant (⅛).<br />
Els resultats obtinguts amb aquesta tècnica tant en qualitat com en rendiment són molt<br />
bons, el fet de tenir l’escena repetida només afecta al consum d’ample de banda de la memòria.<br />
La primera aparició d’aquesta tècnica va ser en la generació de GeForce3 d’NVIDIA, i va<br />
proporcionar, per primer cop, la combinació d’altes resolucions a bon rendiment.
3. Descripció general del Morphological Antialiasing<br />
El Morphological Antialiasing (MLAA) és un algorisme dissenyat per la fase de postprocessament<br />
d’imatges, doncs és una tècnica que s’aplica sobre imatges ja generades.<br />
Donat que l’algorisme treballa en l’espai de pantalla enlloc de l’espai 3D, ens permetrà<br />
corregir la imatge independentment de la seva complexitat o la tècnica de render utilitzada per<br />
generar l’escena. D’aquesta manera, el cost de corregir l’aliasing es veurà rebaixat en no haver<br />
de testejar rajos addicionals.<br />
L’MLAA consta de tres fases:<br />
1. Cerca de discontinuïtats entre píxels<br />
2. Identificació dels patrons corresponents: un cop detectades les discontinuïtats entre<br />
píxels, es fa una cerca més detallada intentant localitzar certs patrons que ens<br />
permetran localitzar la zona que requereix correcció.<br />
3. Assignació de colors als patrons respecte a la composició dels píxels veïns<br />
Per trobar les discontinuïtats entre píxels, es fa una cerca exhaustiva comparant les línies<br />
de la imatge per poder identificar aquelles zones amb possibilitat de tenir aliasing.<br />
A partir d’aquestes discontinuïtats entre píxels, es realitza una cerca més detallada que<br />
correspondrà a la identificació de certs patrons que ens permetran localitzar la zona que<br />
requereix correcció en el color.<br />
Un cop localitzades les zones afectades per l’aliasing, es procedeix a corregir el color dels<br />
seus píxels tenint en compte el patró amb el qual s’ha localitzat aquella zona i el color dels<br />
píxels que el rodegen.<br />
La implementació de l’aplicació s’ha desenvolupat en dues fases: en blanc i negre i en<br />
color. La implementació en blanc i negre es considera el cas base de l’algorisme i la versió en<br />
color és la seva generalització.<br />
19
4. Eines utilitzades<br />
Per poder realitzar aquest projecte hem utilitzat les següents eines:<br />
- Microsoft Visual Studio 2008: entorn de programació amb el qual hem fet les diferents<br />
implementacions de l’algorisme en C++.<br />
- Autodesk Maya 2011: software enfocat a l’animació en 3D. S’ha utilitzat per<br />
renderitzar algunes escenes.<br />
- Sample de DirectX: aplicació de prova que permet provar diferents configuracions de<br />
la tarja gràfica sobre un model 3d.<br />
- Adobe Photoshop CS3: editor de gràfics que hem utilitzat per editar i manipular<br />
algunes imatges.<br />
- Gimp 2: editor d’imatges que hem utilitzat per editar i manipular algunes imatges.<br />
- testMLAA: programa de prova de l’autor de l’MLAA. Amb aquest programa hem pogut<br />
avaluar la qualitat de la nostra implementació.<br />
- Gantt Project: software dedicat al disseny de diagrames d’activitats. L’hem utilitzat<br />
per mostrar la cronologia del projecte.<br />
- Half-Life 2: videojoc del qual hem obtingut imatges mitjançant l’aplicació de diferents<br />
antialiasings.<br />
21
5. Estat actual de l’MLAA<br />
Actualment, existeixen diverses implementacions per a temps real basades en l’MLAA, tot i<br />
que fins fa poc, ningú havia publicat el codi per portar l’algorisme a la GPU. Una de les<br />
primeres implementacions va ser el Practical Mortphological Antialiasing on the GPU [12].<br />
Destacarem però, les implementacions d’AMD, de Sony i la implementació coneguda com<br />
Jimenez’s MLAA [13] de la Universitat de Zaragoza.<br />
AMD va presentar la seva implementació de l’MLAA amb les Radeon HD 6800 i, donat<br />
que treballa a nivell de driver, permet incorporar l’MLAA a videojocs que no disposaven<br />
d’aquest antialiasing de forma nativa.<br />
Tot i que fins fa poc, AMD no tenia cap tipus de competència en quant al morphological,<br />
NVIDIA ha decidit recentment implementar un nova tècnica anomenada SRAA (Subpixel<br />
Reconstruction Antialiasing), amb l’objectiu d’introduir-la en les seves GPUs. La principal<br />
diferència entre ambdós mètodes és que representa que el SRAA respectarà millor els límits de<br />
la geometria, ja que afegeix la visibilitat del subpíxel a les característiques de l’algorisme.<br />
Cal destacar que, tant AMD com NVIDIA, estan donant suport a nivell de driver a una<br />
problemàtica que des de fa anys s’ha intentant solucionar des de l’MSAA. Recordem que el<br />
multisampling és la solució més estesa per a combatre l’aliasing i que, a pesar dels bons<br />
resultats obtinguts a temps real, el seu consum de memòria és excessivament alt.<br />
Per tant, la idea base de l’MLAA sorgeix de conceptes que s’han anat investigant des dels<br />
anys 90, però no ha estat fins ara que s’ha aconseguit assolir una tècnica estable i prou eficient<br />
com per portar-la a temps real. És per això que aquest nou enfocament és tan rellevant, doncs<br />
s’obtenen qualitats superiors amb un consum de recursos menor.<br />
L’altre implementació important és la de Sony per la PS3, que tot i tenir molt a veure amb<br />
la implementació que ha fet AMD, obté millors resultats mitjançant la paralel·lització de cinc de<br />
les seves SPUs. Cal afegir però, que en aquest cas, la llibreria de l’MLAA es troba a l’SDK, i per<br />
tant, són els mateixos desenvolupadors els que han donat suport per decidir quan utilitzar-lo.<br />
D’altra banda, un dels punts a favor de la implementació de Sony, és que treballa amb el<br />
frame abans de que s’afegeixi el text, i per tant no pateix una de les conegudes limitacions de<br />
l’MLAA. AMD en canvi, treballa amb el frame complert i no pot evitar aquest problema.<br />
Finalment, Jimenez’s MLAA és una optimització de l’MLAA per la GPU que investiga una<br />
solució viable per portar el morphological a l’Xbox 360. Els seus resultats es troben entre el<br />
4xMSAA i 8xMSAA amb una fracció del consum de temps i de memòria.<br />
Al marge de les diferents implementacions que es van proposant, s’està fomentant la teoria<br />
d’una tècnica híbrida que combini el multisampling i el morphological. Jiménez suggereix<br />
combinar el 4xMSAA per reduir les característiques a nivell de subpíxel, i a continuació aplicar<br />
l’MLAA, per tal de corregir la resta d’aliasing de la imatge.<br />
Com a demostració dels efectes de l’MLAA, es poden comprovar algunes d’aquestes<br />
implementacions en els següents videojocs: Dead Space, Half-Life 2, Final Fantasy XIV,<br />
Dragon Age, Mass Effect2, etc.<br />
23
6. Cronologia del desenvolupament del projecte<br />
A continuació es mostren els diagrames que representen el temps dedicat a cada part del<br />
projecte final de carrera.<br />
Figura 12. Diagrama de Gantt<br />
25
26<br />
Figura 13. Continuació diagrama de Gantt<br />
Cronologia del desenvolupament del projecte<br />
Com podem veure als diagrames, la data d’inici de desenvolupament del projecte va ser el<br />
27/02/2010 i la de finalització el 21/06/2011.<br />
Al diagrama trobem detallades cada una de les etapes del projecte, amb la seves dates<br />
corresponents. Aquestes fases, són el desglossament en detall de les fases que hem dut a terme<br />
per realitzar el projecte. Es poden resumir en cinc passos:<br />
- Anàlisi de la documentació (1/03/10 – 3/07/10)<br />
- Implementació de la versió en blanc i negre (5/07/10 – 16/10/10)<br />
- Implementació de la versió en color (18/10/10 – 25/05/11)<br />
- Implementació de l’aplicació per comparar imatges (24/05/11 – 25/05/11)<br />
- Redacció d’aquesta documentació (2/03/11 – 21/06/11)
7. Aplicació de l’MLAA<br />
7.1 Descripció detallada de l’MLAA<br />
L’estudi de la documentació de l’algorisme ens ha portat, en molts casos, a prendre<br />
decisions basant-nos en la informació que l’autor ens ofereix. Aquesta informació, en ser poc<br />
detallada, pot desembocar en interpretacions errònies que s’han hagut de descartar i replantejar<br />
per tal d’arribar a un resultat satisfactori.<br />
Com ja havíem avançat, tant a la documentació com a la nostra implementació, es<br />
distingeixen un cas base on s’aplica l’MLAA sobre imatges en blanc i negre, i un cas genèric per<br />
a imatges en color.<br />
L’algorisme es pot descomposar en tres fases: la cerca de discontinuïtats, la localització de<br />
patrons i l’assignació de colors.<br />
A continuació, desglossarem cada un d’aquests passos per a la versió en blanc i negre, tot<br />
analitzant què diu la documentació i com hem arribat a la seva implementació.<br />
7.1.1 Cerca de discontinuïtats<br />
El primer pas de l’algorisme consisteix en comprovar cada una de les fileres de píxels per<br />
tal d’obtenir aquelles arestes que separen els píxels blancs dels píxels negres.<br />
La forma de fer-ho és comparant cada fila de píxels amb la seva adjacent, repetint aquest<br />
mateix procés per a les columnes.<br />
Cada una d’aquestes arestes trobades formarà part d’una línia i es veurà definida a partir<br />
dels seus vèrtexs més llunyans. Podríem interpretar aquesta línia com un espai entre dues files o<br />
dues columnes; en conseqüència, una línia podrà contenir més d’una discontinuïtat.<br />
Com a cas particular per poder gestionar els píxels dels extrems de la imatge, l’autor ens<br />
proposa el següent conveni: suposar que els píxels de la vora es dupliquen en una filera<br />
imaginària.<br />
Observem l’exemple:<br />
Figura 14. Esquerra: imatge original en blanc i negre; dreta: els píxels de la vora creen<br />
una filera imaginària<br />
En la imatge original, el píxel I-C es troba a un extrem de la imatge, per tant existirà una<br />
fila imaginària 0 on tots els seus píxels seran de color blanc, excepte el píxel 0-C, que serà<br />
negre. El mateix succeeix amb els píxels IV-A i V-A: existiran els píxels de color negre IV-Z i<br />
V-Z, que formaran part d’una columna imaginària Z on la resta de píxels seran de color blanc.<br />
27
28<br />
Aplicació de l’MLAA<br />
Comparem la fila I amb la fila II. Veiem que existeix una discontinuïtat entre el píxel I-C<br />
(negre) i el píxel II-C (blanc); el mateix succeeix en comparar els píxels I-G i II-G. Com cada<br />
una d’aquestes discontinuïtats té longitud 1, obtenim una línia amb dues discontinuïtats (la línia<br />
es troba entre la fila I i la fila II de la Figura 14, correspon a la línia 2 de la Figura 15).<br />
La imatge de la Figura 15 mostra les discontinuïtats que es troben a les línies, per tant, ja<br />
no tindrem una graella de píxels: tindrem línies de discontinuïtats, on cada línia correspon a la<br />
zona entre dos píxels de la imatge original.<br />
Seguint amb l’exemple anterior, comprovem que en la línia 2 existeixen dos<br />
discontinuïtats: de c a d i de g a h.<br />
Figura 15. Discontinuïtats localitzades<br />
Si remarquem cada una de les discontinuïtats trobades per cada una de les línies, tant per<br />
files com per columnes, visualitzarem el contorn de la silueta de la imatge original.<br />
7.1.2 Identificació de patrons<br />
En aquest segon pas de l’algorisme, es tracta de localitzar aquelles arestes que són<br />
ortogonals a una determinada aresta en el seu punt més llunyà; és a dir, aquells segments que es<br />
troben units per l’extrem a un segment perpendicular.<br />
Existeixen dos tipus de segment: els que pertanyen a la vora de la imatge, que només<br />
tindran un segment ortogonal, i els de la resta de la imatge que en tindran dos. Aquests últims<br />
seran els més habituals.<br />
Considerem cada patró format per una aresta primària, que correspon a la línia que hem<br />
trobat en el primer pas de l’algorisme (cerca de discontinuïtats), i una o dues arestes<br />
secundàries. Les arestes secundàries són els segments ortogonals a l’aresta primària i que es<br />
localitzen en aquesta segona fase.<br />
L’aresta primària podrà tenir qualsevol longitud més gran que 0, però les arestes<br />
secundàries sempre seran considerades de longitud 1. Encara que les arestes secundàries siguin<br />
en realitat de mida més gran, nosaltres només seleccionarem aquell fragment.<br />
En l’MLAA ens proposen classificar aquests conjunt d’arestes primàries i secundàries<br />
segons la seva forma. Tindrem tres patrons diferents: en forma de U, L o Z.<br />
Podem reconèixer alguns d’aquests patrons a la imatge següent. Per enumerar-los farem<br />
servir la següent nomenclatura: per exemple, a l’aresta primària que va de 4a a 4c<br />
l’anomenarem 4a4c; i la secundària que va de 4c a 5c serà 4c5c.
Aplicació de l’MLAA<br />
Figura 16. S’han identificat alguns patrons L,U i Z<br />
El patró L es forma quan un dels segments de separació té el seu origen a la vora de la<br />
imatge. És per això que es composa d’una aresta primària i només una de secundària: allà on hi<br />
hauria d’haver l’altra aresta secundària es troba la vora de la imatge.<br />
A la imatge, identifiquem una L que es composa de les arestes 4a4c (primària) i 4c5c<br />
(secundària).<br />
El patró U és producte de la unió d’una aresta primària i dues arestes secundàries que es<br />
troben en la mateixa direcció. Un exemple seria l’aresta principal 8d8f amb les arestes<br />
secundàries 7d8d i 7f8f.<br />
Figura 17. S’ha identificat un nou patró U<br />
Podríem identificar altra U a la imatge que il·lustraria el cas on, encara que les arestes<br />
secundàries tinguin una longitud més gran, només escolliríem aquell fragment de longitud 1.<br />
Aquest és el cas que es forma amb l’aresta principal 6h7h i les arestes secundàries 6g6h i 7g7h.<br />
El patró Z es troba quan tenim una aresta primària i dues arestes secundàries que van en<br />
direccions oposades. És el cas de l’aresta primària 5c5f i les secundàries 4c5c i 5f6f<br />
Un mateix segment pot formar part de diferents patrons (en realitat, fins a quatre). Posem<br />
l’exemple de l’aresta 6g6h que fins ara era una aresta secundària que formava part d’un patró U.<br />
Podem comprovar que aquest fragment, ja que l’aresta forma part d’un segment de separació<br />
més gran, també forma part de l’aresta principal 6f6h. I aquesta aresta, junt amb les secundàries<br />
5f6f i 6h7h formen un patró Z. Si ens fixem més, aquesta mateixa aresta secundària de Z<br />
correspon a l’aresta principal de la U que havíem trobat en la imatge anterior.<br />
29
30<br />
Aplicació de l’MLAA<br />
Figura 18. Mostra d’un patró Z que comparteix aresta amb el patró U anterior<br />
Tècnicament, l’MLAA no tindrà en compte la múltiple participació de les arestes en<br />
diferents patrons alhora i processarà cada una de les formes un cop hagin estat identificades. És<br />
a dir, en cas de solapament de patrons l’algorisme els processarà tots, com succeeix amb els dos<br />
patrons U i Z (color blau) de la imatge de la Figura 17 i de la Figura 18. D’aquesta manera<br />
s’obtindrà un lleuger desenfocament en la zona que permetrà, al mateix temps, atenuar les altes<br />
freqüències injustificades que hi puguin haver.<br />
Donat que la cerca de patrons es realitzarà tant de forma horitzontal (files) com de forma<br />
vertical (columnes), aquests són tots els possibles patrons que podem trobar:<br />
7.1.3 Assignació de colors<br />
Figura 19. Possibles patrons de l’MLAA<br />
La idea principal d’aquest tercer pas, és associar un pes a cada un dels píxels per tal<br />
d’assignar el color més adient. Per tal d’aconseguir aquest objectiu, l’MLAA proposa la<br />
descomposició dels patrons U i Z en dos patrons L. D’aquesta manera, simplifica el problema ja<br />
que només s’hauran de processar patrons amb forma de L en aquesta part de l’algorisme.<br />
Figura 20. Descomposició de patrons
Aplicació de l’MLAA<br />
Les arestes primàries, com ja havíem dit, poden tenir qualsevol longitud major o igual que<br />
0. Si tenim un patró U o Z amb una aresta primària de longitud 1, en descomposar-lo en dos<br />
patrons L, les seves arestes primàries seran de longitud 0,5.<br />
Cada forma L està formada per tres vèrtexs (V0, V1, V2) . Per poder trobar els pesos dels<br />
píxels que intervenen en l’assignació de colors, es fa una connexió des del punt mig de l’aresta<br />
secundària (as ) fins al vèrtex restant de l’aresta primària (ap). D’aquesta manera, cada una de les<br />
cel·les que contenen aquest patró L quedaran dividides en dos trapezoides que ens permetran<br />
assignar el pes corresponent a partir de la seva àrea.<br />
Figura 21. Connexió de les arestes primària i secundària del patró L<br />
La unió d’aquests dos vèrtexs forma alhora un supertriangle. En aquest cas, la última<br />
cel·la, que conté el vèrtex V2 no s’haurà dividit en dos trapezoides: tindrà un triangle, que<br />
correspondrà a la punta del supertriangle, i el polígon restant de la cel·la.<br />
Un cop connectades les dues arestes, es procedeix al càlcul de l’àrea α de cada un dels<br />
trapezoides adjacents a la L. També es calcularà l’àrea del triangle petit, en cas de ser necessari.<br />
La fórmula per a calcular l’àrea d’un trapezoide és:<br />
α = ( ( b1 + b2) · h ) / 2<br />
On b1 i b2 és la mida de les bases del trapezoide i h correspon a l’alçada. I per calcular<br />
l’àrea del triangle:<br />
On b és la base i h l’alçada.<br />
α = ( b · h ) / 2<br />
En el nostre exemple, l’alçada h del trapezoide sempre serà 1, ja que correspon a un costat<br />
sencer de la cel·la, que a més a més coincideix amb un fragment de l’aresta primària. De la<br />
mateixa manera obtindrem b1, que serà 0,5, corresponent a la meitat de la longitud de la cel·la<br />
(aresta secundària). El problema el trobem per b2, ja que és un valor desconegut fins ara.<br />
31
32<br />
Aplicació de l’MLAA<br />
Per calcular b2 partirem de la idea del supertriangle que teníem i, mitjançant una senzilla<br />
regla de tres, obtindrem la mida de l’altra base del trapezoide:<br />
Si 1 /2 és a 3 /2 com X és a 1 /2, llavors X és 1 /6<br />
Figura 22. Visualització dels trapezoides que es formen després de connectar les arestes<br />
Ara ja podrem calcular l’àrea del trapezoide de la cel·la cd45 (cel·la limitada per c i d per<br />
a 4 i 5):<br />
α = ( ( 1 /2 + 1 /6 ) · 1 ) / 2 = 1 /3<br />
Figura 23. Càlcul de les àrees del trapezoide i del triangle
Aplicació de l’MLAA<br />
El càlcul d’aquesta àrea ens permetrà obtenir, segons la següent fórmula, el valor del color<br />
que assignarem a la cel·la:<br />
cnew = (1 – α) · cold + α · copposite<br />
On cnew és el nou color, cold és el color anterior de la cel·la i copposite és el color de la cel·la<br />
que trobem al costat oposat de l’aresta primària.<br />
Per tant, si tenim que cold, corresponent al color de la cel·la actual, és blanc (valor 1) i<br />
copposite , corresponent al color de la cel·la cd56, és negre (valor 0), calcularem el nou color de la<br />
forma següent:<br />
cnew = (1 – 1 /3) · 1 + 1 /3 · 0 = 2 /3<br />
Per obtenir el color de la cel·la de45, calcularem en aquest cas l’àrea del triangle:<br />
α = ( 1 /6 · 1 /2) / 2 = 1 /24<br />
Si cold és blanc i copposite és negre, el nou color serà:<br />
cnew = (1 – 1 /24) · 1 + 1 /24 · 0 = 23 /24<br />
D’aquesta manera ja tindríem els nous colors per tot el patró L.<br />
Figura 24. Assignació del nou color als píxels que formen el patró L<br />
L’autor es refereix a com a one-size-fits-all al fet d’escollir el punt mig de l’aresta<br />
secundària com a norma general per a tots els patrons, ja que estem establint que tots tindran<br />
una mida standard. Aquesta aproximació però, crearà un error sistemàtic en l’àrea i l’estimació<br />
del color. D’altra banda reduirà la variància donant com a resultat una imatge més bona i<br />
suavitzada.<br />
33
34<br />
7.2 Blanc i negre vs. Color<br />
Aplicació de l’MLAA<br />
Per treballar amb imatges en color, és necessari adaptar els passos de l’algorisme. Tal com<br />
veurem a continuació, l’autor dona una idea molt genèrica de com ha tractat aquesta part. Cal<br />
afegir però, que la nostra implementació de l’algorisme en aquest punt té algunes diferències<br />
respecte a la idea original. Les comentarem en el capítol següent.<br />
7.2.1 Cerca de discontinuïtats<br />
La primera gran diferència entre la versió en blanc i negre (B&W) i la versió en color, és la<br />
localització de discontinuïtats.<br />
En B&W treballàvem en un espai binari: o és blanc o és negre. Ara, no només disposem de<br />
tres canals diferents per cada canal RGB, sinó que cada un d’aquests canals pot prendre 256<br />
valors diferents.<br />
Per tal d’afrontar aquest problema, tenim dues possibles solucions: tractar les diferències<br />
de color entre píxels veïns, o bé, treballar amb informació addicional: geomètrica o discreta.<br />
L’MLAA implementa la primera solució. Un dels avantatges d’aquesta tècnica és produeix<br />
en l’estalvi en processar alguns píxels, ja que només es processen aquells píxels que tenen<br />
colors diferents.<br />
Els píxels de color similar es passaran per alt, doncs es considera que el seu procés no<br />
alteraria el color resultant de forma significativa. De la mateixa manera, també pot ocórrer que<br />
es processin píxels innecessaris que provoquin una alteració en el color resultant.<br />
L’MLAA pot funcionar amb qualsevol mètode que ens permeti establir si dos píxels són<br />
diferents. L’autor proposa utilitzar la més simple i universal: s’establirà un llindar a partir del<br />
qual s’especificarà quins colors són iguals i quins diferents.<br />
En aquest cas, s’agafaran els 4 bits més significatius de cada canal RGB (8 bits cada un).<br />
En cas d’existir alguna diferència en aquests bits per a qualsevol dels canals, es considerarà que<br />
es tracta de colors diferents. El fet d’escollir 5 o 6 bits no alteraria el resultat de forma<br />
significativa, i escollint 3 perdríem alguna informació rellevant.<br />
Amb aquest mètode doncs, s’hauran trobat totes les discontinuïtats entre píxels.<br />
7.2.2 Identificació de patrons i assignació de color<br />
Recordem l’expressió d’assignació de colors que fèiem servir en blanc i negre:<br />
cnew = (1 – α) · cold + α · copposite<br />
Per tractar imatges en color utilitzarem aquesta mateixa expressió, doncs simplement cal<br />
aplicar-la a cada un dels canals RGB per separat a l’hora d’assignar el color del píxel.<br />
L’ús d’aquesta fórmula en B&W implica que, quan tinguem patrons adjacents els uns als<br />
altres, els colors assignats variaran de forma suau. Això és conseqüència directa de l’ús del punt<br />
mig en les arestes secundàries, ja que defineix una aproximació lineal contínua a la vora de la<br />
silueta.<br />
Per a imatges en color, l’MLAA vol conservar aquesta aproximació continua de la silueta,<br />
però ho farà de forma menys restrictiva.
Aplicació de l’MLAA<br />
Tenim el cas particular de la Figura 25 on visualitzem dos patrons Z:<br />
Figura 25. Exemple d’identificació de colors [55]<br />
Els colors dels píxels que es troben sota la línia que marca els patrons serien els mateixos<br />
en B&W, en color no podem concretar tant i direm que són similars. El mateix succeeix amb els<br />
colors dels píxels que es troben per sobre d’aquesta línia.<br />
En B&W, el valor de hd i hc seria ½, doncs segueix la regla del punt mig a l’aresta<br />
secundària. Donat que r caracteritza la relació que existeix entre les dues bases del trapezoide,<br />
podem afirmar que:<br />
r = hd / l<br />
on l és la longitud de l’aresta primària del patró Z.<br />
En el cas que la longitud de dos patrons connectats sigui la mateixa, els trapezoides blaus<br />
seran congruents de la mateixa manera que ho seran els grocs. Per tal d’establir els requeriments<br />
per una transició suau entre dues formes, computarem el mateix color assignat dos cops,<br />
utilitzant els paràmetres de cada forma:<br />
(hc – r) c1 + (1 – hc + r) c2 = (hd – r) d2 + (1 – hd + r) d3<br />
hc + hd = 1<br />
Aquelles imatges on els colors de les cel·les c1 i d2 siguin similars (c1 = d2), i també ho siguin<br />
els de les cel·les c2 i d3 (c2 = d3), simplificaran aquestes equacions de forma considerable.<br />
Doncs obtindrem que hc = hd, i per tant:<br />
hc = hd = ½<br />
Precisament aquesta és la regla del punt mig que hem aplicat a la versió en B&W. Aquest<br />
però, és un cas particular que no es donarà sempre, doncs volem conèixer tots aquells casos en<br />
que el punt d’intersecció de les dues formes sigui diferent del punt mig.<br />
Per obtenir aquest punt, solucionarem les equacions per tal de conèixer el valor de hc i hd.<br />
Donat que tenim tres canals de color, existeix la possibilitat de resoldre les equacions per cada<br />
un dels canals, o bé, fer la suma dels tres canals de color i utilitzar aquests valors per c1, c2, d2 i<br />
d3.<br />
35
36<br />
Aplicació de l’MLAA<br />
En aquest cas, l’autor decideix simplificar el càlcul mitjançant la suma dels tres canals i<br />
tractant-los com si tots tres tinguessin el mateix pes, doncs aquests valors només s’utilitzen per<br />
trobar hc i hd; L’assignació de colors es farà amb cada canal per separat.<br />
Un cop tinguem el punt d’intersecció de les dues formes, podrem processar-les. Per fer-ho,<br />
provarem tots els possibles candidats. Si els valors de hc i hd trobats es troben en l’ interval<br />
[0,1], el patró serà processat, en cas contrari s’ignorarà.<br />
Hem de tenir en compte una diferència important entre els possibles patrons a B&W i a<br />
color. A blanc i negre, si teníem una línia de discontinuïtats horitzontal, sabíem que com a<br />
màxim, trobaríem dues línies verticals que formessin un patró amb ella. Això és degut a que, al<br />
tenir només dos possibles valors (blanc o negre), quan un color acaba comença l’altre; en<br />
conseqüència, existeix un únic camí possible entre discontinuïtats.<br />
A color no és així. A color podem tenir diferents línies verticals que afectin a la nostra línia<br />
horitzontal. És per això que és important poder identificar quins patrons seran vàlids i quins no.<br />
En el cas que a una mateixa línia de separació es puguin formar diferents patrons vàlids, es<br />
processarà el primer patró trobat per cada un dels possibles tipus (dos patrons Z i dos patrons<br />
U). És a dir, si una línia pot formar per exemple 3 patrons U, processarà la primera que trobi per<br />
cada tipus i configuració (una U amb forma còncava i una U amb forma convexa).<br />
Amb aquest criteri, s’eviten càlculs innecessaris alhora que s’assegura la transició suau<br />
entre formes connectades.<br />
Aquesta seria l’explicació oficial que ens proporciona l’autor en el seu article per tal<br />
d’implementar aquesta segona versió en color. Malauradament, les seves indicacions basant-se<br />
en un cas particular, que precisament és el cas idèntic a la versió en blanc i negre, no ens ha<br />
permès desxifrar quina seria la manera més adequada per fer-ho en color.<br />
Recordem el cas específic que ens proposen com exemple, dues formes Z d’igual longitud:<br />
I les equacions que hem de solucionar per tal d’obtenir els valors de hc i hd, gràcies als<br />
quals podrem establir el punt d’intersecció de les formes adjacents:<br />
(hc – r) c1 + (1 – hc + r) c2 = (hd – r) d2 + (1 – hd + r) d3<br />
hc + hd = 1<br />
Aquestes equacions són necessàries per poder obtenir els valors de hc i hd en els casos que<br />
les formes no tinguin la mateixa longitud, i per tant, el seus valors siguin diferents.
Aplicació de l’MLAA<br />
Si r és la relació que existeix entre les dues bases del trapezoide, és cert que quan hc = hd,<br />
la relació entre les bases dels dos trapezoides serà la mateixa. En canvi, no serà de la mateixa<br />
manera quan hc ≠ hd, doncs els trapezoides seran de mides diferents, per tant tindrem dues r (una<br />
per cada trapezoide) amb valors diferents.<br />
En conclusió, haurem de resoldre una equació que conté una variable a la que no podem<br />
assignar un valor, ja que no sabem a quin valor en concret fa referència. En cas de no fer-ho,<br />
obtindríem uns resultats per hc i hd en funció de r, que tampoc ens permetrien seguir amb la<br />
mecànica proposada per l’autor.<br />
Un altre punt que l’autor no específica, és si aquest càlcul el farà servir només per<br />
descartar aquells patrons que no siguin vàlids, o si farà servir aquests valors com alçada exacta<br />
de l’aresta secundària a l’hora d’assignar el color al píxel.<br />
Donat que l’objectiu d’obtenir hc i hd era minimitzar les diferències de color entre formes, i<br />
que degut a la falta d’informació, no només no podem justificar la necessitat d’aquest pas sinó<br />
que tampoc podem realitzar-lo, hem decidit passar per alt aquesta convenció en la nostra<br />
implementació. Per tant, hem continuat aplicant la regla del punt mig que, tal com veurem més<br />
endavant, ens ha permès obtenir uns resultats similars als de l’autor.<br />
7.3 Limitacions<br />
La limitació més gran de l’MLAA és la seva incapacitat per gestionar característiques de la<br />
mida d’un píxel.<br />
Un bon exemple seria el cas de la Figura 62 de la comparativa, al capítol 9, on els<br />
quadrats més pròxims a la càmera es composen de múltiples píxels, per tant, l’MLAA els<br />
processarà correctament removent les altes freqüències de la imatge. En canvi, els quadrats de la<br />
part superior no seran fàcilment identificables. En no disposar d’informació sobre la geometria,<br />
no seran processats de forma correcta.<br />
Un altre exemple de la inacció de l’MLAA per a objectes molt petits o molt prims, és el de<br />
la Figura 111 on els cables i les antenes no han rebut cap tipus de correcció significativa.<br />
Tot i tractar-se d’un defecte més subtil que els anteriors, la gestió de les vores de la imatge<br />
és altre dels problemes que presenta l’MLAA, ja que no disposem de tota la informació<br />
necessària respecte als veïns. Aquest problema és comú en aquelles tècniques que només<br />
treballen amb una mostra per píxel.<br />
Un altre problema específic de l’MLAA és produeix a les animacions, doncs l’algorisme no<br />
pot controlar els canvis temporals que pateixen els contorns dels polígons a nivell de subpíxel,<br />
ja que no disposa de la informació geomètrica de l’escena.<br />
Donat que l’MLAA només utilitza la informació de la imatge resultant, en animacions on la<br />
càmera es mogui a nivell de subpíxel (extremadament lenta), podria succeir que imatges en<br />
diferents frames continguin el mateix tipus de patrons. En aquets cas, els canvis entre frames<br />
serien imperceptibles i les transicions entre un frame i l’altre no estarien suavitzades. A la<br />
pràctica, això no és perceptible si la resolució de sortida és més gran que 200x200 píxels [1].<br />
En imatges en color, tot i que dues imatges tinguin el mateix conjunt de patrons, podria<br />
resultar en correccions diferents, doncs l’MLAA depèn del valor dels colors de la imatge.<br />
Altra conseqüència de la falta d’informació sobre la geometria, és que l’MLAA pot<br />
suavitzar alguns angles que geomètricament no requerissin aquest tipus de correcció (per<br />
exemple, angles que en realitat són molt pronunciats). Tot i això, es tracta d’un defecte molt<br />
subtil i difícil de percebre a simple vista.<br />
MLAA també presenta problemes en el processament de text, doncs no distingeix el primer<br />
pla del fons i pot resultar en la distorsió de les lletres. Aquest efecte s’amplia quan la font<br />
original ja estava suavitzada per un antialiasing:<br />
37
38<br />
Aplicació de l’MLAA<br />
Figura 26. 1a fila: font 1 amb aliasing; 2a fila: font 2 amb antialiasing; 3a fila: MLAA<br />
sobre la font 1; 4a fila: MLAA sobre la font 2. Les mides de la font d’esquerra a dreta<br />
són: 24, 12, 8 i 6.[55]<br />
Bàsicament, l’MLAA intenta corregir el contorn del text i el pot distorsionar de tal manera<br />
que sigui difícil de llegir.
8. Implementació en C++<br />
8.1 B&W<br />
8.1.1 Estructures de dades<br />
En primer lloc, descriurem les estructures de dades utilitzades per a la implementació de<br />
l’algorisme:<br />
- MyLine: classe que encapsula les dades de cada línia de discontinuïtat. Es composa de<br />
index (enter), que indica la posició de la línia en la imatge; de v1 (enter) que és el<br />
vèrtex origen i de v2 (enter) que és el vèrtex final.<br />
- MyPattern: Classe que encapsula els tres tipus de patrons possibles: L, U i Z.<br />
o MyL: classe que representa el patró L. Està format per v0, v1 i v2, enters que<br />
indiquen en quin número de línia es troba cada un dels vèrtexs; i per p i s,<br />
també enters que indiquen el número de línia de l’aresta primària i secundària<br />
respectivament.<br />
o MyU: classe que representa el patró U. Està format per v0 i v2, enters que<br />
indiquen en quin número de línia es troba cada un dels vèrtexs; i per p i s,<br />
altres enters que indiquen el número de línia de l’aresta primària i secundària<br />
respectivament.<br />
o MyZ: classe que representa el patró Z. Està format per v0 i v2, enters que<br />
indiquen en quin número de línia es troba cada un dels vèrtexs; i per p, s1 i<br />
s2, enters que indiquen el número de línia de l’aresta primària i les arestes<br />
secundàries.<br />
- MyImage: classe que encapsula les dades de la imatge amb les seves dimensions, les<br />
seves discontinuïtats, el valor dels píxels i els patrons. Es composa dels següents<br />
atributs:<br />
o x i y: enters que emmagatzemen les dimensions de la imatge.<br />
o pixels: vector de double que emmagatzema el valor dels píxels de tota la<br />
imatge.<br />
o rows: vector de vectors del tipus MyLine que emmagatzemarà les línies de<br />
discontinuïtat per cada fila. Necessitem un vector de MyLine, per<br />
emmagatzemar varies línies de discontinuïtat en una mateixa fila; i necessitem<br />
que hi hagi un d’aquests per cada una de les files de la imatge. Per aquest<br />
motiu tindrem un vector de vectors MyLine per cada imatge.<br />
o columns: el mateix tipus que rows, però orientat a les columnes de la imatge.<br />
o rL: vector del tipus MyL. Emmagatzemarà tots els patrons de tipus L que es<br />
trobin a les files de la imatge.<br />
o cL: el mateix tipus que rL, però orientat a les columnes de la imatge.<br />
o rU: vector del tipus MyU. Emmagatzemarà tots els patrons de tipus U que es<br />
trobin a les files de la imatge.<br />
o cU: el mateix tipus que rU, però orientat a les columnes de la imatge.<br />
o rZ: vector del tipus MyZ. Emmagatzemarà tots els patrons de tipus Z que es<br />
trobin a les files de la imatge.<br />
o cZ: el mateix tipus que rZ, però orientat a les columnes de la imatge.<br />
39
40<br />
8.1.2 Explicació detallada de la implementació de l’algorisme en blanc i negre<br />
Mètode principal<br />
Implementació en C++<br />
L’algorisme comença carregant una imatge en blanc i negre en format TGA. A través<br />
d’una crida al mètode read(), crearem un objecte MyImage de nom im on emmagatzemarem<br />
les dimensions de la imatge, i el valor dels seus píxels (0 o 1).<br />
Al mateix temps, creem un altre objecte MyImage, copia de l’original que anomenarem<br />
alias. Aquesta imatge és la que utilitzarem per visualitzar les zones amb aliasing que seran<br />
corregides.<br />
A continuació, es realitza una crida al mètode findDiscontinuities() que<br />
s’encarrega de trobar les discontinuïtats entre píxels de la imatge.<br />
Seguidament, el mètode identifyPattern()s’encarrega d’identificar els patrons<br />
existents a partir de les discontinuïtats trobades.<br />
Finalment, el mètode blendColors()processa els patrons detectats i assigna un color a<br />
cada un dels píxels que els composen.<br />
Per acabar, el mètode writeBW() guardarà la nova imatge corregida en format TGA.<br />
Seguidament, el mètode writeAlias()processarà l’objecte alias, pintant de color vermell<br />
aquelles zones que requereixen correcció. A continuació guardarà la imatge resultant en format<br />
TGA.<br />
Finalment, s’alliberarà la memòria i acabarà l’execució. Com a sortida de l’execució<br />
obtindrem dues imatges.<br />
La primera serà la imatge resultant d’aplicar l’MLAA. La segona serà la imatge original en<br />
blanc i negre, amb les zones que requereixen correcció marcades de color vermell.<br />
Cerca de discontinuïtats<br />
El mètode findDiscontinuities() s’encarrega de comprovar, per cada parell de<br />
píxels adjacents, si tenen el mateix color o són diferents. Aquesta cerca es realitzarà tant per<br />
files, com per columnes. Detallarem el procés de les files.<br />
Crearem un objecte MyLine, que anirem instanciant cada cop que afegim una línia nova.<br />
Els valors dels seus atributs (index, v1 i v2) estaran inicialitzats a -1. D’aquesta manera, serà<br />
possible distingir quan estem processant amb una línia nova i quan es tracta d’una línia que<br />
havíem descobert.<br />
A continuació, per cada una de les files, anirem comprovant cada un dels píxels que les<br />
composen, que correspon a cada una de les columnes de la imatge (j), si existeix alguna<br />
diferència amb el píxel de la fila anterior que es troba en la mateixa posició j. En cas de ser<br />
així, s’establirà una discontinuïtat entre els dos píxels.<br />
Haurem de controlar quan detectem una línia nova, o bé, quan una línia que estàvem<br />
processant ha arribat a la fi (a la posició j–1 hi havia una discontinuïtat que a la posició j ja no<br />
hi és).<br />
Al mateix temps que emmagatzemem les discontinuïtats al vector rows, anirem deixant<br />
constància d’aquestes diferències a l’objecte alias. Per aconseguir-ho, per cada píxel que<br />
sigui diferent al seu adjacent, posarem -1 el seu valor a la imatge alias. Per tant, a l’hora de<br />
guardar aquesta imatge pintarem de color vermell tots els píxels que estiguin a -1. D’aquesta<br />
manera tindrem les zones amb aliasing ben senyalitzades.
Implementació en C++<br />
Funció findRowDiscontinuities(im: MyImage) no retorna res;<br />
fper;<br />
Ffunció;<br />
line: MyLine;<br />
i: enter;<br />
j: enter<br />
per i:= 1 fins i< im.x fer<br />
per j:= 1 fins j< im.y fer<br />
//hem trobat una discontinuïtat<br />
si im(i,j) != im(i-1,j) llavors<br />
fper;<br />
//es tracta d’una línia que ja havíem iniciat<br />
si line->v1 != -1 llavors<br />
line->v2++;<br />
//es tracta d’una línia nova<br />
sino<br />
fsi;<br />
line->v1:= j;<br />
line->v2:= j+1;<br />
line->index:= i;<br />
//no hem trobat discontinuïtat<br />
Sino<br />
//teníem una línia que ha arribat a la fi<br />
si line->v1 != -1 llavors<br />
line->v2:= j;<br />
im.rows[i].push_back(line);<br />
fsi;<br />
fsi;<br />
//marquem la línia a corregir a alias<br />
markAlias(line,0);<br />
//es tracta d’una línia que arriba fins a la vora de la<br />
//imatge, creua la última columna<br />
si line->v1 != -1 llavors<br />
im.rows[i].push_back(line);<br />
fsi;<br />
Finalment, es repetirà tot el procés per les columnes de la imatge.<br />
Identificació de patrons<br />
El mètode identifyPattern()s’encarrega de localitzar els patrons L, U i Z existents<br />
a partir de les discontinuïtats trobades. Aquest procés també es realitzarà tant per files com per<br />
columnes. A continuació, el detall de les files.<br />
Crearem tres objectes MyL, MyU i MyZ, que anirem instanciant cada cop que trobem un<br />
patró d’aquest tipus. Els valors dels seus atributs s’aniran assignant durant tot el procés de la<br />
localització.<br />
41
42<br />
Implementació en C++<br />
Per cada una de les línies de discontinuïtat, es comprovarà en primer lloc, de quin tipus de<br />
patró es tracta. Si un dels seus extrems v1 o v2 pertany a la vora de la imatge, es tractarà d’un<br />
patró L. En cas contrari, sabrem que es tracta d’una U o una Z.<br />
Quan tinguem un patró L, identificarem si pertany a la vora esquerra de la imatge (inici) o<br />
a la dreta (final). Un cop sabem la direcció que té la L, podrem assignar valors a v0, v1 i v2.<br />
Per obtenir l’aresta primària p i la secundària s, haurem de saber la orientació de la L. Per<br />
aconseguir-ho, utilitzarem el punt v1 (que no pertany a la vora) i comprovarem, per la columna<br />
v1, si l’aresta secundària es troba en la filera superior o en la inferior. Finalment, afegirem la<br />
nova L al vector rL.<br />
En cas que el patró no sigui una L, haurem de calcular en quina direcció es troben les<br />
arestes secundàries. Ho farem de la mateixa manera que amb L, excepte que ara utilitzarem els<br />
punts v1 i v2, per obtenir les arestes secundàries s1 i s2.<br />
Un cop tinguem s1 i s2, comprovarem si són iguals. Si és així es tracta d’un patró U. En<br />
cas contrari es tractarà d’un patró Z. Emmagatzemarem els patrons als seus vectors<br />
corresponents im.rU o im.rZ.<br />
Funció identifyRowPattern(im: MyImage) no retorna res;<br />
L: MyL;<br />
U: MyU;<br />
Z: MyZ;<br />
v1: enter;<br />
v2: enter;<br />
s1: enter;<br />
s2: enter;<br />
per i:= 1 fins i< im.rows.size() fer<br />
per j:= 1 fins j< rows[i].size()fer<br />
si im.rows[i][j]!= NULL llavors<br />
v1:= im.rows[i][j]->v1; //aresta secundària 1<br />
v2:= im.rows[i][j]->v2; //aresta secundària 2<br />
//si v1 o v2 pertanyen al a vora és un patró L<br />
si esL(v1,v2) llavors<br />
//mirem a quina vora pertany la L<br />
detectaPosició();<br />
detectaOrientació();<br />
//asignem valors i creem nova L<br />
im.rL.push_back(L);<br />
sino<br />
s1:=posicioArestaSecundaria(v1);<br />
s2:=posicioArestaSecundaria(v2);<br />
si s1 == s2 llavors //és una U<br />
//asignem valors i creem nova U<br />
im.rU.push_back(U);<br />
sino<br />
//asignem valors i creem nova Z<br />
im.rZ.push_back(Z);<br />
fsi;<br />
fsi;<br />
fsi;<br />
fper;<br />
fper;<br />
Ffunció;<br />
Finalment, repetirem el procés per les columnes.
Implementació en C++<br />
Assignació de colors<br />
El mètode blendColors() és el que, finalment, assigna un nou color a cada un dels<br />
píxels que formen part d’un patró.<br />
Per a cada tipus de forma L, U i Z, es processarà primer el vector de files corresponent:<br />
im.rL, im.rU, im.rZ. A continuació es processaran les columnes amb im.cL, im.cU,<br />
im.cZ.<br />
El cas de les L és el més senzill, doncs només s’ha de processar aquella forma. En canvi,<br />
amb les U i les Z, s’hauran de dividir per la meitat per obtenir dues formes L, que són les que<br />
processarem.<br />
La única diferència rellevant entre els tres mètodes (colorL(), colorU() i<br />
colorZ()), és la gestió de la forma de les L i de la seva longitud.<br />
A colorL() només tindrem una forma L, i la seva longitud no variarà. A colorU()<br />
tindrem dues formes L simètriques entre elles; en canvi a colorZ() tindrem dues formes L<br />
oposades. Les L que hagin sorgit de patrons U o Z, tindran la meitat de la longitud del patró<br />
original.<br />
La longitud de la L que tractem és important, doncs si aquesta longitud és parell, en<br />
connectar el punt mig de l’aresta secundària amb l’extrem lliure de l’aresta primària, les cel·les<br />
quedaran dividides de forma sencera; si en canvi la longitud és senar, la última cel·la quedarà<br />
dividida en dos, la meitat per cada forma L resultant.<br />
Cada una de les cel·les quedarà dividida en forma de trapezoide, amb l’excepció de la<br />
última que tindrà forma de triangle. Això serà vàlid per a tots els patrons.<br />
Al marge d’aquestes diferències, el funcionament serà exactament el mateix: trobar la<br />
orientació i la direcció de la L que tractem, identificar la seva longitud per saber quants píxels<br />
hem de processar i, finalment, executar una sèrie de càlculs que ens permetran assignar un nou<br />
color a cada píxel.<br />
Els càlculs necessaris per trobar el nou color són la mida de les bases de cada un dels<br />
trapezoides que formen la L, i el càlcul de la seva àrea.<br />
Al començament només tenim la mida d’una de les bases del trapezoide adjacent a l’aresta<br />
secundària, que sabem que és 0,5; i la longitud de la L.<br />
Per tant, com ja havíem explicat al capítol anterior, per poder calcular les noves bases<br />
farem servir la regla de tres, amb la qual obtindrem un nou valor per cada píxel que avancem.<br />
Enlloc de calcular l’àrea de cada trapezoide que trobem a partir de les seves bases, hem<br />
optimitzat la tasca: calcularem l’àrea del supertriangle inicial, i li restarem l’àrea del triangle<br />
que es forma a partir de la cel·la següent. Guardarem aquest resultat com a “àrea anterior” i<br />
repetirem el procés fins al triangle final.<br />
Les dades necessàries per a calcular-ho d’aquesta manera són les mateixes, i ens permet no<br />
haver de diferenciar si hem de calcular l’àrea dels trapezoides o la del triangle final.<br />
L’ordre de procés de la L serà, des de la cel·la adjacent a l’aresta secundària, fins a<br />
l’extrem final de l’aresta primària, on trobem el triangle final.<br />
Cada cop que obtinguem una base nova, calcularem l’àrea del nou trapezoide, i cridarem al<br />
mètode setNewColor().<br />
43
44<br />
Funció colorL(im: MyImage) no retorna res;<br />
Index1: enter; Index2: enter; opposat: enter;<br />
area: real; areaT: real; areaNext: real;<br />
newHeight: enter; oldHeight: enter; newLength: enter;<br />
per i:= 1 fins i< im.rL.size() fer<br />
fper;<br />
Ffunció;<br />
index1:= orientacioL();<br />
index2:= direccioL();<br />
oposat:= posicioOposat();<br />
areaT:= areaSupertriangle();<br />
newLength:= longitudL -1;<br />
oldHeight:= 0.5;<br />
per j:= 0 fins j
Implementació en C++<br />
8.1.3 Decisions<br />
En la versió en blanc i negre de l’algorisme, hem hagut de prendre un parell de decisions<br />
que tenen a veure amb els resultats que ens mostra l’autor en la imatge d’exemple.<br />
Aquestes decisions estan relacionades amb les formes U de longitud un píxel, i amb la<br />
existència o no de sobreescriptura (overlap) de dades. Donat que l’autor no dona cap informació<br />
exacte al respecte, ens hem basat en la realització de diferents proves.<br />
Figura 27. Figura original amb aliasing<br />
En el cas de les U de longitud 1, si tenim en compte la figura anterior, tal i com entenem<br />
l’algorisme, considerem que el píxel II-G es veurà afectat per 4 patrons U. Dos per les files i dos<br />
per les columnes, en totes les seves possibles combinacions.<br />
Veiem que hi ha altres casos amb formes U de longitud 1: el píxel I-C i el píxel VI-G.<br />
Figura 28. Figura original amb les U de longitud 1 marcades<br />
Si tenim en compte que cada patró U es descomposará en dues formes L, donat que la<br />
longitud de l’aresta primària de la U és 1, l’aresta primària de cada L tindrà una mida de 0,5.<br />
Figura 29. Píxel II-G, on coincideixen 4 patrons U<br />
45
46<br />
Implementació en C++<br />
Un cop realitzem la connexió entre el punt mig de l’aresta secundària i l’extrem de l’aresta<br />
primària per a tots els patrons, veurem que l’únic fet destacable és que es sobreescriurà<br />
informació, ja que tot el procés es realitza sobre un sol píxel.<br />
Figura 30. Resultat obtingut per la nostra implementació de l’MLAA<br />
L’autor en canvi, processa aquesta forma de tal manera que afecta als píxels del seu<br />
voltant.<br />
Figura 31. Resultat obtingut per la implementació de l’autor<br />
Donat que no hem aconseguit desxifrar de quina manera tracta aquests píxels aïllats, ja que<br />
és tracta d’un cas excepcional que només succeeix quan tenim una U de longitud 1, i havent<br />
comprovat que el impacte visual resultant de no prendre cap mesura especial és nul, hem decidit<br />
aplicar la norma general en la que només es corregirà un píxel.<br />
Altre punt en el que hem detectat una alteració del que seria el plantejament de<br />
l’algorisme, és a l’hora de processar els patrons L que corresponen a la vora de la imatge.<br />
Estem suposant que l’autor no processa els patrons L de la vora ja que, després d’un<br />
conjunt de proves, hem detectat que les imatges resultants del nostre algorisme presenten<br />
diferències notables quan les processem.<br />
En canvi, si només processem els patrons U i L, les vores de les imatges són pràcticament<br />
idèntiques a les de l’autor.<br />
Visualment, podem comprovar que el fet de processar els patrons L pot provocar que en<br />
una imatge que mostri parcialment una silueta es corregeixi la vora de forma equivocada, doncs<br />
la imatge resultant podria suggerir que el contorn de la silueta forma part de la imatge quan en<br />
origen no era així. És a dir, podria trencar la continuïtat de la imatge, tal com passa a la primera<br />
imatge de la Figura 32.
Implementació en C++<br />
Figura 32. Comparativa de executar la nostra implementació de l’MLAA i la de l’autor.<br />
Podem veure que la segona i tercera columna d’imatges tracten la vora de la mateixa<br />
manera (sense processar les L). En canvi la primera, tot i que dona millor resultat en la zona<br />
ressaltada en vermell, processa la vora de la resta de la imatge creant una diferència respecte a la<br />
imatge original: dona a entendre que la silueta està mostrant part del seu contorn en la part<br />
esquerra de la imatge.<br />
Entenem que d’aquesta manera no només s’està corregint l’aliasing si no que s’estan<br />
produint canvis rellevants. Donat que considerem que alterar la continuïtat de la imatge és més<br />
perceptible a l’ull humà que l’aliasing que es produeix a les vores, en la nostra implementació<br />
de l’algorisme per a blanc i negre tampoc processarem els patrons L.<br />
8.2 Color<br />
8.2.1 Estructures de dades<br />
Les estructures utilitzades en la versió en color de l’algorisme són molt similars a les que<br />
s’utilitzen en blanc i negre, amb alguna petita diferència. Les classes MyLine i MyPattern,<br />
són exactament les mateixes. En canvi tindrem dues noves classes:<br />
- RGB: és una classe que encapsula els tres enters r, g i b. Aquestes variables guardaran<br />
el valor de cada un dels canals d’un píxel en RGB.<br />
- MyCImage: és una variant de la classe MyImage. La única diferència que hi ha entre<br />
les dues classes es troba en l’atribut pixels:<br />
o pixels: és un vector del tipus RGB. Contindrà el valor de cada un dels píxels<br />
de la imatge en color (RGB).<br />
47
48<br />
o x i y: enters.<br />
o rows: vector de vectors del tipus MyLine.<br />
o columns: vector de vectors del tipus MyLine.<br />
o rL: vector del tipus MyL.<br />
o cL: : vector del tipus MyL.<br />
o rU: vector del tipus MyU.<br />
o cU: vector del tipus MyU.<br />
o rZ: vector del tipus MyZ.<br />
o cZ: vector del tipus MyZ.<br />
- MyLine: classe que encapsula a index (enter), v1 (enter) i v2 (enter).<br />
Implementació en C++<br />
- MyPattern: Classe que encapsula els tres tipus de patrons possibles: L, U i Z.<br />
o MyL: classe que representa el patró L, formada per v0, v1, v2, p i s (enters).<br />
o MyU: classe que representa el patró U, formada per v0, v2, p i s (enters).<br />
o MyZ: classe que representa el patró Z, formada per v0, v1, v2, p, s1 i s2<br />
(enters).<br />
8.2.2 Explicació detallada de la implementació de l’algorisme en color<br />
Mètode principal<br />
L’algorisme comença carregant una imatge en color en format TGA. Crearem 4 objectes<br />
MyCIMage, de nom im, im2, im3 i alias. En aquests objectes, mitjançant el mètode<br />
read(), emmagatzemarem les dimensions de la imatge i el valor del seus píxels per cada un<br />
dels canals RGB.<br />
La imatge im és la imatge original sobre la que processarem tots els passos de l’algorisme.<br />
Les imatges im2 i im3 s’utilitzaran per no sobreescriure dades quan assignem colors als píxels.<br />
La imatge alias, tal com es feia a la versió en blanc i negre, s’utilitzarà per visualitzar<br />
les zones amb aliasing que seran corregides.<br />
A continuació, es realitza una crida al mètode convertBW() que transformarà la imatge<br />
en color alias, a una imatge en blanc i negre. D’aquesta manera, farem ressaltar les zones<br />
d’aliasing en color vermell sense que hi hagi cap interferència amb els colors reals de la imatge.<br />
La resta de procés en el mètode principal és la mateixa que per la versió B&W: es crida al<br />
mètode findDiscontinuities() per tal de trobar les discontinuïtats entre píxels de la<br />
imatge; es realitza la crida al mètode identifyPattern() que identificarà els patrons<br />
existents a partir de les discontinuïtats trobades; i finalment, es cridarà al mètode<br />
blendColors() que processarà els patrons detectats i assignarà un color a cada un dels<br />
píxels que els composen.<br />
Per acabar, el mètode writeBW() guardarà la nova imatge corregida i el mètode<br />
writeAlias()processarà l’objecte alias, pintant de color vermell aquelles zones que<br />
requereixen correcció. Ambdues imatges es guardaran en format TGA. S’alliberarà memòria i<br />
acabarà l’execució donant com a resultat la imatge corregida i la imatge en blanc i negre que<br />
mostra les zones amb aliasing de color vermell.
Implementació en C++<br />
Cerca de discontinuïtats<br />
El mètode findDiscontinuities() és exactament el mateix que hem utilitzat a la<br />
versió en blanc i negre, amb una petita diferència: la forma com comparem colors.<br />
En aquesta part, l’autor ens proposa agafar els 4 bits més significatius de cada canal RGB,<br />
i comparar-los. En cas d’existir alguna diferència per qualsevol dels canals es considerarà que<br />
són colors diferents. En cas contrari, són iguals.<br />
Com havíem avançat, en la implementació en color hem hagut d’introduir alguns canvis<br />
per tal d’obtenir un resultat satisfactori. El primer canvi s’ha produït en aquest pas.<br />
La forma amb que l’autor selecciona quins colors són diferents i quins no, ha resultat molt<br />
problemàtica per la nostra implementació.<br />
Suposem dos colors RGB:<br />
Figura 33. Exemple de colors numèricament diferents<br />
Els canals G i B són idèntics. Però els canals R tenen la següent codificació binària:<br />
01110000 i 01101111.<br />
Si tenim en compte els 4 bits més significatius, segons el mètode proposat per l’autor, els<br />
haurem de tractar com a colors diferents: 0111 i 0110.<br />
Per tant, tot i tractant-se d’una diferència d’una unitat en un canal, diferència que no és<br />
perceptible per l’ull humà, aquest mètode la detectarà i marcarà una discontinuïtat entre els dos<br />
colors.<br />
Uns quants píxels aïllats on s’estableixin discontinuïtats que no són significatives (com<br />
l’exemple), no representaria cap problema, doncs reassignar colors en aquella zona no<br />
provocarà canvis significatius.<br />
El problema es produeix quan aquests colors “diferents” es troben en zones on realment<br />
s’està produint aliasing. Si aquestes diferències subtils es barregen amb diferències reals,<br />
s’estaran creant patrons que no es corresponen a la realitat de la imatge, doncs a l’hora d’escollir<br />
quines línies formen cert patró no es distingiran unes discontinuïtats de les altres: per<br />
l’algorisme totes les diferències són iguals d’importants.<br />
El resultat de processar una imatge d’aquesta manera pot produir que algunes zones amb<br />
aliasing es quedin sense corregir, ja que s’estarà corregint altra zona que, degut als canvis de<br />
color tan subtils, no serem capaços d’apreciar.<br />
Per tant, donat que aquest mètode no ens pot garantir un bon resultat en tots els casos,<br />
l’hem descartat i hem optat un altre molt més efectiu: el càlcul de la distància euclidiana.<br />
49
50<br />
Implementació en C++<br />
El càlcul de la distància euclidiana, ens permetrà especificar un llindar a partir del qual<br />
establirem quan considerem que dos píxels són diferents. La distància euclidiana es calcula amb<br />
la següent expressió:<br />
Per tant, quan la distància sigui més gran que el llindar, es considerarà que són colors<br />
diferents. En cas contrari, seran colors iguals.<br />
El valor del llindar s’ha escollit analitzant els resultats obtinguts amb diferents imatges. Per<br />
exemple:<br />
Error quadràtic mitjà (MSE) 2xMSAA 4xMSAA 8xMSAA<br />
Llindar = 40 50.4224 34.6535 62.3057<br />
Llindar = 60 45.0752 28.4326 56.4061<br />
Llindar = 65 44.6881 28.1375 56.0789<br />
Llindar = 70 44.718 28.1334 56.0535<br />
Llindar = 75 44.7821 28.2095 56.1653<br />
Llindar = 80 44.7705 28.2264 56.1832<br />
Llindar = 100 45.0839 28.6263 56.6313<br />
Figura 34. MSE de la imatge en escala de grisos de la Figura 77, per a diferents llindars<br />
Per a imatges en escala de grisos s’utilitzarà un llindar de 70.<br />
En canvi, per a les imatges en color ens hem basat en la qualitat de la imatge que<br />
percebem, doncs hem comprovat que el valor de l’error no sempre acompanya a la qualitat de la<br />
imatge resultant. En aquest cas l’error pateix petites variacions per cada un dels canals, però són<br />
tots valors molt similars:<br />
Error quadràtic mitjà (MSE) Autor<br />
R G B<br />
Llindar = 40 49.9683 29.2705 8.51368<br />
Llindar = 50 52.249 30.7255 8.71822<br />
Llindar = 60 51.4641 30.216 8.53027<br />
Llindar = 70 54.1101 31.8242 8.87037<br />
Llindar = 80 54.7732 32.3782 8.99488<br />
Llindar = 90 57.7813 34.3805 9.55004<br />
Figura 35. MSE de la imatge en color de la Figura 116, per a diferents llindars<br />
Per a imatges en color s’utilitzarà un valor de 80.<br />
Identificació de patrons<br />
El mètode identifyPattern() d’aquesta versió en color, és una ampliació del que ja<br />
teníem en blanc i negre. La diferència principal entre ambdós mètodes, és que en B&W<br />
sabíem que quan teníem una aresta primària i buscàvem la secundària, només trobaríem<br />
una per formar un sol patró. En aquest cas, ja no és així.<br />
Al color podrem tenir diferents línies verticals que facin d’aresta secundària, de manera<br />
que tinguem diferents patrons per aquella aresta primària.<br />
En aquest punt, tenim la següent diferència significativa de la nostra implementació amb la<br />
de l’autor. Com ja havíem dit, l’autor proposa una sèrie de càlculs que, per la manca
Implementació en C++<br />
d’informació, no és possible dur a terme. Per tant, com no hem trobat cap argument en contra, a<br />
l’hora de connectar les arestes primàries amb les secundàries, utilitzarem el punt mig de les<br />
secundàries, tal i com hem fet en B&W.<br />
En aquesta implementació, no descartarem patrons en sí, però sí que escollirem aquells de<br />
longitud més gran. A partir d’una línia de discontinuïtat, buscarem totes les arestes secundàries<br />
possibles que siguin perpendiculars als seus extrems.<br />
Per tant, si tenim un línia de discontinuïtat que entremig té arestes secundàries, no es<br />
tindran en compte, doncs estarem creant un patró més gran que ja inclou aquells píxels.<br />
Quan es processin els patrons de forma vertical (si estàvem mirant les files, per exemple),<br />
es processaran els píxels de l’aresta secundària que havíem trobat i afectaran als mateixos píxels<br />
del patró que hem decidit no crear.<br />
En aquest pas també ens hem diferenciat de l’autor que fa una proposta més arbitrària:<br />
processar el primer patró trobat per cada un dels possibles tipus (dos patrons Z i dos patrons U).<br />
Cal afegir, que abans d’establir aquest mètode s’han realitzat altres proves que no han<br />
donat un resultat tan bo. Una d’elles era processar el patró més llarg de tots els tipus possibles<br />
(dos Z i dos U), que a diferència del mètode actual, podien tenir diferent mida els uns dels<br />
altres: s’escollia la U còncava de més longitud, etc. El resultat obtingut però, no va ser de la<br />
qualitat esperada.<br />
Altre mètode va ser processar absolutament tots els patrons trobats, el resultat va ser pobre<br />
tant per qualitat com per rendiment.<br />
Per tant, a la vista dels resultats obtinguts, considerem que la nostra opció és la més<br />
adequada.<br />
D’aquesta manera, la diferència principal del mètode identifyPattern() en B&W<br />
amb l’actual, és la possibilitat de crear múltiples patrons alhora.<br />
Quan detectem la orientació del patró, comprovarem quantes arestes secundàries tenim. En<br />
cas de tenir dos, mirarem quans patrons possibles podem obtenir i els crearem.<br />
Ara no diferenciarem de la mateixa manera el tipus de patró que construirem. Mirarem si<br />
és una L o si serà un patró compost (U o Z). En cas de ser una L, comprovarem si és una o seran<br />
dues. En cas de ser un patró compost, mirarem quantes arestes secundàries tenim i quines<br />
combinacions podem fer.<br />
Per exemple, a la Figura 36, el primer cas és una aresta primària amb una secundària amb<br />
cada extrem que forma una U.<br />
El segon mostra el cas en que, en un extrem hem trobat una aresta secundària i en l’altre<br />
hem trobat dos, per tant haurem de crear els patrons possibles amb totes aquestes arestes: un<br />
patró U i un patró Z.<br />
El tercer exemple és el més elaborat, doncs hem trobat dos arestes secundàries a cada<br />
extrem, per tant, tindrem tots els patrons possibles: dos patrons U i dos patrons Z.<br />
L’últim cas, és un altre exemple senzill, on només tenim una aresta secundària per cada<br />
extrem, i per tant, tindrem un patró Z.<br />
51
52<br />
Implementació en C++<br />
Figura 36. Exemple de procés de formes a partir de les arestes obtingudes<br />
Un cop més, repetirem el procés tant per files com per columnes.<br />
Assignació de colors<br />
L’assignació de colors es realitzarà amb el mètode setNewColor()que serà el mateix<br />
que a la versió blanc i negre, però calculant cada canal RGB per separat.<br />
Funció setNewRowColor(im: MyImage, i: enter, j: enter, area: float,<br />
opposite: enter) no retorna res;<br />
Ffunció;<br />
newColor: enter;<br />
oldColor: enter;<br />
oppColor: enter;<br />
oldColor:= im(i,j).r;<br />
oppColor:= im(i,opposite).r;<br />
newColor:= (1 - area) * oldColor + area * oppColor;<br />
im(i,j).r:= newColor;<br />
oldColor:= im(i,j).g;<br />
oppColor:= im(i,opposite).g;<br />
newColor:= (1 - area) * oldColor + area * oppColor;<br />
im(i,j).g:= newColor;<br />
oldColor:= im(i,j).b;<br />
oppColor:= im(i,opposite).b;<br />
newColor:= (1 - area) * oldColor + area * oppColor;<br />
im(i,j).b:= newColor;
Implementació en C++<br />
8.3 Codi per comparar<br />
Per tal de comparar els resultats obtinguts en la nostra implementació amb d’altres<br />
imatges, hem creat un petit programa que s’encarrega de calcular la imatge diferència i l’error<br />
quadràtic mig (MSE).<br />
D’aquesta manera, podrem comprovar quin grau de correcció té el nostre algorisme<br />
respecte a d’altres tan de forma visual com de forma numèrica.<br />
La imatge diferència és un càlcul senzill, doncs només cal restar el valor dels píxels d’una<br />
imatge respecte a l’altre. L’únic requeriment és que ambdues imatges tinguin la mateixa mida.<br />
L’error quadràtic mesura la quantitat de diferència que té en una imatge respecte a una<br />
altra. És calcula de la següent manera:<br />
Figura 37. Expressió per calcular l’MSE (Mean Square Error) [8]<br />
On N és el número total de píxels de la imatge.<br />
53
9. Comparativa de resultats<br />
A continuació, presentarem una sèrie d’imatges a les quals hem aplicat l’MLAA. Algunes<br />
de les imatges s’han comparat amb l’SSAA i altres amb l’MSAA. El procés en tots els casos és el<br />
mateix: partim d’una imatge amb aliasing (NAA – no antialiasing), la corregim amb l’MLAA i<br />
comparem la imatge resultant amb la millor imatge de l’antialiasing corresponent (MSAA o<br />
SSAA).<br />
Aquesta comparativa ens donarà el valor de l’error quadràtic mitjà i una imatge diferència.<br />
A efectes de poder reconèixer les zones on s’ha aplicat la correcció, hem invertit la imatge<br />
diferència i posteriorment, l’hem multiplicat fins a fer-la visible. D’aquesta manera es pot tenir<br />
una visió detallada de totes les zones de la imatge que presentin alguna diferència respecte a<br />
l’altra, independentment del grau d’aquesta.<br />
Cal destacar, que en el càlcul de l’error quadràtic mitjà, hem afegit el càlcul de l’error per<br />
la imatge resultant de la implementació de l’autor amb l’antialiasing de més alta qualitat<br />
(8xMSAA o 16xSSAA). D’aquesta manera, confirmem que els resultats obtinguts en les nostres<br />
proves no es veuen afectats per les diferències entre la nostra implementació i la de l’autor, ja<br />
que s’obtenen valors molts similars. S’analitzarà amb més detall en l’apartat 9.13.<br />
Per tal de realitzar la comparativa, diferenciarem els resultats obtinguts amb l’algorisme<br />
per a imatges en blanc i negre dels de les imatges en color. Les hem classificat de la següent<br />
manera:<br />
- B&W:<br />
- Color:<br />
o Siluetes en blanc i negre:<br />
Flors<br />
Nena<br />
o Patrons de freqüència variable<br />
o Potrace<br />
o Escàner<br />
Cercles<br />
Checker 1<br />
Checker 2<br />
o Imatges creades amb un exemple de DirectX<br />
o Imatges en Maya<br />
o Imatges del Half-Life 2<br />
Imatge 1<br />
Imatge 2<br />
Imatge 3<br />
Finalment, compararem algunes imatges resultants de la nostra implementació de l’MLAA<br />
amb les resultants de la demo de l’autor. D’aquesta manera, apreciarem el grau d’equivalència<br />
entre unes i altres.<br />
En aquest cas, utilitzarem dues imatges:<br />
- Color: imatge de la Fada (exemple de l’article original).<br />
- B&W: silueta de la nena.<br />
- Imatge 1 del Half-Life 2.<br />
55
56<br />
9.1 Siluetes en blanc i negre: flors<br />
Comparativa de resultats<br />
A la Figura 38 tenim la silueta en blanc i negre d’unes flors sobre una petita superfície.<br />
Aquesta escena ha estat renderitzada amb Maya amb un supersampling de 4 i 16 mostres per<br />
píxel. La resolució de la imatge és 220x220, i és una escena totalment en blanc i negre.<br />
Comprovem que l’MLAA detecta tot el contorn de la silueta com a zona a corregir.<br />
A la Figura 39, en comparar el 4xSSAA amb l’MLAA veiem que, a simple vista, l’MLAA<br />
produeix un contorn igual de suavitzat que el 4xSSAA però més definit, ja que el contorn del<br />
supersampling està força emborronat. Es pot veure amb més detall en Figura 41.<br />
També podem apreciar algunes zones, com la part superior de la muntanya, que l’MLAA<br />
ha corregit correctament i el supersampling de 4x no. Podem observar-ho amb més detall en la<br />
Figura 42.<br />
Tot i que l’MLAA proporcioni (a simple vista) una imatge de millor qualitat mantenint la<br />
definició de la silueta i eliminant la majoria de l’aliasing, fins i tot quan el 4xSSAA no ho fa, el<br />
fet que el seu contorn no es trobi tan difuminat produeix que, numèricament, l’MSE de l’MLAA<br />
sigui superior al del 4xSSAA (Taula 1.<br />
A la Figura 40 en canvi, en comparar l’MLAA amb el 16xSSAA, comprovem que ara el<br />
resultat del supersampling ens mostra un contorn igual de difuminat que el 4x però molt més<br />
suavitzat, doncs han desaparegut els últims jaggies que restaven de la imatge original.<br />
L’error quadràtic mitjà de la Taula 1. ens indica la diferència entre les diferents imatges.<br />
Podem comprovar-ho visualment a les imatges de la Figura 39 i la Figura 40.<br />
MSE NAA - 4xSSAA - MLAA - Autor -<br />
16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />
B&W 384.244 3.42862 217.865 211.745<br />
Taula 1. Error quadràtic mitjà (MSE) de la silueta B&W de les flors<br />
Per tant, la relació de l’error entre les diferents imatges és:<br />
MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />
D’aquí podem extreure que l’MSE de l’MLAA és superior al 4xSSAA, tot i que de forma<br />
visual siguin imatges equivalents: ambdues presenten avantatges respecte a l’altra.
Comparativa de resultats<br />
9.1.1 NAA i MLAA<br />
Figura 38. Silueta B&W: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a<br />
corregir; 3 - Imatge resultant de la correcció amb l’MLAA.<br />
57
58<br />
9.1.2 4xMSAA<br />
Comparativa de resultats<br />
Figura 39. Silueta B&W: 1 - Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 -<br />
Imatge diferència entre el 4xSSAA i el 16xSSAA.
Comparativa de resultats<br />
9.1.3 16xSSAA<br />
Figura 40. Silueta B&W: 1 - Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 -<br />
Imatge diferència entre l’MLAA i el 16xSSAA.<br />
59
60<br />
9.1.4 Zoom<br />
Figura 41. Zoom d’una zona de la silueta<br />
Figura 42. Zoom d’una zona de la silueta<br />
Comparativa de resultats
Comparativa de resultats<br />
9.2 Siluetes en blanc i negre: nena<br />
A la Figura 43 tenim la silueta en blanc i negre d’una nena [3]. L’original d’aquesta<br />
escena és un jpeg amb alguns artifacts, però disposem de la versió binària amb aliasing que ens<br />
ha permès realitzar la comparativa.<br />
A la Figura 44 comprovem que l’MLAA detecta tot el contorn de la silueta com a zona a<br />
corregir. A la Figura 45 podem comprovar a simple vista que la correcció de l’aliasing és bona.<br />
Si comparem el resultat de l’MLAA (Figura 45) amb l’original (Figura 46), la diferència<br />
més notable la trobem en que l’MLAA ha suavitzat el contorn de manera que algunes<br />
irregularitats de la imatge original han desaparegut (Figura 50). L’error entre aquestes imatges<br />
és de 51.8372.<br />
Quan comparem l’MLAA amb la imatge amb blur (Figura 47), comprovem que la<br />
correcció d’aliasing del blur no és suficient per suavitzar el contorn de la silueta. Per tant, el<br />
resultat de l’MLAA en contrast amb aquesta imatge és molt superior (Figura 51). L’MSE entre<br />
aquestes imatges és de 78.7343.<br />
Càlcul de l’error quadràtic mitjà:<br />
MSE Original Blur<br />
MLAA 51.8372 78.7343<br />
Taula 2. Error quadràtic mitjà (MSE) de la silueta B&W de la nena<br />
61
62<br />
Figura 43. Silueta B&W amb aliasing.<br />
Comparativa de resultats
Comparativa de resultats<br />
Figura 44. Imatge de la silueta B&W ressaltant les zones que requereixen correcció.<br />
63
64<br />
Figura 45. Imatge de la silueta B&W després d’aplicar l’MLAA.<br />
Comparativa de resultats
Comparativa de resultats<br />
Figura 46. Imatge original de la silueta B&W de la nena.<br />
65
66<br />
Figura 47. Silueta B&W a la que li han aplicat un blur.<br />
Comparativa de resultats
Comparativa de resultats<br />
Figura 48. Imatge diferència entre les imatges de la Figura 45 i de la Figura 47<br />
Figura 49. Imatge diferència entre les imatges de la Figura 45 i la de la Figura 47<br />
67
68<br />
9.2.1 Zoom<br />
Figura 50. Zoom de la silueta<br />
Figura 51. Zoom de la silueta<br />
Comparativa de resultats
Comparativa de resultats<br />
9.3 Patrons de freqüència variable<br />
Els patrons de freqüència variable són l’exemple concret que comentàvem al capítol 7.3,<br />
quan fèiem referència a la incapacitat de l’MLAA a l’hora de gestionar característiques de la<br />
mida d’un píxel.<br />
En aquest cas tenim tres exemples diferents: una imatge de cercles concèntrics (Figura 52)<br />
i dues taules d’escacs amb diferent perspectiva i proporcions, checker 1 (Figura 62) i checker 2<br />
(Figura 66).<br />
Com havíem avançat, els cercles o els quadrats més pròxims a la càmera disposen de molts<br />
píxels a partir dels quals l’MLAA obtindrà la informació necessària per corregir la imatge.<br />
Podem observar-ho en detall a Figura 60, Figura 65 i Figura 69.<br />
En canvi, en la zona de la imatge que es troba més lluny de la càmera (zona superior), no<br />
és possible identificar els píxels que formen part de cada objecte. Com l’MLAA només disposa<br />
de la informació de pantalla i no pot accedir a la informació geomètrica, intentarà reconstruir<br />
aquesta zona de la imatge de forma incorrecta. Es pot observar amb detall en la Figura 61, la<br />
Figura 65 i la Figura 69.<br />
En els tres casos, la correcció de l’MLAA té similituds amb la del 4xSSAA, tot i que per les<br />
zones més conflictives la qualitat de l’MLAA és molt pitjor. Això es pot comprovar sobretot a la<br />
Figura 63 i a la Figura 67.<br />
En comparació amb el 16xSSAA, la qualitat de l’MLAA és realment baixa. Es fa evident a<br />
la Figura 58, la Figura 64 i la Figura 68.<br />
Podem comprovar-ho numèricament mitjançant el càlcul de l’error quadràtic mitjà:<br />
MSE NAA - 4xSSAA - MLAA - Autor -<br />
16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />
Cercles 1202.81 156.224 295.429 293.252<br />
Checker 1 3196.67 57.6541 2625.97 2419.39<br />
Checker 2 4010.79 77.1382 3347.32 3265.29<br />
Taula 3. Error quadràtic mitjà (MSE) per tots els patrons<br />
Tal com podem veure en el càlcul de l’MSE, l’MLAA es troba per sota de la qualitat del<br />
4xSSAA per aquest tipus de patrons:<br />
MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />
Podem comprovar-ho visualment a les imatges diferència de: la ¡Error! No se encuentra<br />
el origen de la referencia., la Figura 57 i la Figura 59 per als cercles; la Figura 63 i la Figura<br />
64 per al checker1; i la Figura 67 i la Figura 68 per al checker2.<br />
69
70<br />
9.3.1 Cercles<br />
NAA i MLAA<br />
Figura 52. Cercles amb aliasing<br />
Figura 53. Imatge resultant de la correcció amb l’MLAA<br />
Comparativa de resultats
Comparativa de resultats<br />
Figura 54. Imatge que destaca les zones que requereixen correcció<br />
Figura 55. Imatge diferència entre la imatge amb aliasing i la del 16xSSAA<br />
71
72<br />
4xSSAA<br />
Figura 56. Imatge resultant de la correcció amb el 4xSSAA<br />
Comparativa de resultats<br />
Figura 57. Imatge diferència entre el resultat del 4xSSAA i del 16xSSAA
Comparativa de resultats<br />
16XSSAA<br />
Figura 58. Imatge resultant de la correcció amb el 16xSSAA<br />
Figura 59. Imatge diferència entre el resultat de l’MLAA i del 16xSSAA<br />
73
74<br />
Zoom<br />
Figura 60. Zoom del patró dels cercles<br />
Figura 61. Zoom del patró dels cercles<br />
Comparativa de resultats
Comparativa de resultats<br />
9.4 Checker 1<br />
Figura 62. Checker 1: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a corregir;<br />
3 -Imatge resultant de la correcció amb l’MLAA.<br />
75
76<br />
4xSSAA<br />
Comparativa de resultats<br />
Figura 63. Checker 1: 1- Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />
diferència entre el 4xSSAA i el 16xSSAA.
Comparativa de resultats<br />
16XSSAA<br />
Figura 64. Checker 1: 1- Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />
diferència entre l’MLAA i el 16xSSAA<br />
77
78<br />
Zoom<br />
Figura 65. Zoom del patró checker 1<br />
Comparativa de resultats
Comparativa de resultats<br />
9.5 Checker 2<br />
Figura 66. Checker 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a corregir;<br />
3 -Imatge resultant de la correcció amb l’MLAA.<br />
79
80<br />
4xSSAA<br />
Comparativa de resultats<br />
Figura 67. Checker 2: 1- Correcció amb 4xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />
diferència entre el 4xSSAA i el 16xSSAA
Comparativa de resultats<br />
16XSSAA<br />
Figura 68. Checker 2: 1- Correcció amb 16xSSAA; 2 - Correcció amb MLAA; 3 - Imatge<br />
diferència entre l’MLAA i el 16xSSAA<br />
81
82<br />
Zoom<br />
Figura 69. Zoom del patró de checker 2<br />
Comparativa de resultats
Comparativa de resultats<br />
9.6 Potrace<br />
Potrace és una utilitat per transformar imatges binàries en imatges vectorials. D’aquesta<br />
manera, es pot obtenir, a partir d’una imatge amb aliasing, una de suavitzada sense cap tipus<br />
d’alteració.<br />
Hem volgut comprovar l’efecte de corregir la imatge binària amb l’MLAA per tal de<br />
comparar-la amb la imatge vectorial que s’obté amb Potrace.<br />
Figura 70. Esquerra: imatge amb aliasing; Dreta: imatge vectorial resultant de Potrace[9]<br />
Figura 71. Esquerra: imatge que destaca les zones amb aliasing. Dreta: imatge corregida<br />
per l’MLAA<br />
83
84<br />
Comparativa de resultats<br />
Figura 72. Esquerra: imatge diferència entre l’obtinguda per Potrace i l’obtinguda per<br />
l’MLAA; Dreta: zoom d’una zona de la imatge<br />
Si tenim en compte la qualitat de la imatge binària, comprovarem que la correcció que<br />
realitza l’MLAA és adequada, doncs la imatge original no disposa de molta informació (Figura<br />
71).<br />
En canvi, quan comparem la resultant per l’MLAA amb l’obtinguda per Potrace (Figura<br />
70), comprovem que l’MLAA proporciona una imatge de molt baixa qualitat en vers a<br />
l’altíssima qualitat de la imatge vectorial de Potrace. L’MSE entre ambdues imatges és de<br />
1491.19.<br />
Concretament, en la Figura 71 podem detectar la principal limitació de l’MLAA:<br />
problemes amb els objectes prims. Tot la silueta en sí és un objecte prim on, en algunes zones,<br />
l’amplada del contorn pot arribar a tenir un píxel de mida.<br />
Entenem que els mètodes per obtenir les dues imatges són completament diferents, i que<br />
mentre que l’MLAA pot intentar reconstruir el contorn de la imatge, Potrace està especialitzat en<br />
suavitzar aquest tipus d’imatges.
Comparativa de resultats<br />
9.7 Escàner<br />
Un bon exemple d’aliasing en blanc i negre és un escaneig a baixa resolució. Aquest tipus<br />
d’escaneig produirà una imatge amb dents de serra i línies trencades. Hem volgut comprovar<br />
l’efecte d’aplicar l’MLAA sobre un escaneig a 75 PPP comparant-lo amb un de 600ppp.<br />
Figura 73. Esquerra: escàner a 75 PPP; dreta: escàner a 600ppp [10]<br />
Figura 74. Esquerra: zones amb aliasing; dreta: imatge resultant d’ l’MLAA<br />
Figura 75. Imatges diferència: NAA - MLAA (esquerra) i escàner de 600 PPP - MLAA<br />
85
86<br />
Comparativa de resultats<br />
Hem comprovat que, tot i que la falta d’informació no ens permet recuperar totes les<br />
formes originals, es produeix un augment de resolució força significatiu. L’error quadràtic mitjà<br />
entre l’MLAA i l’escaneig de 75ppp és de 1438.44; amb el de 600ppp és de 11918.6.<br />
Atribuïm aquets valors tan grans a que, en imatges en blanc i negre, dos píxels diferents<br />
tenen un valor de diferència de 255 (0 negre i 255 blanc). Això dispara l’error de forma<br />
considerable
Comparativa de resultats<br />
9.8 DirectX<br />
Amb una aplicació d’exemple de DirectX, hem pogut modificar la configuració de la<br />
nostra tarja gràfica (GeForce GT 330M) per poder mostrar el model 3d proposat amb diferents<br />
tipus de multisampling: 2x, 4x i 8x.<br />
Si observem la Figura 76 i la Figura 77, podem destacar que a simple vista l’MLAA ha<br />
corregit la majoria de defectes de la imatge. Tot i això, podríem seleccionar algunes zones on<br />
encara queden artifacts després de la correcció, com per exemple al zoom superior de la Figura<br />
79.<br />
En el cas de la Figura 80, on l’antialiasing utilitzat és un 2xMultisampling, podem<br />
comprovar que l’aliasing segueix completament visible a la imatge. Només s’ha suavitzat<br />
breument respecte a la imatge de la Figura 76. Per tant, podem afirmar que la qualitat de<br />
l’MLAA en imatges d’aquest tipus, és superior que el 2xMSAA.<br />
No és possible però, realitzar aquesta mateixa afirmació per les imatges a la Figura 84 i a<br />
la Figura 85, doncs a simple vista resulten molt similars. Si observem amb atenció, veurem que<br />
la imatge del 4xMSAA manté unes irregularitats de forma constant, mentre que l’MLAA presenta<br />
la majoria de zones amb una correcció completa i d’altres amb irregularitats que pràcticament<br />
no han rebut correcció. Es pot apreciar en detall en el zoom de la Figura 87.<br />
És per això que en aquest cas no és possible identificar, a simple vista, el nivell de qualitat<br />
de l’MLAA respecte al 4xMSAA. Si analitzarem els valors de l’MSE a la Taula 4. comprovarem<br />
que la quantitat d’error de l’MLAA es troba entre el 2xMSAA i el 4xMSAA. Això coincideix amb<br />
el fet que, tot i que ambdues imatges conservin aliasing, la superfície del 4xMSAA és més<br />
homogènia en la correcció que l’MLAA.<br />
El cas oposat el trobem per la Figura 88, on l’aliasing és pràcticament imperceptible, i<br />
entra en contrast amb la imatge resultant de l’MLAA on encara es poden identificar jaggies. Al<br />
zoom de la Figura 91 es pot veure com la imatge del 8xMSAA té un contorn més difuminat i de<br />
forma més regular que el de la imatge de l’MLAA. En aquest cas, no hi ha cap dubte que la<br />
qualitat del 8xMSAA és superior.<br />
Numèricament, podem confirmar aquests resultats mitjançant el càlcul de l’error quadràtic<br />
mitjà:<br />
MSE NAA – 2xMSAA - 4xMSAA - MLAA - Autor -<br />
8xMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />
R 128.551 67.3414 43.3295 55.7158 51.8903<br />
G 128.551 67.3414 43.3295 55.7158 51.8903<br />
B 128.551 67.3414 43.3295 55.7158 51.8903<br />
Taula 4. Error quadràtic mitjà (MSE) de l’exemple de DirectX<br />
D’aquesta taula podem deduir que la qualitat de l’MLAA en aquest tipus d’imatges es troba<br />
entre el 2xMSAA i el 4xMSAA:<br />
MSE(NAA - 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) > MSE(MLAA – 8xMSAA) ><br />
> MSE (4xMSAA – 8xMSAA)<br />
Podem comprovar visualment l’MSE a les imatges diferència de la Figura 82, la Figura 86 i la Figura<br />
90.<br />
87
88<br />
9.8.1 NAA i MLAA<br />
Figura 76. Imatge del model amb aliasing<br />
Comparativa de resultats<br />
Figura 77. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing
Comparativa de resultats<br />
Figura 78. Zones de la imatge amb aliasing que han de ser corregides<br />
Figura 79. Zoom d’algunes zones de les imatges de la Figura 76 i de la Figura 77<br />
89
90<br />
9.8.2 2xMSAA<br />
Figura 80. Imatge corregida pel 2xMultisampling<br />
Comparativa de resultats<br />
Figura 81. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing
Comparativa de resultats<br />
Figura 82. Imatge diferència entre el 2xMSAA i el 8xMSAA<br />
Figura 83. Zoom d’algunes zones de les imatges de la Figura 80 i la de la Figura 81<br />
91
92<br />
9.8.3 4xMSAA<br />
Figura 84. Imatge corregida pel 4xMultisampling<br />
Comparativa de resultats<br />
Figura 85. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing
Comparativa de resultats<br />
Figura 86. Imatge diferència entre el 4xMSAA i el 8xMSAA<br />
Figura 87. Zoom d’algunes zones de les imatges de la Figura 84 i la de la Figura 85<br />
93
94<br />
9.8.4 8xMSAA<br />
Figura 88. Imatge corregida pel 8xMultisampling<br />
Comparativa de resultats<br />
Figura 89. Imatge resultant d’aplicar l’MLAA a la imatge amb aliasing
Comparativa de resultats<br />
Figura 90. Imatge diferència entre l’MLAA i el 8xMSAA<br />
Figura 91. Zoom d’algunes zones de les imatges de la Figura 88 i la de la Figura 89<br />
95
96<br />
9.9 Maya<br />
Comparativa de resultats<br />
A la Figura 92 tenim l’escena renderitzada sense cap antialiasing activat. Com podem<br />
veure, l’MLAA detecta el contorn dels objectes de l’escena com a zones amb aliasing. En el cas<br />
de les rajoles de la paret, l’algorisme està detectant aquelles zones que tenen un alt contrast<br />
respecte als seus veïns.<br />
El cas d’aquesta escena és molt pràctic, doncs disposem de dues zones molt interessants: la<br />
paret de maons i el personatge de l’Avionetta.<br />
Recordem que la nostra implementació de l’MLAA utilitza un llindar de 80 per identificar<br />
quins colors són similars i quins són diferents.<br />
En el cas de la paret, podem veure que hi ha zones on l’aliasing no s’ha corregit<br />
correctament. Doncs l’espai detectat entre els totxos és tan estret, que l’MLAA no disposa de<br />
prou informació per processar-ho correctament, ja que només ha establert una línia. Altres<br />
zones, senzillament no han estat detectades per l’MLAA com a zones amb aliasing, i per tant, no<br />
han estat corregides.<br />
Si establim un llindar de 40, enlloc de 80, comprovarem que l’MLAA selecciona més zones<br />
a corregir, doncs ara detecta més colors com a diferents (Figura 97). En aquest cas, la correcció<br />
que es fa de la paret és d’una qualitat molt superior a la de la Figura 92.<br />
Això és degut a que ara s’estan detectant més diferències de color entre píxels, per tant<br />
s’estan seleccionant més patrons i, en conseqüència, l’espai entre els totxos disposarà de molta<br />
més informació de color.<br />
No succeeix el mateix en el cas de l’Avionetta. Com ja van comentar, el llindar de 80 s’ha<br />
seleccionat després de realitzar diferents proves i detectar que és un valor generalment adequat<br />
per a les imatges en color. Com a exemple, en aquest cas la silueta del personatge es troba<br />
correctament suavitzada per a la Figura 92.<br />
En el moment que establim un llindar de 40, estem assumint que colors que són iguals<br />
siguin considerats diferents (quan més baix el llindar, més correcció es produirà). Això afecta de<br />
forma molt negativa al contorn del personatge, doncs s’estan detectant colors que interfereixen<br />
en la correcció de la seva silueta. Podem comprovar amb detall les diferències entre la paret i<br />
l’Avionnetta a la Figura 98.<br />
Més concretament: amb aquest valor de llindar, el contorn del personatge està patint la<br />
problemàtica que comentàvem a 8.2.2, a l’apartat de Cerca de discontinuïtats. Aquest problema<br />
és precisament el motiu pel qual vam establir un llindar per poder diferenciar uns colors<br />
d’altres.<br />
Per tant, donades aquestes circumstàncies podríem afirmar que, tot i que la modificació del<br />
llindar ens permetria atenuar alguns dels defectes que l’MLAA pugui passar per alt en algunes<br />
situacions, no podem intentar superar les limitacions de l’algorisme a base d’empitjorar zones<br />
de la imatge que haurien de ser corregides sense cap problema, doncs s’alteraria completament<br />
la utilitat de l’algorisme.<br />
D’altra banda, si comparem les imatges de la Figura 93 i de la Figura 94 amb les<br />
obtingudes per l’MLAA, comprovarem que la qualitat de l’MLAA és inferior.<br />
En el cas del 4xSSAA, tot i tenir zones similars, l’acabat del supersampling és molt més bo.<br />
Tot i no corregir del tot alguna zona, el contorn dels objectes està suavitzat de forma molt més<br />
homogènia que amb l’MLAA.<br />
Amb el 16xSSAA en canvi, la qualitat és altíssima i l’MLAA mostra uns resultats molt<br />
pobres em comparació.<br />
Podem comprovar-ho numèricament mitjançant el càlcul de l’MSE a la Taula 5. A la<br />
Figura 93 i la Figura 94 podem visualitzar l’MSE entre les diferents imatges a partir de la<br />
imatge diferència.
Comparativa de resultats<br />
MSE NAA - 4xSSAA - MLAA - Autor -<br />
16XSSAA 16xSSAA 16xSSAA 16xSSAA<br />
R 212.572 8.74309 174.622 169.184<br />
G 123.516 4.68394 102.69 105.489<br />
B 69.6465 2.6938 58.1515 60.2413<br />
Taula 5. Error quadràtic mitjà (MSE) de l’Avionetta<br />
És a dir, la relació de l’error entre les diferents tècniques equival a:<br />
MSE(NAA - 16xSSAA) > MSE(MLAA – 16xSSAA) > MSE(4xSSAA – 16xSSAA)<br />
Per tant, a partir dels resultats obtinguts tant amb l’MSE com amb les imatges, podem<br />
afirmar que en aquest cas, la qualitat de les imatges resultant de l’MLAA es troba per sota de la<br />
qualitat del 4xSSAA.<br />
97
98<br />
Comparativa de resultats<br />
Figura 92. Render de Maya: 1 - Imatge amb aliasing; 2 - Imatge que mostra les zones a<br />
corregir; 3 - Imatge resultant de la correcció amb l’MLAA.
Comparativa de resultats<br />
9.9.1 4xSSAA<br />
Figura 93. Render de Maya: 1 - Correcció amb 4xSSAA; 2 - Correcció amb MLAA;<br />
3 - Imatge diferència entre el 4xSSAA i el 16xSSAA.<br />
99
100<br />
9.9.2 16xSSAA<br />
Comparativa de resultats<br />
Figura 94. Render de Maya: 1 - Correcció amb 16xSSAA; 2 - Correcció amb MLAA;<br />
3 - Imatge diferència entre 1 i 2.
Comparativa de resultats<br />
9.9.3 Zoom<br />
Figura 95. Zoom per a totes les variacions de la imatge<br />
Figura 96. Zoom per a totes les variacions de la imatge<br />
101
102<br />
Comparativa de resultats<br />
Figura 97. Render de Maya: 1 - Imatge mostrant les zones a corregir per un llindar de 40;<br />
2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 40; 3 - Imatge<br />
resultant de l’MLAA amb llindar de 80;
Comparativa de resultats<br />
Figura 98. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 40. Podem<br />
apreciar les diferències entre les parets de maons i les siluetes de l’Avionetta<br />
103
104<br />
9.10 Half-Life 2: Imatge 1<br />
Comparativa de resultats<br />
Les imatges del Half-Life 2 van ser capturades a una resolució de 1280x720, però nosaltres<br />
hem retallat les imatges a 420x220 per poder mostrar amb detall les zones més interessants.<br />
Aquesta imatge té algunes similituds amb la imatge de l’apartat 9.9, doncs també perd<br />
qualitat en alguns detalls que podrien millorar-se modificant el llindar. Això sí, el resultat de la<br />
resta de la imatge es deterioraria completament.<br />
Si partim de la imatge de la Figura 99, veurem que tot i que l’escala presenta aliasing en<br />
tota la seva superfície, l’MLAA no l’ha detectat completament. En aquest cas estem parlant<br />
d’una zona amb colors molt similars, per tant és fàcil que l’algorisme els passi per alt.<br />
A més a més, comprovem que la reixa del fons de la imatge no s’ha detectat en cap<br />
moment. La raó és la mateixa, doncs es tracta de colors molt similars i aquest llindar (80) els<br />
tracta com iguals.<br />
Per tant, a la Figura 99 podem comprovar que la correcció de l’MLAA ha tractat totes les<br />
zones identificades amb un resultat final decent. Les zones no identificades segueixen mostrant<br />
els mateixos defectes.<br />
Tenint en compte que estem ignorant parts importants de la imatge que evidentment<br />
requereixen antialiasing, hem comprovat quin seria el resultat en establir un llindar més baix.<br />
El llindar mínim necessari per detectar l’enreixat del fons és de 20, un valor<br />
extremadament baix, ja que trobarà diferències entre colors molt similars. A la Figura 104<br />
comprovem que ara sí s’han detectat totes les zones amb aliasing de la imatge.<br />
El problema el trobem quan comprovem la imatge resultant d’aquest MLAA: amb un<br />
llindar tan baix, estem identificant diferències on realment no n’hi ha. D’aquesta manera, les<br />
barres verticals de l’escala, que per un llindar de 80 (Figura 99) s’havien corregit correctament,<br />
tornen a mostrar aliasing.<br />
Respecte a les barres horitzontals, en la Figura 99 no aconseguíem detectar-les per<br />
complet. Amb aquest llindar sí que ho fem però tot i així, al tractar-se d’objectes prims, el<br />
resultat de la seva correcció és molt pobre. Es pot veure en detall en la Figura 105.<br />
D’aquesta manera, arribem a la mateixa conclusió: modificar el valor del llindar pot arribar<br />
a millorar les zones més conflictives de la imatge, però motivarà la pèrdua de qualitat de la resta<br />
de la imatge.<br />
Sobre les imatges a les que s’ha aplicat el multisampling, cal recordar (2.2.3) que<br />
l’inconvenient més gran de l’MSAA és el fet de no tractar les textures internes dels objectes, i<br />
per tant les textures alpha (amb transparència) que són habituals a les escenes amb reixes<br />
tampoc es veuran corregides.<br />
Tenint això en compte, podem comprovar que per totes les versions del multisampling<br />
(Figura 100, Figura 101 y Figura 102), en cap moment s’ha corregit la reixa del fons.<br />
En el cas de la Figura 100, per al 2xMSAA, a simple vista es pot veure que els resultats de<br />
l’MLAA són de millor qualitat.<br />
En el cas de la Figura 101 no és tan senzill d’avaluar, doncs si mirem la imatge amb detall<br />
es pot veure que el 4xMSAA està corregint lleugerament l’aliasing de les barres horitzontal de<br />
l’escala.<br />
Sabem que l’MLAA no ha corregit aquesta zona, però en canvi, si que ha corregit<br />
perfectament les barres verticals. El 4xMSAA en canvi, no ha arribat a suavitzar completament<br />
aquesta zona. La seva correcció és més homogènia en el conjunt de la imatge, però la de<br />
l’MLAA és més complerta en les zones que s’ha aplicat.<br />
Si analitzem només la qualitat de la imatge de forma visual, l’efecte de l’MLAA és més<br />
polit (recordem que les zones que no ha corregit són molt petites, les grans es veuen<br />
perfectament suavitzades), suposarem que el resultat de l’MLAA per aquesta imatge és
Comparativa de resultats<br />
lleugerament superior que el del 4xMSAA. Podem comprovar els detalls en la imatge de la<br />
Figura 103. Però si relacionem l’MSE entre les imatges amb aquesta qualitat, trobarem certa<br />
incoherència en els resultats: l’MSE de l’MLAA és superior al 2xMSAA (Taula 6. Aquesta<br />
contradicció es deu a que el multisampling no està tractant les textures alpha, i per tant, totes les<br />
seves imatges resultants (per 2x, 4x i 8x) són més semblants entre sí, el que implica un MSE<br />
més baix. Podem comprovar-ho visualment a les imatges diferència de la Figura 100, la Figura<br />
101 i la Figura 102.<br />
Finalment, en comparar el resultat de l’MLAA amb la correcció realitzada amb el 8xMSAA,<br />
l’alta qualitat del multisampling respecte al morphological és evident. Tot i així, si observem<br />
amb atenció les imatges de la Figura 102 i de la Figura 103, podem apreciar que a la barra<br />
vertical de l’escala, la correcció de l’MLAA està lleugerament més suavitzada. Al marge<br />
d’aquest detall, el resultat global del multisampling és tan bo i homogeni, que considerem que la<br />
seva qualitat en aquest cas és superior a l’MLAA.<br />
A continuació, el càlcul de l’error quadràtic mitjà i la seva relació entre les diferents<br />
tècniques:<br />
és:<br />
MSE NAA – 2xMSAA - 4xMSAA - MLAA - Autor -<br />
8xMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />
R 7.19529 3.44433 2.2368 5.18829 6.88284<br />
G 13.4076 6.35743 4.07806 9.57029 15.269<br />
B 8.28486 3.94289 2.5142 5.89152 11.4049<br />
Taula 6. Error quadràtic mitjà (MSE) de la imatge 1 del Half-Life 2<br />
Per tant, la relació existent entre el multisampling i l’MLAA per a aquest tipus d’imatges<br />
MSE(NAA - 8xMSAA) > MSE(MLAA – 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) ><br />
> MSE (4xMSAA – 8xMSAA)<br />
Com ja hem comentat, els valors numèrics es veuen afectats per la limitació del<br />
multisampling amb les textures alpha, per tant, la qualitat de l’MLAA per a aquestes imatges<br />
seria, com a mínim, equivalent al 4xMSAA, i en aquest cas concret lleugerament superior.<br />
105
106<br />
Comparativa de resultats<br />
Figura 99. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2- Imatge que mostra les zones<br />
a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.
Comparativa de resultats<br />
9.10.1 2xMSAA<br />
Figura 100. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA.<br />
107
108<br />
9.10.2 4xMSAA<br />
Comparativa de resultats<br />
Figura 101. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA
Comparativa de resultats<br />
9.10.3 8xMSAA<br />
Figura 102. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre l’MLAA i el 8xMSAA.<br />
109
110<br />
9.10.4 Zoom<br />
Figura 103. Zoom per a totes les variacions de la imatge<br />
Comparativa de resultats
Comparativa de resultats<br />
Figura 104. Imatge del Half-Life 2: 1 - Imatge mostrant les zones a corregir per un llindar<br />
de 20; 2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 20;<br />
3 - Imatge resultant de l’MLAA amb llindar de 80;<br />
111
112<br />
Comparativa de resultats<br />
Figura 105. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 20. Podem<br />
apreciar les diferències entre l’escala i la reixa
Comparativa de resultats<br />
9.11 Half-Life 2: Imatge 2<br />
Aquesta imatge (Figura 106), és l’exemple perfecte de com l’MLAA pot superar en<br />
algunes ocasions al multisampling. En aquest cas, tornem a tractar amb una escena amb textures<br />
alfa, on ja sabem que l’MSAA falla. A més a més, es tracta d’una imatge amb uns colors molt<br />
contrastats. Això afavoreix el procés del nostre algorisme, doncs no evita problemes amb zones<br />
que no es detecten per tenir colors similars.<br />
Per tant, només comprovant la Figura 106 podem fer-nos una idea que l’MLAA ha fet una<br />
correcció de molt alta qualitat. L’escala del centre de la imatge és la zona més fàcil de comparar<br />
a simple vista amb la resta de imatges. Podem comprovar altres zones en detall amb el zoom a<br />
la Figura 110.<br />
Si comparem les imatges, veurem que el multisampling no està corregint pràcticament res<br />
a 2xMSAA (Figura 107). Amb 4xMSAA (Figura 108) el resultat millora, però segueix deixant<br />
zones importants sense corregir.<br />
Finalment, a 8xMSAA (Figura 109) el resultat és acceptable, però en comparar-lo amb<br />
l’MLAA comprovem que la qualitat del morphological és molt superior al multisampling en<br />
aquesta ocasió.<br />
Podem confirmar aquests resultats a partir del càlcul de l’error quadràtic mitjà:<br />
MSE NAA - 2xMSAA - 4xMSAA - MLAA - Autor -<br />
8XMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />
R 100.117 36.2895 16.197 126.907 148.871<br />
G 116.668 42.1394 18.7934 146.851 171.922<br />
B 141.224 51.3838 22.5801 178.814 208.033<br />
Taula 7. Error quadràtic mitjà (MSE) de la imatge 2 del Half-Life 2<br />
Com podem veure, la relació entre el multisampling i l’MLAA és la següent:<br />
MSE(MLAA – 8xMSAA) > MSE(NAA - 8xMSAA) > MSE( 2xMSAA – 8xMSAA) ><br />
> MSE(4xMSAA – 8xMSAA)<br />
Podem veure les imatges diferència corresponents al càlcul de l’MSE a la Figura 107, a la<br />
Figura 108 i a la Figura 109.<br />
113
114<br />
Comparativa de resultats<br />
Figura 106. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les<br />
zones a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.
Comparativa de resultats<br />
9.11.1 2xMSAA<br />
Figura 107. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA<br />
115
116<br />
9.11.2 4xMSAA<br />
Comparativa de resultats<br />
Figura 108. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA.
Comparativa de resultats<br />
9.11.3 8xMSAA<br />
Figura 109. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre 1 i 2.<br />
117
118<br />
9.11.4 Zoom<br />
Figura 110. Zoom per a totes les variacions de la imatge<br />
Comparativa de resultats
Comparativa de resultats<br />
9.12 Half-Life 2: Imatge 3<br />
Aquesta imatge, a diferència de l’anterior, conté tots els elements que perjudiquen al nostre<br />
algorisme: objectes molt petits i tonalitats molt similars.<br />
Si observem la imatge de la Figura 111 veurem que s’han detectat molt poques zones per<br />
corregir. Per tant, ja sabem que la resta de contorns amb aliasing que no s’han marcat no seran<br />
corregits.<br />
Comprovem que una de les zones detectades és la part de dalt de l’edifici amb les antenes.<br />
Només cal observar la imatge resultant de l’MLAA per comprovar que no ha aconseguit corregir<br />
res en aquests objectes tan petits. El mateix succeeix amb els cables que van d’un edifici a<br />
l’altre. Podem comprovar-ho amb detall en la Figura 115.<br />
Si observem amb atenció la Figura 112, podrem detectar algunes zones on l’MLAA ha<br />
suavitzat amb millor qualitat que el 2xMSAA: el sostre dels edificis i algunes parets. La resta de<br />
zones o bé no s’han corregit perquè es tracta d’objectes molt petits, o bé la qualitat de la<br />
correcció dels dos antialiasings és realment baixa.<br />
Quan comparem el resultat de l’MLAA amb el del 4xMSAA a la Figura 113, comprovem<br />
que les zones que l’MLAA sí que havia corregit (sostres, alguna paret) són equivalents en les<br />
dues imatges. Els objectes petits, en canvi, estan correctament suavitzats amb el multisampling.<br />
I lògicament, la part de la imatge que l’MLAA no ha corregit, ha estat suavitzada pel 4xMSAA.<br />
Si tenim en compte l’MSE de l’MLAA amb el 2xMSAA i amb el 4xMSAA, a la vista dels<br />
resultats, podríem entendre que la qualitat de la imatge resultant de l’MLAA és troba entre mig<br />
dels dos.<br />
Tot i que l’MLAA no hagi corregit els objectes petits i el 2xMSAA sí que ho hagi fet, els<br />
contorns que l’MLAA ha corregit són de millor qualitat que els del multisampling, i alhora són<br />
més fàcils de percebre que les antenes o els cables. Per tant, entendrem que visualment l’MLAA<br />
és lleugerament superior al 2xMSAA per aquesta imatge.<br />
En aquest cas, el valor numèric de l’MSE no coincideix amb la percepció que tenim de la<br />
imatge, doncs tot i que visualment es pot apreciar la millor qualitat de l’MLAA respecte al<br />
2xMSAA, l’MSE de l’MLAA és més gran. Atribuïm aquesta diferència a algunes zones de la<br />
imatge de l’MLAA on l’aliasing és molt evident: per exemple, a la Figura 112, a la columna<br />
inclinada de l’esquerra de la imatge.<br />
MSE NAA - 2xMSAA - 4xMSAA - MLAA - Autor -<br />
8XMSAA 8xMSAA 8xMSAA 8xMSAA 8xMSAA<br />
R 26.5243 5.23815 2.55316 16.1521 18.5586<br />
G 20.6 4.6945 2.40291 13.8925 15.4219<br />
B 14.7427 3.52288 1.9843 11.1844 12.5476<br />
Taula 8. Error quadràtic mitjà (MSE) de la imatge 3 del Half-Life 2<br />
Per tant, la relació de l’error entre el multisampling i l’MLAA quedaria:<br />
MSE(NAA - 8xMSAA) > MSE(MLAA – 8xMSAA) > MSE ( 2xMSAA – 8xMSAA) ><br />
> MSE (4xMSAA – 8xMSAA)<br />
Podem comprovar visualment l’MSE a les imatges diferència de la Figura 112, la Figura<br />
113 i la Figura 114.<br />
119
120<br />
Comparativa de resultats<br />
Figura 111. Imatge del Half-Life 2: 1 - Imatge amb aliasing; 2 - Imatge que mostra les<br />
zones a corregir; 3 - Imatge resultant de la correcció amb l’MLAA.
Comparativa de resultats<br />
9.12.1 2xMSAA<br />
Figura 112. Imatge del Half-Life 2: 1 - Correcció amb 2xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 2xMSAA i el 8xMSAA.<br />
121
122<br />
9.12.2 4xMSAA<br />
Comparativa de resultats<br />
Figura 113. Imatge del Half-Life 2: 1 - Correcció amb 4xMSAA; 2 - Correcció amb<br />
MLAA; 3 - Imatge diferència entre el 4xMSAA i el 8xMSAA.
Comparativa de resultats<br />
9.12.3 8xMSAA<br />
Figura 114. Imatge del Half-Life 2: 1 - Correcció amb 8xMSAA; 2 - Correcció amb<br />
MLAA; 3 -imatge diferència entre l’MLAA i el 8xMSAA.<br />
123
124<br />
9.12.4 Zoom<br />
Figura 115. Zoom per a totes les variacions de la imatge<br />
Comparativa de resultats
Comparativa de resultats<br />
9.13 Autor<br />
9.13.1 Fada<br />
Figura 116. Conjunt d’imatges en totes les versions possibles: sense antialiasing; destacant<br />
la zona de correcció; imatge resultant de l’autor; imatge resultant de la nostra<br />
implementació.<br />
Figura 117. Imatge diferència entre la nostra implementació de l’MLAA i la de l’autor<br />
125
126<br />
Comparativa de resultats<br />
Figura 118. Zoom de la Fada amb la nostra implementació de l’MLAA (esquerra) i la<br />
sortida de l’aplicació de l ‘autor (dreta).<br />
La Fada és l’exemple que trobem a l’article de l’autor. Per tant, hem considerat que és el<br />
més adequat per comprovar l’eficàcia de la nostra implementació en la versió a color, doncs és<br />
una de les imatges a partir de les quals hem realitzat les principals proves per refinar<br />
l’algorisme.<br />
Si comprovem la Figura 116, veiem que no s’aprecien canvis en els contorns de la imatge.<br />
Quan observem la Figura 118, comprovem que la única diferència és troba en les textures,<br />
doncs l’autor ha aplicat l’algorisme creant un efecte d’emborronament.<br />
En el nostre cas, hem escollit un llindar que només afecta al contorn dels objectes de la<br />
imatge, i per tant, és en aquesta zona on es corregeix l’aliasing, tal i com podem comprovar a la<br />
Figura 116.<br />
Per tant, donat que no existeixen diferències perceptibles a simple vista a la imatge de la<br />
Figura 116 i que la correcció de l’aliasing és realitza correctament, atribuïm el valor de l’MSE<br />
a aquesta aplicació de l’MLAA de l’autor sobre les textures de la imatge.<br />
D’aquesta manera, donem per vàlida l’eficàcia del nostre algorisme en comparació amb els<br />
resultats obtinguts per l’aplicació de l’autor.<br />
Càlcul de l’error:<br />
MSE R G B<br />
MLAA vs. Autor 54.7732 32.3782 8.99488<br />
Taula 9. Error quadràtic mitjà (MSE) de la imatge de la Fada
Comparativa de resultats<br />
9.13.2 Silueta<br />
Figura 119. Imatge resultant d’aplicar la nostra implementació a la silueta de la Figura 43<br />
127
128<br />
Comparativa de resultats<br />
Figura 120. Imatge resultant d’utilitzar l’aplicació de l’autor per la imatge de la Figura 43
Comparativa de resultats<br />
Figura 121. Zoom de les imatges de la Figura 119 i de la Figura 120<br />
129
130<br />
Comparativa de resultats<br />
Figura 122. Diferència de les imatges de la Figura 119 i de la Figura 120<br />
Hem escollit la silueta de la nena per a aquesta comparació, perquè considerem que és una<br />
imatge amb característiques variades. Si comprovem les imatges a simple vista, no s’aprecia cap<br />
diferència entre elles. El seu MSE és de 17.012.<br />
Quan fem un zoom sobre alguna de les zones conflictives (Figura 121), per exemple les<br />
fulles, tampoc apreciem cap canvi significatiu. Per tant, considerem que la implementació<br />
d’aquesta part de l’algorisme ha estat adequada.<br />
Càlcul de l’error quadràtic mitjà:<br />
9.14 Half-Life 2: Imatge 1<br />
MSE Autor<br />
MLAA 17.012<br />
L’única diferència problemàtica que hem trobat amb l’autor és en casos com els de la<br />
Figura 99, quan el valor del llindar que establim per diferenciar colors pugui ser determinant<br />
pel resultat final, però no sigui el mateix llindar per a totes les zones de la imatge.
Comparativa de resultats<br />
En aquest cas concret, sabem que la reixa del fons rebrà una correcció molt bona amb un<br />
llindar amb valor entre 10 i 20. Sabem que amb aquest mateix valor, obtindrem la millor<br />
correcció possible de les barres horitzontals de l’escala.<br />
Però també sabem que per corregir les barres verticals de l’escala i algun contorn més de la<br />
imatge, necessitem un llindar de 80; i que a més a més, l’aliasing d’aquestes zones és el més<br />
destacable a simple vista.<br />
És per això que en la nostra implementació hem d’escollir aquest últim valor per tal de<br />
quedar-nos amb el millor resultat possible d’entre tots els que podem obtenir.<br />
Amb l’aplicació de l’autor no és així. A la Figura 123 podem comprovar que la seva<br />
imatge és una combinació de les bones correccions de les nostres. La seva reixa és equivalent a<br />
la nostra reixa pel llindar 15. El mateix succeeix per les barres horitzontals de l’escala. En el cas<br />
de les barres verticals, tenen la qualitat de la nostra imatge per llindar 80. Més detall a la Figura<br />
124.<br />
Per tant, a la vista dels resultats hem de suposar que l’autor aplica un mètode que li permet<br />
trobar l’equilibri entre aquests llindars, i que és quelcom que s’escapa de les nostres<br />
possibilitats.<br />
Donat que les nostres proves amb el seu mètode per diferenciar colors van obtenir uns<br />
resultats realment dolents, considerem que aquesta no és la part rellevant, o com a mínim, el<br />
resultat no depèn directament d’aquest sistema.<br />
Com ja vam comentar a 8.2.2, la nostra implementació presenta algunes convencions que<br />
hem hagut de prendre per falta d’informació. Creiem que aquesta informació és la que ens<br />
permetria processar les imatges de manera que obtinguéssim el resultat òptim per a cada zona de<br />
la imatge (dintre de les possibilitats de l’MLAA).<br />
D’altra banda, cal destacar que aquestes diferències amb l’autor no alteren la nostra<br />
comparativa amb l’MSAA, tal com es demostra a cada una de les taules comparatives de l’MSE<br />
on l’error del nostre MLAA i el de l’autor és similar. Podem comprovar-ho visualment a la<br />
Figura 125, on la imatge de l’autor segueix sent lleugerament de millor qualitat que la del<br />
4xMSAA i la imatge del 8xMSAA segueix sent clarament superior a totes les demés.<br />
En el cas de la Figura 126, la imatge de l’autor segueix sent visualment superior a la del<br />
2xMSAA i, degut a la quantitat d’objectes petits de la imatge, segueix sense tenir tan bona<br />
qualitat com la del 4xMSAA, tot i que en aquest cas, està lleugerament per sota (en la nostra<br />
implementació es diferencien més).<br />
A continuació, mostrem en detall el càlcul de l’error quadràtic mitjà de les imatges:<br />
MSE Autor - MLAA 80 Autor - MLAA 15 Autor - 8xMSAA<br />
Imatge 1<br />
Imatge 2<br />
R 3.66149 2.62338 6.8557<br />
G 9.09481 5.1006 15.0577<br />
B 7.76597 3.60386 11.2835<br />
R 20.8738<br />
G 17.305<br />
B 14.0528<br />
Taula 10. Error quadràtic mitjà (MSE)<br />
131
132<br />
Comparativa de resultats<br />
Figura 123. Imatge 1: 1 - Imatge resultant de l’MLAA amb llindar de 80;<br />
2 - Imatge resultant de la correcció amb l’MLAA amb llindar de 15;<br />
3 – Imatge resultant de la implementació de l’autor;
Comparativa de resultats<br />
Figura 124. Zoom de les imatges resultant de l’MLAA per a llindars de 80 i 15 i per la<br />
versió de l’autor. Podem apreciar les diferències entre l’escala i la reixa<br />
133
134<br />
Comparativa de resultats<br />
Figura 125. Comparativa de la imatge resultant de la implementació de l’autor amb les<br />
obtingudes amb el supersampling de 4x i de 8x
Comparativa de resultats<br />
Figura 126. Imatge 2: Comparativa de la imatge resultant de la implementació de l’autor<br />
amb les obtingudes amb el supersampling de 4x i de 8x<br />
135
10. Conclusions<br />
Després de tot l’estudi i desenvolupament del Morphological Antialiasing, hem pogut<br />
explorar en detall els seus avantatges i les seves limitacions.<br />
Hem confirmat que el punt fort de l’algorisme és el seu plantejament, una nova manera<br />
d’enfocar el problema: el fet de treballar amb imatges processades implica no haver de realitzar<br />
càlculs amb la geometria de l’escena i, en conseqüència, s’obtenen resultats de millor qualitat<br />
amb un consum de recursos més baix.<br />
D’altra banda, hem comprovat que el punt feble principal de l’MLAA és la falta<br />
d’informació a nivell de subpíxel. Per aquesta causa, l’algorisme no proporcionarà bons<br />
resultats per a imatges amb objectes molt prims o petits. Tampoc podrà gestionar correctament<br />
els canvis temporals que afectin als polígons a nivell de subpíxel en diferents frames, de manera<br />
que es veurà reflexat en l’animació final. En últim lloc, el fet de no distingir entre primer pla i<br />
fons, suposarà un problema per al processament de text, que resultarà en una distorsió<br />
considerable de les lletres.<br />
En quant a la implementació, malauradament, degut a l’escassa (i en ocasions confusa)<br />
informació que es proporciona a l’article original, hem hagut d’afegir una limitació extra a la<br />
nostra versió de l’algorisme.<br />
Tenim la certesa que, si l’autor hagués escollit un exemple genèric per explicar la versió de<br />
l’algorisme per a imatges en color, hauria estat possible extreure la informació necessària per<br />
poder desenvolupar una implementació equivalent.<br />
Donat que tota la descripció de la segona part de l’algorisme es basa en un cas molt<br />
particular que no aporta cap dada nova, la informació que sí ofereix sobre com tractar el color<br />
esdevé incoherent i, en algun cas, injustificada.<br />
A banda de les dificultats per reproduir la implementació, hem pogut avaluar correctament<br />
els punts forts i dèbils de l’algorisme, tenint sempre en compte quines limitacions són de<br />
l’MLAA i quines corresponen a la nostra implementació.<br />
A partir dels resultats de la nostra comparativa, podem concloure que l’MLAA presenta uns<br />
resultats equivalents al 4xSupersampling. En el cas dels patrons de freqüència variable però, la<br />
seva qualitat és menor a la del 4xSSAA, doncs no disposa de suficient informació per processar<br />
algunes zones de la imatge.<br />
En el cas de multisampling, l’MLAA té generalment una qualitat equivalent al 4xMSAA,<br />
arribant en ocasions a superar-lo. En les imatges que continguin textures amb transparència, la<br />
qualitat de l’MLAA pot superar fàcilment la del 8xMSAA.<br />
Aquests resultats es veuen afectats però, per les limitacions ja conegudes de l’MLAA. Per<br />
tant, aquelles escenes amb text, objectes petits o molt prims, rebran la conseqüent pèrdua de<br />
qualitat, on la qualitat de l’MLAA es trobarà entre el 2xMSAA i el 4xMSAA, i en el cas del<br />
supersampling, per sota del 4xSSAA.<br />
En conclusió, l’MLAA és un bon punt de partida per millorar les tècniques d’antialiasing<br />
que es feien servir fins ara. Considerem que aquest algorisme ha revolucionat la forma de tractar<br />
l’aliasing, tal com estem veient en les diferents implementacions que s’han dut a terme partint<br />
de la base de l’MLAA.<br />
És raonable pensar doncs, que el fet d’obtenir resultats de bona qualitat a un rendiment tan<br />
alt en comparació amb altres algorismes, obre un nou ventall de possibilitats que, junt amb les<br />
tècniques ja conegudes, probablement desembocarà en una optimització que combini el millor<br />
de cada una d’elles.<br />
137
11. Glossari<br />
[G1] Jaggies: dents de serra, artifacts.<br />
[G2] Artifacts: defectes, alteracions en la imatge que produeixen pèrdua de qualitat.<br />
[G3] Frame: fotograma, imatge concreta en una successió d’imatges.<br />
[G4] Motion blur: efecte de moviment a partir d’un desenfocament de la imatge.<br />
[G5] Bandwidth: ample de banda respecte el consum de la memòria de vídeo.<br />
[G6] Fillrate: taxa d’ompliment de píxels.<br />
[G7] Frame buffer: ubicació de memòria dels píxels que es mostraran per pantalla.<br />
139
12. Referències<br />
[1] Advanced Graphics Lab (Intel). Morphological Antialiasing<br />
http://visual-computing.intel-research.net/publications/papers/2009/mlaa/mlaa.pdf<br />
[2] Whathis?com. Moire effect<br />
http://whatis.techtarget.com/definition/0,,sid9_gci768750,00.html<br />
[3] Hardware y software gráfico. Antialiasing<br />
http://giga.cps.unizar.es/~spd/work/curso_hs/<br />
[4] Wikipedia. Supersampling<br />
http://en.wikipedia.org/wiki/Supersampling<br />
[5] Tom’s hardware. Anti-aliasing – Removing the “jaggies”<br />
http://www.tomshardware.com/reviews/high,294-23.html<br />
[6] nvNews Forums. NV40 antialiasing sample patterns<br />
http://www.nvnews.net/vbulletin/showthread.php?t=30641&highlight=Anti+aliasing<br />
[7] pcgameshardware. Ati Catalyst 9.11 delivers higher visual quality to Radeon HD 5000<br />
series<br />
http://www.pcgameshardware.com/aid,699987/Ati-Catalyst-911-delivers-higher-visualquality-to-Radeon-HD-5000series/Practice/&menu=browser&mode=article&image_id=1223598&article_id=699987&page<br />
=1<br />
[8] Web Programming & Digital Media Assignment. Mean Square Error<br />
http://goanna.cs.rmit.edu.au/~ronvs/teaching/WebProgramming-<br />
DigitalMedia/ass2002s2/ass1.html<br />
[9] Potrace. Examples<br />
http://potrace.sourceforge.net/samples.html<br />
[10] CreativePro. Scanning 101: setting the right resolution<br />
http://www.creativepro.com/article/scanning-101-setting-the-right-resolution<br />
[11] realtimerendering. Morphological Antialiasing<br />
http://www.realtimerendering.com/blog/morphological-antialiasing/<br />
141
142<br />
[12] Gaspard Monge Institut. Morphological antialiasing on the GPU<br />
http://igm.univ-mlv.fr/~biri/mlaa-gpu/MLAAGPU.pdf<br />
[13] Practical Morphological Antialiasing. MLAA<br />
http://www.iryoku.com/mlaa/<br />
Referències
13. Bibliografia<br />
13.1 Llibres<br />
HEARN Donald; BAKER M. Pauline. Gráficos por computadora con OpenGL. Madrid:<br />
Pearson Educación, 2006<br />
13.2 Recursos electrònics<br />
http://www.iryoku.com/mlaa/<br />
http://es.wikipedia.org/wiki/Aliasing<br />
http://en.wikipedia.org/wiki/Anti-aliasing<br />
http://www.nvidia.com/object/feature_hraa.html<br />
http://sites.amd.com/us/game/technology/Pages/morphological-aa.aspx<br />
http://www.impresszio.hu/szabolcs/MentalRay/MentalRaySampling.htm#adaptivesampling<br />
http://www.x86-secret.com/articles/divers/v5-6000/datasheets/FSAA.pdf<br />
http://www.scribd.com/doc/34187921/Aliasing-y-Anti-Aliasing<br />
http://www.tomshardware.com/reviews/high,294-23.html<br />
http://foro.noticias3d.com/vbulletin/showthread.php?p=3680042<br />
http://www.realtimerendering.com/blog/2009/07/<br />
http://www.eurogamer.net/articles/digitalfoundry-saboteur-aa-blog-entry<br />
http://blogs.amd.com/play/2011/03/28/morphological-anti-aliasing-is-a-smooth-operator/<br />
http://news.softpedia.com/es/La-tecnologia-NVIDIA-SRAA-competira-con-el-metodo-dealisado-AMD-MLAA-181633.html<br />
http://www.innerjuegos.com/noticias/12924<br />
143