|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||||||||
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Bonjour,
Etant donné que la documentation sur les opérateurs morphologiques d'érosion et de dilatation sur des images en couleurs est assez difficile à trouver, je vais vous expliquer le principe. La diffusion et l'érosion s'effectue suivant un noyau, en général, quand on voit ces opérateurs, on travaille avec des images binaires : Par exemple, l'érosion : Code :
Code :
Pour la dilatation, On centre le noyau de tel façon à ce qu'il recouvre le pixel de destination (x,y) à changer, si l'un des pixels de l'image d'origine dispose d'un 1 là où il y a un 1 dans le noyau, alors l'image de destination (x,y) vaudra 1. On fait l'inverse pour l'érosion. On suppose que l'on dispose d'un objet Kernel qui dispose des opérations suivantes : Code :
Pour la dilatation par exemple : Code :
Cette méthode fonctionne bien pour des images binaires, mais pas pour des images qui dispose de plusieurs niveaux de gris, la méthode général est la suivante : Pour l'érosion : 1. Pour chaque pixel de la source, placer le noyau sur l'image centré sur le pixel (i,j) 2. Pour chaque pixel du noyau (positionné), soustraire la valeur du noyau * le pixel décalé au pixel central (i,j) 3. Déterminer le minimum de toutes ces valeurs 4. Ajouter le minimum au pixel central (i,j) Algorithme avec une notation C++ : Code :
1. Pour chaque pixel de la source (i,j), placer le noyau sur l'image centré sur le pixel 2. Pour chaque pixel du noyau (positionné), soustraire la valeur du pixel central (i,j) au produit noyau * le pixel décalé 3. Déterminer le maximum de toutes ces valeurs 4. Ajouter le maximum au pixel central (i,j) Code :
Classiquement, on utilise le noyau : Voici un exemple : Source : ![]() Erosion : ![]() Dilatation :
__________________
Je ne répondrai à aucune question technique en privé |
||||||||||||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Inscription : mai 2005 Messages : 818 ![]() |
Je ne suis pas d'accord avec toi, et je me trompe peux être mais quand tu dis que pour la dilatation, tu prends la valeur max du voisinage que tu ajoutes au pixel central.... Pour moi le dilaté d'un voisinage, c'est remplacé le pixel central par le max du voisinage...
Dans mon tutoriel j'explique l'erosion et la dilatation en suivant mes cours de Maths morphos... Peut être que j'ai tort. Mais ca n'empeche que tu as fais du bon boulot pour cette algo. Ca mérite peut être d'autre avis...
__________________
Dis moi qui tu suis, je te dirais qui je Hais! Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit Mon premier Tutoriel You are safe in Parp1City .... (AC DC) Ensemble luttons contre le chômage de parp1City! A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes... |
|
|
00
|
|
|
#3 | |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Le max du voisinage, pas tout à fait, c'est le max des valeurs du genre :
-image.getPixel(i,j, canal) + kernel(ki, kj) * image.getPixel(i + ki - kernel.getXOrigin(), j+ kj - kernel.getYOrigin(), canal); Citation:
Dans le cas d'image binaire, c'est équivalent à ta méthode.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Bon, a priori, il y aurait plusieurs stratégies :
J'avais choisi celle là : http://developer.apple.com/documenta...section_2.html Ici : http://www.tsi.enst.fr/~bloch/ANIM/morpho.pdf Ce qu'ils appelent l'érosion fonctionelle, c'était ta méthode. Mais ils ont également la dilatation par fonction, ce qui serait plus proche de ma méthode.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() Inscription : mai 2005 Messages : 818 ![]() |
OK Je suis donc d'accord avec toi! dslé pour le dérangement mais je préféré me renseigner, Comme ca je sais qu'il existe plus facon d'erodé...
__________________
Dis moi qui tu suis, je te dirais qui je Hais! Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit Mon premier Tutoriel You are safe in Parp1City .... (AC DC) Ensemble luttons contre le chômage de parp1City! A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes... |
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Je viens d'implémenter la méthode avec juste le minimum (il faut un peu modifier l'algorithme) :
La première image, c'est avec l'algo du haut, la deuxième image c'est juste avec le minimum. J'ai une préférence pour la première qui a tendance à rendre moins flou (enfin, ce n'est que visuel ma remarque) ![]()
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 15 ![]() |
Bonjour,
ton algo a l air pas mal pour les images en plusieurs niveau de gris, mais j ai beau le relire, et je conçois que c est un peu dur à expliquer avec des mots, mais je suis pas sur de l avoir compris! donc dis moi si je me trompe ( ce qui est fortement possible!) si je prends une matrice du genre 2 6 7 9 9 8 12 4 6 7 3 7 2 7 11 1 admettons que je veuille appliquer l érosion au pixel de valeur 12 avec le masque 0 1 0 1 1 1 0 1 0 mon pixel aura pour valeur le minimum parmi : 12 - 7 ; 12 - 4 ; 12 - 3; 12 - 8 ? ou pas du tout lol et pour la dilatation, on prend le maximum? merci de m éclaircir un peu |
|
|
00
|
|
|
#8 | |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Citation:
Ca donne un buffer avec ça comme valeur : 12 - 0 * 6 = 12 12 - 1 * 7 = 5 12 - 0 * 9 = 12 12 - 1 * 8 = 4 12 - 1 * 12 = 0 12 - 1 - 4 = 8 12 - 0 * 7 = 12 12 - 1 * 3 = 9 12 - 0 * 7 = 12 Tu prends le minimum : 0 Tu l'ajoutes au pixel central : 12 + 0 = 12 Pas de chance, c'est le pixel le plus important, donc il n'y a pas de différence sur celui là Pour la dilatation, il faut prendre le maximum des valeurs suivantes : buffer[klargeur * kj + ki] = -image.getPixel(i,j, canal) + kernel(ki, kj) * image.getPixel(i + ki - kernel.getXOrigin(), j+ kj - kernel.getYOrigin(), canal); C'est à dire : -12 + 0 * 6 - 12 + 1* 7 = -5 .....
__________________
Je ne répondrai à aucune question technique en privé |
|
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 15 ![]() |
j étais effectivement à coté de la plaque !
merci beaucoup pour ton eclaircissement! |
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 15 ![]() |
finalement j ai besoin d encore un ou 2 petits eclaircissements supplémentaires
en fait, donc quand on effectue l érosion, on va forcément se retrouver avec des pixels négatifs, si j ai bien compris, car si dans l exemple précédent, si la valeur du pixel était 2 et pas 12, le minimum choisi aurait été : 2- 1*8=-6 et donc la valeur de ce pixel apres érosion aurait été 2-6=-4. bon ça à la limite vu que je suis novice en "traitement d'image", je trouvais ça bizarre mais pourquoi pas apres tout! de plus, à la base, je voulais faire une ouverture ( dilatation de l'érodé) dans le but d 'éliminer des "artéfacts", mais j'ai l impression qu en appliquant ton algo, ça ressemblerait plus à une fermeture, ça aurait plutot tendance à "combler les fossés", en comparaison avec l autre algo où on prend le voisin minmum pour l érosion et le maximum pour la dilatation et qui a l air de mieux fonctionner. désolé si j ai mal compris ou alos que les erreurs viennent de moi |
|
|
00
|
|
|
#11 | ||
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Citation:
Ca arrive fréquemment d'avoir dans des filtres qui dépassent les bornes, il faut juste tout remettre dans 0-255 au moment de l'enregistrement. Citation:
__________________
Je ne répondrai à aucune question technique en privé |
||
|
|
00
|
|
|
#12 | |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 144 ![]() |
Citation:
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
|
00
|
|
|
#13 |
|
Candidat au titre de Membre du Club
![]() Développeur informatique Inscription : février 2008 Messages : 17 ![]() |
bonjour,
merci pour ces discussions qui éclairent bien ma lanterne. Avez vous l'expérience de la meilleure méthode à utiliser pour traiter les bords de l'image? Ou les avantages et les inconvénients des plus classiques? Merci. |
|
|
00
|
|
|
#14 |
|
Membre actif
![]() Inscription : mars 2008 Messages : 209 ![]() |
une question à Millie : pour une image couleur tu fait le même traitement pour chaque canal ?
|
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Oui, c'est ce que j'ai fait pour mes images d'exemple.
__________________
Je ne répondrai à aucune question technique en privé |
|
|
00
|
|
|
#16 | |||||
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Citation:
(code du genre : Code java :
Une autre méthode va être de combler les bords par du noir, ce qui donne souvent des petites imperfections sur les bords. L'avantage de ces techniques et qu'il n'est pas nécessaire de modifier le code existant. Ce qui est parfois fait également, c'est d'ajouter du code dans le filtre pour ne pas prendre en compte les pixels qui dépassent. Ce que fait par exemple pseudocode dans sa contribution : http://www.developpez.net/forums/d41...ture-features/ avec les lignes : Code java :
Mais sur certains types de filtre (erosion, convolution etc.), il est facilement possible d'éviter cette astuce qui est plutôt utilisé dans les filtres difficile à écrire ou dans les filtres avec des itérations.
__________________
Je ne répondrai à aucune question technique en privé |
|||||
|
|
00
|
|
|
#17 | ||
![]() ![]() Xavier PhilippeauArchitecte système Inscription : décembre 2006 Messages : 9 424 ![]() |
Citation:
1. Le code du BorderExtender aurait compléxifié la contrib 2. J'ai eu la flemme d'ecrire le BorderExtender ( )Citation:
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple. |
||
|
00
|
|
|
#18 |
|
Invité de passage
![]() okay_91 okay_91 Inscription : mars 2010 Messages : 3 ![]() |
Bonjour à tous.
Je souhaite faire une érosion pour une image en couleur, or je n'arrive pas a avoir un résultat correcte. Comment dois-je faire?? Si ma matrice est : [0 1 0 1 1 1 0 1 0 ] Et que les voisins du pixel que je traite ont pour valeurs rouge-vert-bleu suivante (pixel traité en gras) : [126 12 15 ; 174 187 30 ; 255 0 0 126 112 115 ; 108 112 115 ; 13 18 125 100 100 100 ; 150 150 90 ; 26 155 15 ] il faut que je fasse le traitement composante par composante comme ça : 108-0*(126) = 0 108-1*(174) = 108-174= -66 108-0*(255) = 0 108-1*(126) = 108-126=-18 108-1*(108) = 108-108=0 108-1*(13) = 108-13 = 95 108-0*(100) = 0 108-1*(150) = 108-150 = -42 108-0*(26) = 0 ... idem pour le vert (avec 112-.....) et le bleu (avec 115-........) et ensuite je prend le min (-66 dans le cas du rouge) que j'aditionne à 108 ce qui fait 42 que je stock dans la coposante rouge du pixel traité?? (idem pour vert et bleu). C'est comme cela qu'il faut faire ??? Merci par avance. |
|
|
00
|
|
|
#19 | |
![]() ![]() Inscription : juin 2006 Messages : 6 929 ![]() |
Citation:
__________________
Je ne répondrai à aucune question technique en privé |
|
|
|
00
|
|
|
#20 | |||
![]() ![]() Guillaume Chercheur en informatique Inscription : janvier 2006 Messages : 4 404 ![]() |
Bonjour,
Euh... non désolé, il n'y en a qu'une seule. Si on regarde le cours de Jean Serra page 16 (un des fondateurs de la morphomath) ou le cours que tu cites d'Isabelle Bloch (dont la réputation n'est plus à faire en traitement d'image) page 101 équation 6.9, tu vois que c'est le sup qu'il faut prendre. Citation:
Voici un code java pour des images binaires ou en niveaux de gris. Pour un gain de rapidité, les coordonnées des pixels non nuls de l'élément structurant ont été placées dans un tableau à une dimension. Code java :
__________________
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.
|
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com