Précédent   Forum du club des développeurs et IT Pro > Autres langages > Algorithmes > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/05/2011, 10h04   #21
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
Mon souci est que je dois l'appliquer sur un squelette en niveaux de gris :-(
Je ne vois pas en quoi ca pose un problème dans la phase de simplification du squelette.

A moins qu'il y ait une subtilité dont je n'ai pas conscience ?
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 10h21   #22
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par pseudocode Voir le message
Je ne vois pas en quoi ca pose un problème dans la phase de simplification du squelette.

A moins qu'il y ait une subtilité dont je n'ai pas conscience ?
Effectivement.
J'ai appliqué les masques classques avec un min/max pour travailler en niveaux de gris, mais ça ébarbule TRES fort.
Je commence donc à avoir un sacré doute sur les deux étoiles... je me demande si en fait il n'y aurait pas un 1 à la place de l'une des deux.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h13   #23
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
Effectivement.
J'ai appliqué les masques classques avec un min/max pour travailler en niveaux de gris, mais ça ébarbule TRES fort.
Je commence donc à avoir un sacré doute sur les deux étoiles... je me demande si en fait il n'y aurait pas un 1 à la place de l'une des deux.
Le masque m'a l'air bon. Mais c'est vrai que l'ébarbulage avec ce masque est difficile à doser car il retire progressivement tous les endpoints. Si tu veux quelque chose de robuste, il vaut mieux passer par une autre méthode.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 14h18   #24
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par pseudocode Voir le message
Le masque m'a l'air bon. Mais c'est vrai que l'ébarbulage avec ce masque est difficile à doser car il retire progressivement tous les endpoints. Si tu veux quelque chose de robuste, il vaut mieux passer par une autre méthode.
Et en niveaux de gris, les "endpoints" sont différemment placés, donc en une itération tu peux supprimer un tiers de l'image.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 02h08   #25
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 10h56   #26
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
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.
J'avoue que je ne vois pas pourquoi c'est mieux, mais je te fais confiance.

Ce qui m'étonne c'est qu'avec un un masque du type
0 0 0
0 1 0
0 1 *
tu ne peux pas retirer les barbules qui sont en diagonales.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 14h58   #27
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par pseudocode Voir le message
J'avoue que je ne vois pas pourquoi c'est mieux, mais je te fais confiance.

Ce qui m'étonne c'est qu'avec un un masque du type
0 0 0
0 1 0
0 1 *
tu ne peux pas retirer les barbules qui sont en diagonales.
Il y a bien sûr les 8 rotations qui vont avec.

Du coup si on met les deux étoiles, deux points contigus peuvent être supprimés par deux masques symétriques.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 15h47   #28
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
Il y a bien sûr les 8 rotations qui vont avec.
Ah ok. J'en étais resté à 4 rotations.

Citation:
Du coup si on met les deux étoiles, deux points contigus peuvent être supprimés par deux masques symétriques.
Effectivement. Ton masque est moins agressif que celui habituel.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h38   #29
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h55   #30
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
Est ce que tu aurais l'article que tu as utilisé pour écrire ce code ?
Les masques sont sensiblement différents (type et ordre).
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.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 18h36   #31
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par pseudocode Voir le message
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))
ok merci, je vais aller m'acheter des yeux.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 02h10   #32
MehdiDrissi
Invité régulier
 
Homme Mehdi Drissi
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Mehdi Drissi
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 5
Points : 5
Bonsoir à vous,

Ce programme existe il en C++ / C ?
Ou dans une fonction OpenCV ??
Merci.
MehdiDrissi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h23   #33
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par MehdiDrissi Voir le message
Bonsoir à vous,

Ce programme existe il en C++ / C ?
Ou dans une fonction OpenCV ??
Merci.
Si tu regardes le code source du post #4, tu peux remarquer qu'à part le mot clé "class" et le fait qu'un byte en C est un char, tout le reste est du C.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 10h29   #34
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
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 :
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h54   #35
pseudocode
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 819
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 40
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Architecte système
Secteur : Industrie

Informations forums :
Inscription : décembre 2006
Messages : 9 819
Points : 16 471
Points : 16 471
Citation:
Envoyé par ToTo13 Voir le message
J'ai tenté un passage en niveaux de gris de cet algorithme, mais sans succès.
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 ?
Heu... il faut aussi modifier les méthodes neighbourhood() et transitions() pour tenir compte de la valeur du pixel central.

Code java :
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.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 16h35   #36
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 00h54   #37
MehdiDrissi
Invité régulier
 
Homme Mehdi Drissi
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Mehdi Drissi
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 5
Points : 5
Citation:
Envoyé par ToTo13 Voir le message
Si tu regardes le code source du post #4, tu peux remarquer qu'à part le mot clé "class" et le fait qu'un byte en C est un char, tout le reste est du C.
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 !
MehdiDrissi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 10h42   #38
MehdiDrissi
Invité régulier
 
Homme Mehdi Drissi
Étudiant
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Mehdi Drissi
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 5
Points : 5
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.
MehdiDrissi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 11h05   #39
ToTo13
Modérateur
 
Avatar de ToTo13
 
Homme Guillaume
Ingénieur de Recherche
Inscription : janvier 2006
Messages : 4 788
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 34
Localisation : Etats-Unis

Informations professionnelles :
Activité : Ingénieur de Recherche
Secteur : Santé

Informations forums :
Inscription : janvier 2006
Messages : 4 788
Points : 7 023
Points : 7 023
Citation:
Envoyé par MehdiDrissi Voir le message
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 !
Tu iras plus vite en copiant/collant le code et en remplaçant les mots clefs que j'ai cité plus haut.



Citation:
Envoyé par MehdiDrissi Voir le message
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.
il me semble que ce sont les points qui ont plus de deux voisins... si tu as un squelette linéaire.
__________________
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 correcteur orthographique pour FiReFox), mettre les ACCENTS et les BALISES => ECRIRE clairement et en Français tu DOIS.
- Le coté obscur je sens dans le MP => Tous tes MP 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.
ToTo13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 23h14   #40
SmileSoft
Membre actif
 
Avatar de SmileSoft
 
Inscription : mars 2008
Messages : 431
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 431
Points : 159
Points : 159
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....
SmileSoft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h17.


 
 
 
 
Partenaires

Hébergement Web