|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Une petite classe java pour calculer la carte des distances par la méthode des masques de Chamfer.
La methode compute() prend en entré un tableau binaire et retourne un tableau de flotant. Chaque case [x][y] du tableau contient la distance entre le pixel [x][y] et le "1" le plus proche dans l'image binaire. ![]() A gauche: l'image binaire en entrée A droite: la carte des distances (l'intensité représente la distance) Code java :
exemple d'utilisation: Code java :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||||
|
00
|
|
|
#2 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Quelques mots d'explications sur cet algo.
Le principe du calcul de la carte des distances c'est de partir des points du contour de l'objet (distance=0) et de calculer la distance des voisins. si (x,y) est un point du contour de l'objet, alors on a d(x,y)=0, et pour les 9 voisins on a:
Ensuite on calcule les voisins des voisins et ainsi de suite. Si on tombe sur un pixel déja calculé, on conserve la distance la plus petite. On a besoin de faire seulement 2 passes sur l'image (forward, backward) pour avoir la totalité de la carte. L'utilisation des masques de Chamfer permet d'accélérer les calculs: comme les calculs impliquant les réels (racine(2)) sont couteux, on préfere utiliser seulement des distances entières (en multipliant par un facteur), et en redivisant les distances à la fin. Pour affiner les calculs, on ne calcule pas les voisins immédiats d'un pixel, mais les voisins qui minimise l'erreur liée a l'approximation entiere. Ca nous donne les masques de Chamfer, par exemple pour un voisinage 5x5: Code :
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#3 |
|
Membre expérimenté
![]() |
__________________
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!» |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : avril 2008 Messages : 6 ![]() |
Bonjour tout le monde,
Merci pour ces explications, ca aide énormément! Cependant j'ai une petite question (dsl :/). Tu dis qu'il ne faut que deux passes ? - une forward : tu prend chaque pixel et tu applique le masque des distances (seulement aux pixels du contour alors ?) - une backward : tu prend chaque pixel du contour + les pixels qui ont déja une distance ( les voisins directs du contour en quelque sorte ?) En fait je pense que je viens de répondre tout seul à ma question, il ne faut pas prendre que le contour lors de la première passe mais aussi les points que tu viens juste de changer c'est ca ? Merci pour ces supers explications !! |
|
|
00
|
|
|
#5 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : avril 2008 Messages : 6 ![]() |
Héhé super
C'est pas bon d'essayer de comprendre un algo le matin à 8h :/ Fallait le temps que le cerveau se mette en marche ! Bon je vais essayer de coder ca, et je vous donne le résultat a la fin Merci beaucoup !!! |
|
|
00
|
|
|
#7 | |
|
Membre expérimenté
![]() |
Bonjour,
J'aurai besoin de quelques précisions concernant la procédure Compute : Cette méthode qui consiste à faire un passage directe puis un passage inverse afin de parcourir tous les pixels,a t elle un nom ? Ma deuxième question est encore plus ridicule Citation:
__________________
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste!!» |
|
|
|
00
|
|
|
#8 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
Citation:
Le mot "chanfrein" désigne effectivement la petite surface qu'on obtient en "cassant" une arête vive (ah... souvenirs du bac E). Pourquoi l'utiliser ici ? Et bien, c'est lié à la figure obtenue en reliant les points a une distance de "1" du centre. Dans un espace continu, cette figure est un cercle de rayon 1(
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 1 ![]() |
salut pour tous, je suis debutant , je cherche une definition exacte de la carte de distance(surtout par rapport à quoi est calcule la distance d'un pixel)
|
|
|
00
|
|
|
#10 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
On marque certains pixels comme étant des références (en mettant leur distance a 0) et l'algo calcule pour tous les pixel la distance la plus courte jusqu'a ces pixels de références. Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#11 | |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 3 ![]() |
Citation:
|
|
|
|
00
|
|
|
#12 |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
c'est le tableau utilisé pour "marquer" les pixels de référence.
Si tu veux que le pixel (a,b) de ton image soit un pixel de référence distance=0), alors tu mets à 'true" la valeur du tableau: input[a][b]=true;
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : avril 2009 Messages : 3 ![]() |
|
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : avril 2008 Messages : 14 ![]() |
Merci pour le code
Juste une question: comment on fait après pour convertir le double[][] en image? J'ai essayé de créer un byte[] et ensuite créer un bufferedImage comme ca mais j'ai l'impression que ca deforme un peu l'image :s |
|
|
00
|
|
|
#15 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
double gray = 255 * Math.min( 1 , Math.log(1+distmap[x][y]/50) );
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : avril 2008 Messages : 14 ![]() |
merci
Le seul problème est que maintenant, là ou la distance vaut 0, j'ai un point blanc. Regarde l'image: |
|
|
00
|
|
|
#17 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
gray = 255 * Math.min( 1 , Math.log(1+distmap[x][y]/50) ); = 255 * Math.min( 1 , Math.log(1+0) ); = 255 * Math.min( 1 , Math.log(1) ); = 255 * Math.min( 1 , 0 ); = 255 * 0 = 0
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
|
|
#18 | ||
|
Invité de passage
![]() Inscription : avril 2008 Messages : 14 ![]() |
Oui c'est ce que je me suis dit aussi
![]() Je pense que le problème est la conversion de données...j'ai un int[] et je cherche à obtenir une image, pour cela je fais Code :
|
||
|
|
00
|
|
|
#19 |
|
Candidat au titre de Membre du Club
![]() Inscription : mai 2009 Messages : 13 ![]() |
Bonjour,
Que représente et à quoi servent le matrices : chessboard, chamfer3,chamfer5, ... Je suppose qu'il s'agit des masques, mais comment ceux-ci fonctionnent-ils? Un tout grand merci d'avance! |
|
|
00
|
|
|
#20 | |
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
Les masques sont stockés sous la forme {i, j, valeur}, où i,j sont les coordonnées de la case du masque (centré en 0,0). Le masque est complètement symétrique donc on ne stocke pas les cases {i,-j} {-i,j} {-i,-j}. La première case stockée est toujours {1,0}, cette case nous donne donc le "facteur" de multiplication utilisé pour le masque. Pour ce qui est du "comment" on calcule les valeurs d'un masque, je vous conseille une petite recherche internet avec les mot clés: chamfer coefficient Farey triangulation.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com