Mon image de départ est composée de bandes blanches verticales tout au long de l'axe et avec fond noir. Mon but est de déterminer les dimensions de chaque bande.
Est ce BoundingBox de regionprops ferait l'affaire????![]()








Mon image de départ est composée de bandes blanches verticales tout au long de l'axe et avec fond noir. Mon but est de déterminer les dimensions de chaque bande.
Est ce BoundingBox de regionprops ferait l'affaire????![]()
Bonjour,
Quand tu parles des dimensions, tu veux dire en pixels !!
Déjà, du moment que les bande sont en verticale tout au long de l'axe,on peux conclure que le nombre de pixels de la verticale est égale à celui de l'image.
Pour les tailles horizontales, tu peux faire une boucle pour les calculer , sinon il y a une possibilité avec find. A développer ...








Oui ce sont les pixels qui m'intéressent et c'est plutôt la largeur de ces bandes dont j'ai besoin. J'ai élaboré un petit code même si ça va faire rire quelques uns sans doute vu que chui pas doué en info...
vaudrait mieux quelque chose de plus court..mais je sais pas comment!!!!
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 function b=Vmid(a) [row col]=size(a); x=1; for y=1:col if a(x,y)=1 w=y; % premier point blanc de la bande for y=w:col if a(x,y)=0 z=y-1; % dernier point blanc de la bande l=z-w; % largeur de la bande end end end end
j te remercie kmaniche, tu m'as proposé "find" et puis un autre ami la fonction "diff" qui indique quand y a une transition de couleur. je devrais accoupler les deux peut être?!!!!
Déjà le fait d'avoir conçu son propre algorithme c'est bien, maintenant tu as un algorithme fonctionnel. Il faut se pencher sur sa minimisation.
Les deux solutions sont prométeuses, que ce soit avec find ou diff.
Avec find tu fais une recherche des blanc dans la matrice "1" respectivement "255", ensuite tu calcul le nombre de paquets avec "1 respectivement 255".
Avec diff, au lieu de cherche les paquets, tu cherche les transitions 0=>-1, -1=>0, 0=>1, 1=>-1, -1=>1 et 1=>0.
Un début de la solution :
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
19
20
21
22
23
24
25
26 >> a=round(rand(1,18)) a = 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 >> idx=find(a==1) idx = 4 6 11 12 13 15 16 18 >> diff(a) ans = 0 0 1 -1 1 -1 0 0 0 1 0 0 -1 1 0 -1 1 >> diff(idx) ans = 2 5 1 1 2 1 2 >>
Vu que j'ai pas encore trouvé la solution en utilisant find ou diff, la seule solution propre que j'ai trouvé utilise bwlabel de l'IPT
Une solution très simple mais demande d'utilisation comme même d'une fonction de la toolbox, que certain ne l'on pas
Soit la matrice a une matrice remplie de '0' et '1', où les '1' représentent des lignes verticales, on cherche à calculer le nombre de ces lignes ainsi que la largeur de chacune d'entre-elles. Mon idée est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 clc a = [0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0] etq = bwlabel(a) ; nbreBarres = max(etq) tailleBarre = histc(etq, unique(etq(etq~=0)))QUI PREND LE DEFI ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13a = 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 nbreBarres = 4 tailleBarre = 4 1 2 1 >>
Allez, un début de réponse en utilisant diff et find. J'arrive à trouver le nombre de barre. Me reste leur largeur à trouver en utilisant aussi cette méthode :
et la suite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 a=[0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0] b=diff(a); b(b~=1)=0; nbre_bar=sum(b)
reste plus qu'à vectoriser la partie des b1...b4... plus le temps pour ce soir, maintenant, c'est week end
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 idx=find(a==1); A=diff(idx); B=find(A~=1); b1=sum(a(idx(1+B(1):B(2)))); b2=sum(a(idx(1+B(2):B(3)))); b3=sum(a(idx(1+B(3):B(4)))); b4=sum(a(idx(1+B(4):end))); lon_barre=[b1 b2 b3 b4]![]()
Partager