[2D] Antialiasing

Antialiasing [2D] - Algo - Programmation

Marsh Posté le 11-03-2003 à 14:07:06    

Pour les besoins du boulot et a des fins d'edification personnelle je dois ecrire des routine de tracage de forme (ligne / poly / courbes ...) avec anti aliasing. Si le tracage de forme en lui meme n'est pas un problème (souvenirs inside), l'anti alias me laisse plus perplexe. J'ai farfouillé le net dans tous les sens, mais je n'ai pas trouvé de fin algorithme pour ce genre de sport (supersampling mis de coté), excepté pour les lignes. Pour ces dernières j'utilise l'algorithme de Wu. Ca marche bien mais souffre de defaut au niveau de jointure entre certains lignes (nomémment entre ligne oblique et ligne horizontale, vu que dans le cas de l'oblique on aura une ligne de 2 pixels de large tandis que l'horizontale n'en fera qu'une).
 
QQun s'y connait un peu ? Une page ? Un nom d'algo ?

Reply

Marsh Posté le 11-03-2003 à 14:07:06   

Reply

Marsh Posté le 12-03-2003 à 08:47:19    

18 vues quand meme :sol:

Reply

Marsh Posté le 12-03-2003 à 10:08:37    

ben chaipa, c'est vachement specifique quand meme :)  
 
