ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
Je confirme mon soupçon : l'étoile en bas doit être un 1.
J'ai fait des tests, si on met deux étoiles, on peut supprimer une composante d'un coup car on peut supprimer deux pixels voisins en un seul passage.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Est ce que tu aurais l'article que tu as utilisé pour écrire ce code ?
Les masques sont sensiblement différents (type et ordre).
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
Le document est en lien dans le post #1. Le 'meilleur' code est dans le post #4.
Je n'ai que légèrement modifié l'algo. J'ai ajouté la condition obligatoire "CN(P)>3 si Trans(P)==1" qui protège d'un effacement trop violent et qui m'assure l'idempotence.
Edit: ah oui, j'ai oublié de dire que je ne flaguais pas les pixels mais que je les effaçais directement (ce qui m'oblige a garder un buffer de 3 lignes pour calculer le voisinage CN(P))
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
Bonsoir à vous,
Ce programme existe il en C++ / C ?
Ou dans une fonction OpenCV ??
Merci.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
J'ai tenté un passage en niveaux de gris de cet algorithme, mais sans succès.
Voilà mes modifications :
- les -1 sont maintenant des constantes OTHER.
- les 0 et 1 sont remplacés par des LOWER/HIGHER
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 private int neighbourhood(int[][] c, int x, int y) { if ( c[x-1][y-1] != 0 ) neighbourhood++ ; ... } private int transitions(int[][] c, int x, int y) { if ( c[x-1][y-1] < c[x-1][y ] ) transitions++ ; ... } private boolean matchPattern(int[][] c, int x, int y, int[] pattern) { for (int i=0 ; i < 8 ; i++) switch ( pattern[i] ) { case OTHER : break ; case HIGHER : if ( !(c[x][y] <= c[x+dx[i]][y+dy[i]]) ) return false ; break ; case LOWER : if ( !(c[x+dx[i]][y+dy[i]] < c[x][y]) ) return false ; break ; default : throw new Error("Must not occured.") ; } return true ; }
Mais ça ne fonctionne pas du tout :-(
Seulement quelques pixels sont supprimés et j'obtiens tout sauf un squelette.
Qu'est ce que je n'ai pas compris ?
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
Heu... il faut aussi modifier les méthodes neighbourhood() et transitions() pour tenir compte de la valeur du pixel central.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 /** * Skeleton Filter for gray-levels images * * Original algorithm : Dr. Chai Quek * Modified algorithm : Xavier Philippeau * * @author Xavier Philippeau (based on work of Dr. Chai Quek) * */ public class SkeletonGrayFast { // Smoothing pattern private byte[] pattern1={-1,1,0,1,0,0,0,0}; private byte[] pattern2={0,1,0,1,-1,0,0,0}; private byte[] pattern3={0,0,-1,1,0,1,0,0}; private byte[] pattern4={0,0,0,1,0,1,-1,0}; private byte[] pattern5={0,0,0,0,-1,1,0,1}; private byte[] pattern6={-1,0,0,0,0,1,0,1}; private byte[] pattern7={0,1,0,0,0,0,-1,1}; private byte[] pattern8={0,1,-1,0,0,0,0,1}; // Neighbourhood private int neighbourhood(int[][] c,int x,int y) { int neighbourhood=0; int ref=c[x][y]; if (ref <= c[x-1][y-1]) neighbourhood++; if (ref <= c[x-1][y ]) neighbourhood++; if (ref <= c[x-1][y+1]) neighbourhood++; if (ref <= c[x ][y+1]) neighbourhood++; if (ref <= c[x+1][y+1]) neighbourhood++; if (ref <= c[x+1][y ]) neighbourhood++; if (ref <= c[x+1][y-1]) neighbourhood++; if (ref <= c[x ][y-1]) neighbourhood++; return neighbourhood; } // Transitions Count private int transitions(int[][] c,int x,int y) { int transitions=0; int ref=c[x][y]; if (c[x-1][y-1]<ref && c[x-1][y ]>=ref) transitions++; if (c[x-1][y ]<ref && c[x-1][y+1]>=ref) transitions++; if (c[x-1][y+1]<ref && c[x ][y+1]>=ref) transitions++; if (c[x ][y+1]<ref && c[x+1][y+1]>=ref) transitions++; if (c[x+1][y+1]<ref && c[x+1][y ]>=ref) transitions++; if (c[x+1][y ]<ref && c[x+1][y-1]>=ref) transitions++; if (c[x+1][y-1]<ref && c[x ][y-1]>=ref) transitions++; if (c[x ][y-1]<ref && c[x-1][y-1]>=ref) transitions++; return transitions; } // math a single pixel private boolean matchPixel(int ref, int pixel, byte pattern) { if (pattern==-1) return true; if (pattern==0 && pixel<ref) return true; if (pattern==1 && pixel>=ref) return true; return false; } // Match a pattern private boolean matchPattern(int[][] c,int x,int y,byte[] pattern) { int ref=c[x][y]; if (!matchPixel(ref,c[x-1][y-1],pattern[0])) return false; if (!matchPixel(ref,c[x-1][y ],pattern[1])) return false; if (!matchPixel(ref,c[x-1][y+1],pattern[2])) return false; if (!matchPixel(ref,c[x ][y+1],pattern[3])) return false; if (!matchPixel(ref,c[x+1][y+1],pattern[4])) return false; if (!matchPixel(ref,c[x+1][y ],pattern[5])) return false; if (!matchPixel(ref,c[x+1][y-1],pattern[6])) return false; if (!matchPixel(ref,c[x ][y-1],pattern[7])) return false; return true; } // Match one of the 8 patterns private boolean matchOneOfPatterns(int[][] c,int x,int y) { if (matchPattern(c,x,y,pattern1)) return true; if (matchPattern(c,x,y,pattern2)) return true; if (matchPattern(c,x,y,pattern3)) return true; if (matchPattern(c,x,y,pattern4)) return true; if (matchPattern(c,x,y,pattern5)) return true; if (matchPattern(c,x,y,pattern6)) return true; if (matchPattern(c,x,y,pattern7)) return true; if (matchPattern(c,x,y,pattern8)) return true; return false; } /** * Skeletonize the image using succesive thinning. * * @param image the image in an array[x][y] of values "0" or "1" * @param width of the image = 1st dimension of the array * @param height of the image = 2nd dimension of the array */ public void thinning(int[][] image,int width,int height) { // 3 columns back-buffer (original values) int[][] buffer = new int[3][height]; // initialize the back-buffer for(int y=0;y<height;y++) { buffer[0][y]=0; buffer[1][y]=image[0][y]; buffer[2][y]=image[1][y]; } // loop until idempotence for(int loop=0;;loop++) { boolean changed=false; // for each columns for(int x=1;x<(width-1);x++) { // shift the back-buffer + set the last column int[] swp0 = buffer[0]; buffer[0]=buffer[1]; buffer[1]=buffer[2]; buffer[2]=swp0; for(int y=0;y<height;y++) buffer[2][y]=image[x+1][y]; // for each pixel for(int y=1;y<(height-1);y++) { // pixel value int v = image[x][y]; // pixel not set -> next if (v==0) continue; // is a boundary/extremity ? int currentNeighbourhood = neighbourhood(buffer,1,y); if (currentNeighbourhood<=1) continue; if (currentNeighbourhood>=6) continue; // is a connection ? int transitionsCount = transitions(image,x,y); if (transitionsCount==1 && currentNeighbourhood<=3) continue; // no -> remove this pixel if (transitionsCount==1) { changed=true; image[x][y]=0; continue; } // can we delete this pixel ? boolean matchOne = matchOneOfPatterns(image,x,y); // yes -> remove this pixel if (matchOne) { changed=true; image[x][y]=0; continue; } } } // no change -> return result if (!changed) return; } } }
Edit: par contre, mon principe de modifier directement l'image risque de propager des artefacts avec les niveaux de gris. Il faut que je vois ca de plus près.
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
Merci, ça fonctionne correctement (mais pas pour mon application qui est trop tordue).
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
j'ai vu le post 4. Et le truc c'est que je me demandais si c'était possible d'utiliser cette fonction java en l'appelant d'un programme C++.
Parce que je suis entrain de développer une application de reconnaissance Rétinienne. et je n'ai pas trop de base en Java.
Et si y'a une âme charitable a déjà fait la traduction du code, qui pourrait me l'envoyer sa serais génial !
Je ne sais pas si le double post est permis ou pas. ^^
desolé d'avance..
Je voulais demander cette fois ci, si il y'avait seulement la partie de détection des points de bifurcations.
Et si vous connaissez une méthode à utiliser pour avoir les points de bifurcations d'un squelette.
Voilà
Merci.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
- ton poste tu dois marquer quand la bonne réponse tu as obtenu.
salut,
j'aimerai si possible savoir ce que donne le code pour cette image d'empreinte digitale:
merci d'avance
Un thésard a souvent un problème de motivation jusqu'au moment où il aura un problème de temps....
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager