IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[image] Filtre Squelette pour ImageJ


Sujet :

Contribuez

  1. #21
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

  2. #22
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  3. #23
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

  4. #24
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  5. #25
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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.

  6. #26
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

  7. #27
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  8. #28
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

    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.

  9. #29
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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.

  10. #30
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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.

  11. #31
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6
    Points
    6
    Par défaut
    Bonsoir à vous,

    Ce programme existe il en C++ / C ?
    Ou dans une fonction OpenCV ??
    Merci.

  13. #33
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  14. #34
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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.

  15. #35
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    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 : 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.

  16. #36
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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.

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6
    Points
    6
    Par défaut
    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 !

  18. #38
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 6
    Points
    6
    Par défaut
    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.

  19. #39
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    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, 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.

  20. #40
    Membre actif Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Points : 214
    Points
    214
    Par défaut
    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....

Discussions similaires

  1. [Image] Filtre UnNoise pour ImageJ
    Par pseudocode dans le forum Contribuez
    Réponses: 37
    Dernier message: 07/03/2008, 16h23
  2. [Image] Filtre de Canny pour ImageJ
    Par pseudocode dans le forum Contribuez
    Réponses: 18
    Dernier message: 13/09/2007, 19h01
  3. [Image] Filtre UnNoise pour ImageJ
    Par pseudocode dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 03/04/2007, 23h38
  4. filtre séparable pour une image
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 31/05/2005, 16h45
  5. []filtre sepia pour les images
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/01/2004, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo