Aller au contenu

Segmentation images couleurs (EM)


Messages recommandés

Bonjour tout le monde, [/size]

J'ai appliqué l'algorithme EM pour la segmentation des images en niveau de gris et ça marchait. Pour les images couleurs RGB, j'ai appliqué le même algorithme EM pour chacune des composantes rouge , verte et bleue. Par exemple avec k (nombre de classes) = 3 j'ai obtenu 3 images correspondant chacune à une couleur et segmentée en 3 classes. [/size]
Mais le problème vient juste après la concaténation des 3 images segmentées([/size]imsegrgb=cat(3,m1,m2,m3);[/size]) : on obtient une images segmentée à un grand nombre de classes et normalement c'est logique et c'est égales à 27, ce qui n'est pas mon objectif. Le but est de faire la segmentation de l'image couleur en 3 classes en utilisant l'algorithme EM. [/size]
Que dois-je changer? Comment je peux procéder?[/size]

Lien vers le commentaire
Partager sur d’autres sites

Je n'y connais rien dans ce domaine mais vu de loin, pour obtenir 3 classes en final, il faudrait que tu segmentes en 3 images d'une seule classe chacune,

Je dis ça, je ne sais même pas si ton soft le permet. J'essaie d'aider en donnant des pistes.

Lien vers le commentaire
Partager sur d’autres sites

Par exemple avec k (nombre de classes) = 3 j'ai obtenu 3 images correspondant chacune à une couleur et segmentée en 3 classes.

Mais le problème vient juste après la concaténation des 3 images segmentées(imsegrgb=cat(3,m1,m2,m3);) : on obtient une images segmentée à un grand nombre de classes et normalement c'est logique et c'est égales à 27, ce qui n'est pas mon objectif. Le but est de faire la segmentation de l'image couleur en 3 classes en utilisant l'algorithme EM.

Ce n'était pas ce que tu indiquais...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour, et bienvenue sur le forum,

Je m'y connais pas en MATLAB, c'est trop matheux. Sur un site web, j'ai trouvé : "For all the question regarding to use the code for image segmentation, you have to orgnize the image into a matrix, where each column is the feature vector of one pixel of the image. For example, if RGB value is used, for a 10x10 image, the data matrix is a 3x100 matrix where each column is a vector of RGB value of a pixel." Je ne sais pas si ça peut aider.

Si je regarde les 6 derniers sujets MATLAB en cherchant dans le forum, il n'y a jamais eu de réponse. => #2

Lien vers le commentaire
Partager sur d’autres sites

@digital-jedi:

Tu n'as pas compris le truc.

J'ai regardé vite faite mais ce n'est que des maths avec des formules qui m’agressent SANS AUCUN EXEMPLE CONCRET

Ces matheux ne changeront jamais :fumer:

l'algo EM vient de Espérance et Maximisation Il comporte :

  • une étape d'évaluation de l'espérance (E), où l'on calcule l'espérance de la vraisemblance en tenant compte des dernières variables observées,
  • une étape de maximisation (M), où l'on estime le maximum de vraisemblance des paramètres en maximisant la vraisemblance trouvée à l'étape E.

Source Wiki: Algorithme espérance-maximisation

Le but si je me trompe pas c'est de trouver les contours dans une image :windu:

Donc c'est dans ton post que je ne comprend pas :zarb::zarb::zarb:

la concaténation des 3 images segmentées(imsegrgb=cat(3,m1,m2,m3);) : on obtient une images segmentée à un grand nombre de classes et normalement c'est logique et c'est égales à 27, ce qui n'est pas mon objectif. Le but est de faire la segmentation de l'image couleur en 3 classes en utilisant l'algorithme EM.
Que dois-je changer? Comment je peux procéder?

Le nombre de classe à ce que je comprends permet d’affiner ton résultat.

Plus le nombre est grand plus c'est précis mais plus c'est long :devil:

Et d'où vient ton 27? (oui je sais 3*9 :siffle:)

Est-ce qu'il y a notion de classes lors de concaténation d'images segmentées?

Est-ce qu'il y a une couche alpha?

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Ce sujet à 3 semaines mais tant pis, j'y apporte ma brique, peut-être que ça servira à d'autres.
Le post de green0076 est vraiment pas facile à saisir.
Est-ce un exercice défini qui impose l'utilisation de l'algo Expectation-Maximization ? Parce que pour de la segmentation d'image couleur, je pense pas que ce soit le plus adapté...

Pour donner quelques infos : Expectation-Maximization, c'est un modèle probabiliste qui permet... de faire un peu ce que l'on veut (héhé !). Moi, je m'en sers dans ma thèse pour trouver les individus "pas comme les autres" (individus décrits par de nombreuses caractéristiques (variables)).

Prenons le cas du problème de green0076 : on commence par supposer que la répartition des pixels de couleurs suit une gaussienne (sinon, EM, ça va pas super bien fonctionner...). Concentrons nous sur le canal rouge de l'image : la valeur des pixels varie entre 0 et 255 n'est ce pas ? ça roule. Observons un peu leur répartition (ce qui suit est un exemple) : l'image est composée de 1000 pixels, 500 ont une valeur comprise entre 10 et 35, 250 entre 100 et 120 puis enfin 250 pixels ont une valeur comprise entre 200 et 210. On obtient alors 3 blocs bien distincts non (que l'on peut représenter sur un histogramme) ? Et bien, les 3 bars de l'histogramme viennent formées 3 gaussiennes que l'on va appeler ici, des composantes (C1, C2 et C3). Maintenant :
- expectation : quelle est la probabilité d'être dans une composante Cx sachant la valeur de mon pixel rouge p? ( p(Cx | Couleur de p) -> 3 probabilités (une par composante). Ensuite : quelle est la probabilité d'avoir cette valeur de pixel sachant la composante (p(couleur de P | Cx)). Ce qui rentre en compte comme paramètre dans ces probabilités, pour faire simple, c'est la moyenne et la variance (des blocs de l'histogramme).
- maximization : quelles sont les valeurs des paramètres (moyenne et variance) qui maximisent au mieux nos attentes (expectation) ? Autrement dit, quelle va être la valeur de la moyenne et de la variance pour qu'un pixel est une probabilité très proche de 1 d'être dans une composante, et très proche de 0 pour les deux autres ? Oui, un pixel ne peut pas être à la fois dans deux blocs...

Et on boucle entre ces deux étapes, jusqu'à atteindre un critère d'arrêt (à définir. Parfois, c'est que la valeur des paramètres ne varie plus). On obtient alors pour chaque pixel, la composante dans lequel il se trouve : le groupe, le cluster, une classe, en gros, ici, pour green0076, une segmentation. Sauf que la grosse difficulté ici, c'est de déterminer la valeur initiale des paramètres et surtout, le nombre de composantes....

Bref...

La concaténation : green0076 a obtenue 3 images, chacune contenant 3 classes :

- une image avec le rouge contenant 3 classes de rouge (r1, r2 et r3) ;

- une image avec le vert contenant 3 classes de vert (v1, v2 et v3);

- une image avec le bleu contenant 3 classes de bleue (b1, b2 et b3).

Si l'image finale ne doit contenir que 3 classes, ici, ce n'est pas possible sans prendre une décision brutale du type : une classe sera [r1, v1, b1], une seconde [r2, v2, b2] et une troisième [r3, v3, b3] avec r1=v1=b1=50, r2=v2=b2=150, r3=c3=b3=250. Pourquoi ce choix ? Aucune idée... mais il n'y a pas d'autre solution que de trancher de la sorte à mon avis...

Si l'on ne veut que 3 classes finales, il nous faut 3 gaussiennes, donc 3 blocs pour les 3 canaux de couleurs confondus : et là, moi, je ne sais pas comment faire (de façon viable, j'entends).

Lien vers le commentaire
Partager sur d’autres sites

[...]

Et d'où vient ton 27? (oui je sais 3*9 :siffle:)

Est-ce qu'il y a notion de classes lors de concaténation d'images segmentées?

Est-ce qu'il y a une couche alpha?

Il y a 27 classes car l'algo de concaténation prend le premier groupe de l'image rouge segmentée (en 3) et concatène avec le premier groupe de l'image verte segmentée, puis le second, puis le troisième, puis le premier de l'image bleue segmentée, puis le second, plus le troisième : [r1, v1], [r1, v2]... [r1, b3]. Donc 3^3=3*3*3=27.

Ici, je ne parlerai pas de classe (car, une classe, c'est plutôt le résultat d'une classification...). Une segmentation peut être apparentée à une classification, c'est vraie... je préférai parler de "couche".

Ici, visiblement, pas de couche alpha.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bon, c'est sans doute trop tard parce que ton TP doit être fini depuis belle lurette (et peut-être même que tu n'auras pas de rattrapage là-dessus :D), mais la solution, c'est d'appliquer EM en vectoriel sur l'espace rgb. Du coup, dans tes Gaussiennes, $\mu$ devient un vecteur à 3 dimensions, et $\sigma$ devient la matrice 3x3 de covariance de la classe.

On note : chaque pixel est un point de $R^3$ de composante [r g b]. m_c est la moyenne de la classe c, et S_c sa matrice de covariance.

Dans l'étape E, tu affecte chaque point à la classe ayant le maximum de vraisemblance :

q(x) = \argmax_c exp( - (x-m_c)' * S_c^-1 * (x - m_c) ) / sum_n (exp( - (x-m_n)' * S_n^-1 * (x - m_n) )

Tu peux prendre le log-likelyhood, ça marche aussi bien et économise une exponentielle.

Dans l'étape M, tu recalules les paramètres de chaque Gaussienne :

m_c = sum_{x \in c} x / N

S_c = sum_{x \in c} (x-m_c)*(x-m_c)' /N

Désolé pour les notations moitié matlab, moitié latex.

Note : Ça ne marche absolument pas comme méthode de segmentation des images couleurs. Tout au plus tu peux faire de foreground/background extraction dans des vidéos avec ça, mais difficilement plus.

Malock> Tu fais une thèse avec EM, et tu ne penses pas à la version vectorielle (qui est honnêtement la plus courante en plus) ? Si jamais il se trouve que je connais ton directeur de thèse, je te ferais foueter un peu plus sévèrement. :D

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...
[...]

Malock> Tu fais une thèse avec EM, et tu ne penses pas à la version vectorielle (qui est honnêtement la plus courante en plus) ? Si jamais il se trouve que je connais ton directeur de thèse, je te ferais foueter un peu plus sévèrement. :D

Huuum, ça fait un sacré bout de temps que je ne suis pas passé sur le forum de pcINpact... et voilà que l'on souhaite me faire foueter plus sévèrement :D

Merci pour ces explications Iorinc...

Effectivement, je ne pense pas à sa version vectorielle : je l'ignorais totalement avant que tu l'abordes...

J'ai découvers cet outils pendant ma seconde année de thèse c'est vrai.... mais je n'en suis absolument pas un spécialiste (ça c'est vu, non ?!). Tu me largues complétement en parlant de version vectorielle :D

En voyant ta note, on est d'accord sur l'ineficacité de cet algo pour de la segmentation d'image couleur n'est ce pas ?

Si je n'ai pas "présenté" la version vectorielle, laquelle j'aborde ?

Pour le problème de Green0076, en résumé, j'applique EM sur une composante couleur de l'image. Pour celle-ci, j'obitens plusieurs gausiennes qui décrivent la répartition des pixels d'une couleur (les différents niveaux de rouges...).

Les calculer sur les 3 canaux couleurs à la fois nous amène en version vectorielle, donc ? Dans quel cadre l'utilisation d'EM en mode vectoriel est la plus courante ?

As-tu des ressources "bien faites" concernant la formalisation d'EM ?

:byebye:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...