Bonjour à tous !
Je m'essaie à la programmation d'une méthode de détection de région (sous matlab).
Dans un premier temps il s'agit de séparer les composantes d'une image pour en extraire 3 histogrammes (R, V et B) afin de trouver les seuils après un traitement sur l'histogramme, pour enfin segmenter l'image.
Je ne vais pas revenir sur le traitement d'histogramme, c'est pas le problème. Par contre c'est la segmentation qui pose problème.
J'ai donc les valeurs des seuils (exemple au pif pour expliquer)
nlocsR(pour le rouge) [1;100;200;255]
nlocsG(pour le vert) [1;150;220;255]
nlocsB(pour le vert) [1;130;210;255]
Pour la segmentation, je vais donc faire 3 boucles For afin d'avoir toutes les combinaisons possibles pour seuiller toute l'image
J'ai utilisé une pile. À défaut de pouvoir créer X fichiers de 1 dimension, j'ai dû créer 1 fichier de X dimensions (X étant le nombre de segmentations effectuées) parce que visiblement les eval et autres méthodes sont pas les bonnes, la pile est un peu plus propre.
Code : 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 possibilites=length(nlocsR)*length(nlocsG)*length(nlocsB); PileSegment=zeros(hauteur,largeur,(possibilites)); for i=1:(NombrelocsR+1) for j=1:(NombrelocsG+1) for k=1:(NombrelocsB+1) comptagepixels=length(find((ImageR<nlocsR(i+1))&(ImageR>nlocsR(i))&(ImageG<nlocsG(j+1))&(ImageG>nlocsG(j))&(ImageB<nlocsB(k+1))&(ImageB>nlocsB(k)))); tolerance=comptagepixels; if choixtolerance < tolerance %On réutilise le choix de tolérance utilisateur du menu 3 Segmentation=((ImageR<nlocsR(i+1))&(ImageR>nlocsR(i))&(ImageG<nlocsG(j+1))&(ImageG>nlocsG(j))&(ImageB<nlocsB(k+1))&(ImageB>nlocsB(k))); PileSegment(:,:,(i+j+k-2))=Segmentation; end end end end
Bon voilà le problème : la condition dans la boucle. Selon la tolérance choisie (dans une autre portion de code), on ne garde pas certaines combinaisons de seuils. Mais là, le programme ajoute quand même dans la pile une segmentation (avec, du coup, zéro pixels, soit une matrice pleine de zéro = image noire).
Est-il possible d'éliminer toutes ces matrices zéros, afin de diminuer la pile ? (si j'ai que 10 segmentations à faire pour 50, ça me dérange d'avoir une pile de 50 dimensions dont 40 vides).
Merci d'avance pour votre aide !
PS : petite question pour la suite : après la segmentation, je voudrai faire un bwlabel sur cette pile pleine d'élément segmentés, pour visionner un peu les zones créées. Ca n'est peut-être pas la bonne méthode, mais je fais ceci :
Et pour visionner ça, je fais ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for i=1:possibilites PileLabel(:,:,i) = bwlabel(PileSegment(:,:,i)); endLe problème c'est que j'ai essayé ça, et l'affichage est tout noir (logique, certaines couches sont des matrices vides). Bref le problème est : comment superposer X images, de façon à recréer une image ressemblant à l'original, mais à partir de toutes ces segmentations ? (et en virant les éléments 0 de la matrice qui ont l'air de poser problème).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for i=1:possibilites hold on imshow(PileLabel(:,:,i)); end
Ca n'est peut-être pas la bonne méthode, aussi, n'hésitez pas à proposer d'autres choses. Merci encore.
Partager