Bonjour,
Je me suis penché sur l'algorithme quadtree (split and merge), pour la segmentation d'images.
J'ai réussi à écrire quelque chose de fonctionnel (le merge est réellement difficile à coder !!!).
Il fonctionne sur des images 24 bits (RGB codés sur 8 bits). Je travaille en RGB (peut-être HLS serait-il préférable ... enfin c'est pas le problème).
Pour le critère du split, je prends la distance euclidienne de mes 3 variances RGB :
Pour le merge de 2 noeuds, je vérifie que leur valeurs RGB se trouvent bien dans une fenetre parallépipédique RGB paramétrable centrée sur un des 2 noeuds :
Code : Sélectionner tout - Visualiser dans une fenêtre à part critere = sqrt(variance(R) * variance(R) + variance(G) * variance(G) + variance(B) * variance(B))
Les 30 sont des paramètres indépendants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 critere = (abs(moyenne(R noeud1) - moyenne(R noeud2)) < 30) && (abs(moyenne(G noeud1) - moyenne(G noeud2)) < 30) && (abs(moyenne(B noeud1) - moyenne(B noeud2)) < 30)
Donc au final, ça fonctionne pas trop mal. Je suis bien sur de trouver tous les voisins en connectivité 4 ou 8 de chaque noeud. Les segments (labels) sont mémorisés dans une structure me permettant de tout connaitre de leurs propriétés.
en fait il y a pas de problème ... juste je me demande quel est l'intérêt par rapport à un algo de croissance de régions (à part le problème du gradient , et quel problème !!! ).
Effectivement, on s'aperçoit, que si on met une valeur nulle pour le critère d'acceptabilité du split (sur la variance), le split correspond à l'image (à part si on spécifie une taille de split minimale supèrieure à 10 pixels par exemple (en dessous, c'est casi l'image elle-même)). Donc le split donne finalement l'identité. Le merge correspond donc ensuite à un algo de croissance de régions dans lequel on trouve une graine (seed) (la premiere zone issue du split non encore analysée par le merge) puis on étend la réflexion d'un possible regroupement aux voisins etc. Bref !!! un algo classique de croissance de régions. En fait j'ai quasiment écrit le merge (mise en évidence du voisinage à part), comme un algo classique de croissance de régions.
Excepté cas du problème du gradient (le split and merge, au contraire de l'autre, ne se heurte pas au problème du bruit sur l'image), quels sont les différences entre les 2 algos. Car cette expèrience me donne plutot l'impression que le split and merge tient plus de pré-traitement pour un algo de croissance de régions que comme un algo de segmentation à part entière.
Donc, si quelqu'un peut éclairer ma lanterne .
Merci. A+.
Flo.
Partager