a premiere vue, je vois trois solutions pas trop compliquees:
- solution bateau: tu prends chaque pixel et tu reevalue sa couleur en fonction de ses voisins, mais ton image risque de "baver" d'un peu partout
- solution moins bateau: tu recherches les parties anguleuses de ton image (tu peux analyser l'image via une transformee de fourrier et chercher les pics de frequences par exemple) et tu mets du flou avec la solution bateau aux endroits anguleux.
- pseudo-solution: tu augmentes la resolution de l'image en interpolant et tu diminue la resolution a nouveau (ca revient un peu a faire la solution bateau remarque)
 
mais j'y connais pas grand chose en traitement d'image, des avis de specialistes seraient surement les bienvenus, ca m'interesse aussi moi !
 

Reply

Marsh Posté le 12-03-2003 à 12:36:40    

T'as regardé les algos en incrémental comme Bresenham ?
L'erreur peut servir à faire un anti-alias.
J'avais fait des droites, des cercles et des ellipses à une époque, avec des algos du meme style, mais pour les courbes quelconques, je sais pas trop... elles sont définies comment, tes courbes ?
 
Pour ton problème de jointure de lignes, c'est normal : ta ligne oblique arrive entre 2 pixels, et ta ligne horizontale part sur 1 pixel, ça colle pas.
Je vois 3 possibilités :
- tu décale ta ligne horizontale verticalement d'une fraction de pixel, pour qu'elle se retrouve au meme niveau que la ligne oblique. (pas beau)
- tu oblige ta ligne oblique à se terminer sur 1 seul pixel en ajustant légèrement sa pente. (beau !)
- tu rabote l'angle en faisant un arrondi. (bon courage!)

Reply

Marsh Posté le 12-03-2003 à 14:28:12    

je reponds facon tir groupé :O
 
 

Citation :


- solution bateau: tu prends chaque pixel et tu reevalue sa couleur en fonction de ses voisins, mais ton image risque de "baver" d'un peu partout


 
bah c du blur, ca, pas de l'AA :D
 
 

Citation :


- solution moins bateau: tu recherches les parties anguleuses de ton image (tu peux analyser l'image via une transformee de fourrier et chercher les pics de frequences par exemple) et tu mets du flou avec la solution bateau aux endroits anguleux.


 
Non seulement mes maths me laissent en retrait pour ce genre de truc, mais en plus je crains que ca ne soit bpc trop gourmand pour la cible (200Mhz)
 
 

Citation :


T'as regardé les algos en incrémental comme Bresenham ?
L'erreur peut servir à faire un anti-alias.


 
Tout a fait, c'est d'ailleurs l'idée de l'algo de Wu (cf http://freespace.virgin.net/hugo.elias) Le pb c'est que ca marche bien pour les lignes, pas pour les contours de polygones remplis (+ les pb de taille de ligne evoqués plus haut)
 
 

Citation :


elles sont définies comment, tes courbes ?


 
Courbe de bezier, donc a priori une brochette de points de controles
 
 

Citation :


Pour ton problème de jointure de lignes, c'est normal : ta ligne oblique arrive entre 2 pixels, et ta ligne horizontale part sur 1 pixel, ça colle pas.
Je vois 3 possibilités :
- tu décale ta ligne horizontale verticalement d'une fraction de pixel, pour qu'elle se retrouve au meme niveau que la ligne oblique. (pas beau)
- tu oblige ta ligne oblique à se terminer sur 1 seul pixel en ajustant légèrement sa pente. (beau !)
- tu rabote l'angle en faisant un arrondi. (bon courage!)  


 
tout le probleme c'est que ces deux lignes me seront peut etre fournie sans indication de liens entre elle (je ne sais pas que la ligne 1 va rejoindre la ligne 34). J'ai regarder Paint shop pro 5 et meme pour les lignes droites / verticales il fait une sorte d'AA (il epaissit la ligne, en fait)
Me demande si il fait pas du supersample....
 
 
enfin bref, merci de vos reponses !

Reply

Marsh Posté le 12-03-2003 à 17:52:33    

chrisbk a écrit :


Non seulement mes maths me laissent en retrait pour ce genre de truc, mais en plus je crains que ca ne soit bpc trop gourmand pour la cible (200Mhz)
 


 
euh...tu sais quand tu sauvegarde une image au format JPEG, tu fais de la transformee de fourier discrete, a priori, un pentium 200 fait ca sans probleme, a moins que t'ai une image en 10000 par 10000 auquel effectivement c'est limite. M'enfin c'est clair que c'est pas la solution a retenir... c'est vraiment si tu es desespere et que ca fait deux mois que tu planches... c'est la solution bien bourrin quoi :D

Reply

Marsh Posté le 12-03-2003 à 18:55:08    

Citation :


tout le probleme c'est que ces deux lignes me seront peut etre fournie sans indication de liens entre elle (je ne sais pas que la ligne 1 va rejoindre la ligne 34).

 
 
Indépendamment de ce problème, tu peux quand meme te débrouiller pour que toutes tes formes (lignes et courbes) débutent et se terminent pile sur un pixel. D'ailleurs, c'est peut-etre deja comme ça dans ton cahier des charges.
A moins que les coordonnées de tes formes soient en float... ?

Reply

Marsh Posté le 13-03-2003 à 01:57:24    

le blur est une methode d'anti aliasing comme une autre.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 13-03-2003 à 02:02:40    

C'est d'ailleurs comme ca que tu fais le edge antialiasing
(je verrai bien ça dans ton cas)
tu mémorises les lignes que tu traces et tu passe un filtre flou centré sur tes lignes et tes bords de polygones.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 22-04-2003 à 09:11:44    

bon me revoila :O
 
Pour ceux que ca interesse, pour le tracage courbes de bezier, y'a un algo bien bourrin qui existe, cf les documents d'un certains A.E Fabris qui a l'air d'etre l'expert en bezier, au vu du nombre de documents qu'il a ecrit dessus (recherche sur "High quality rendering of two dimensional continous curves" par ex Notez que l'algo presenté peut etre étendu au lignes (logique) et ptet meme aussi au poly, fo voir). Par contre je vois pas trop comment utiliser cet algo pour faire autre chose que des lignes remplies uniformément, c bien dommage. (pointille out, mais j'imagine que c ce que l'auteur voulait dire avec son "continous" ). Evidemment pour ce genre de sport on peut subdiviser la courbe de bezier en troncon decrivant nos pointillés...
 
Sinon, legreg (avec 3 ans de retard) je ne pense pas que memoriser les edges + faire un flou par dessus soit une bonne idee (imagine un petit poly recouvert par un gros, tu va faire du flou en plein milieu du gros, ca peut etre un peu laid...)
 
voila je continue a bricoler


Message édité par chrisbk le 22-04-2003 à 09:12:57
Reply

Marsh Posté le 22-04-2003 à 09:11:44   

Reply

Marsh Posté le 22-04-2003 à 10:59:32    

souk a écrit :

ben chaipa, c'est vachement specifique quand meme :)  
 
a premiere vue, je vois trois solutions pas trop compliquees:
- solution bateau: tu prends chaque pixel et tu reevalue sa couleur en fonction de ses voisins, mais ton image risque de "baver" d'un peu partout


A mon avis, tu obtiendras plus un effet de flou qu'autre chose !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 11:02:07    

chrisbk a écrit :

Non seulement mes maths me laissent en retrait pour ce genre de truc, mais en plus je crains que ca ne soit bpc trop gourmand pour la cible (200Mhz)


La transformée de Fourier, c'est pas si gourmand que ça hein ! :o
Un 200 Mhz devrait suffire je pense.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 11:02:58    

Bon, comme d'hab, multigrilled de partout !
Je pars :(
 
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 11:08:35    

Harkonnen a écrit :

Bon, comme d'hab, multigrilled de partout !
Je pars :(
 
[:neowen]


 
han, et moi qui esperais trop une reponse passionnante et precise quand g vu ton nom :( :D

Reply

Marsh Posté le 22-04-2003 à 11:24:29    

chrisbk a écrit :


 
han, et moi qui esperais trop une reponse passionnante et precise quand g vu ton nom :( :D


Je serais enclin à te proposer la solution n°2 de souk : la transformée de Fourier pour rechercher les endroits anguleux, et un flou sur ces endroits. La Transformée de Fourier est au traitement de signal ce que le produit scalaire est à la programmation 3D : un véritable marteau pilon !
Si ce qui t'effraie est la transformée de Fourier, c'est un faux problème : tu as des librairies qui s'en occupent très bien. A ce titre, je te conseille la librairie FFTW qui dispose de perfs hallucinantes, est portable et possède un truc génial : elle s'adapte automatiquement à des tailles non puissances de 2 ! Quant à la puissance nécessaire, ou est le problème ? Tu ne fais la transformée qu'une fois, donc rien ne t'empeche de temporiser en attendant. Mais tu verras, la FFTW est proprement hallucinante en terme de perfs ! Je l'ai utilisée une fois sur une image pour simuler un trait au fusain, et j'ai pleuré devant sa rapidité !
 
Une fois les bords localisés avec la Transformée, tu appliques une bonne vieille moyenne des pixels des familles sur les bords, et roulez jeunesse !
 
A mon avis, c'est la solution possédant le meilleur rapport temps/perfs.


Message édité par Harkonnen le 22-04-2003 à 11:25:22

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 12:31:30    

Le coup de la FFT me semble un peu limite :/
 
Pour quoi ne pas reprendre un principe de l'anti-aliasing en 3D, en gros basé sur les pourcentages de surfaces occupées ?


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 22-04-2003 à 12:36:27    

Tetragrammaton IHVH a écrit :

Le coup de la FFT me semble un peu limite :/


Pour de la 2D, ça me semble suffisant [:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 12:41:32    

Harkonnen a écrit :


Pour de la 2D, ça me semble suffisant [:sinclaire]
 


 
C'est quand même un peu limite de résoudre un problème de géométrie (des pourcentages de surfaces rectangulaires à répartir dans des carrés) par du traitement du signal.  
 
Edit : Disons que c'est mon point de vue "philosophique", mais si ça marche.... :D


Message édité par Tetragrammaton IHVH le 22-04-2003 à 12:54:19

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 22-04-2003 à 13:27:34    

Tetragrammaton IHVH a écrit :

Edit : Disons que c'est mon point de vue "philosophique", mais si ça marche.... :D


[:sinclaire]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-04-2003 à 11:12:12    

chrisbk a écrit :


Sinon, legreg (avec 3 ans de retard) je ne pense pas que memoriser les edges + faire un flou par dessus soit une bonne idee (imagine un petit poly recouvert par un gros, tu va faire du flou en plein milieu du gros, ca peut etre un peu laid...)


 
et a quoi il sert mon buffer de profondeur ?
pour des prunes ou quoi ?
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 23-04-2003 à 11:14:19    

legreg a écrit :


 
et a quoi il sert mon buffer de profondeur ?
pour des prunes ou quoi ?
 
LeGreg
 


 
ben je vois pas ou t'en a fais mention, et si je pourrais eviter d'accumuler les buffers de ci de la je ne serais pas specialement malheureux :D

Reply

Marsh Posté le 23-04-2003 à 11:19:27    

chrisbk a écrit :


ben je vois pas ou t'en a fais mention, et si je pourrais eviter d'accumuler les buffers de ci de la je ne serais pas specialement malheureux :D


 
edge antialiasing => quelques cartes 3d le faisaient
donc le buffer de profondeur vient gratos.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 23-04-2003 à 11:24:38    

legreg a écrit :


 
edge antialiasing => quelques cartes 3d le faisaient
donc le buffer de profondeur vient gratos.
 
LeGreg


 
Ah mon dieu, si j'avais une carte 3d a dispo, j'utiliserais le FSAA, les fonctions de ladite carte et au diable tout ca :D

Reply

Marsh Posté le 23-04-2003 à 11:29:11    

chrisbk a écrit :


 
Ah mon dieu, si j'avais une carte 3d a dispo, j'utiliserais le FSAA, les fonctions de ladite carte et au diable tout ca :D


 
des cartes 3d ? j'en vends ..
..enfin bientot..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 23-04-2003 à 11:30:04    

legreg a écrit :


 
des cartes 3d ? j'en vends ..
..enfin bientot..
 
LeGreg


 
tu te met a la vente de carte 3d a la criée  ?

Reply

Marsh Posté le 23-04-2003 à 11:33:50    

chrisbk a écrit :


 
tu te met a la vente de carte 3d a la criée  ?


 
eheh..
 
Il parait que le marche du middleware n'etait pas si porteur
que ca alors une reorientation de carriere s'impose..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 12-05-2003 à 13:00:59    

je me permet de remonter ce topic pour signaler a ceux que ca interesse qu'il y a un fort interessant article a ce sujet dans Graphics Gem I page 76 (sur l'AA de poly) et les resultats obtenus sont tout a fait satisfaisant, voir meme plus. (Si y'en a que ca interesse et qui ont pas le bouquin je veux bien developper)


Message édité par chrisbk le 12-05-2003 à 13:01:35
Reply

Marsh Posté le 12-05-2003 à 15:13:49    

[:blueflag]  :ange:
 
EDIT: oué ca m'intéresse [:rougit]


Message édité par zion le 12-05-2003 à 15:14:22

---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 12-05-2003 à 15:39:32    

ok :O
je ferais mon petit cours ce soir  :O

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed