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 ...
Les règles Les cours La fonction rechercher
N'oubliez pas de mettre en et de voter.
La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !
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 >>
Les règles Les cours La fonction rechercher
N'oubliez pas de mettre en et de voter.
La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !
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
13 a = 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 >>
Les règles Les cours La fonction rechercher
N'oubliez pas de mettre en et de voter.
La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !
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]
OK, j'ai trouvé enfin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 clear all ; close all ; clc ; a = [1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 ] ; sz = diff(find(~[0 a 0]))-1 ; sz = sz(sz~=0)A vous les tests, Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 >> a a = 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 >> sz sz = 1 6 1 2
Les règles Les cours La fonction rechercher
N'oubliez pas de mettre en et de voter.
La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager