Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [lab_im,max_id] = labelingsimu (bin_im)
- [rows, cols] = size(bin_im);
- %%%Création des matrices utilisées pour l'algo CCL
- visited = false(rows,cols);
- lab_im = zeros(rows,cols);
- %%%Création des différentes variables a l'avance pour ne pas allouer dynamiquement de la mémoire
- %La pile (taille maximum si l'image est totalement noir)
- stack = zeros(1,rows*cols);
- %Compteur pour déterminer les prochaines coordonnées a retirer de la pile
- stck_cnt = 1;
- %Compteur pour déterminer les prochaines coordonnées a ajouter sur la pile
- cnt = 3;
- %Les coordonnées d'un seul point
- location = zeros(1,2);
- %Les coordonnées en x et en y des 4 valeurs autour du point examiné
- locs_x = zeros(4,1);
- locs_y = zeros(4,1);
- %Pour déterminer le nombre de points dans chaque CC. La taille de la liste est de cette aille si chaque pixel est alterné entre noir et blanc (echiquier).
- ID_counter = 1;
- ID_list = zeros(1,rows*cols);
- %Le pas utilisé lorsque l'on parcours la matrice
- step_px = 5;
- for i = 1:step_px:rows
- for j = 1:step_px:cols
- %Regarde si noir
- if bin_im(i,j) == 0
- visited(i,j) = true;
- %Regarde si visité
- elseif visited(i,j)
- continue;
- %Ajoute dans la stack
- else
- stack(stck_cnt:stck_cnt+1) = [i j];
- %Trouve tous les CC
- while stack(stck_cnt) ~= 0
- location= stack(stck_cnt:stck_cnt+1);
- %stack(stck_cnt:stck_cnt+1) = ones(1,2)*400; A vor si on veut la «nettoyer» et la reutiliser
- stck_cnt = stck_cnt + 2;
- if visited(location(1),location(2))
- continue;
- end
- visited(location(1),location(2)) = true;
- lab_im(location(1),location(2)) = ID_counter;
- %Pour trouver celui qui en a le max
- ID_list(ID_counter) = ID_list(ID_counter) + 1;
- %Garde en mémoire les 4 valeurs autour du point
- locs_y = [location(2)-1; location(2)+1; location(2); location(2)];
- locs_x = [location(1); location(1); location(1)-1; location(1)+1];
- lx = locs_x;
- ly = locs_y;
- %Vérifier les frontieres de l'image
- frontieres = locs_x < 1 | locs_x > rows | locs_y < 1 | locs_y > cols;
- locs_y(frontieres) = 0;
- locs_x(frontieres) = 0;
- %Verifie si deja visité
- is_visited = visited(sub2ind([rows cols], lx, ly));
- locs_y(is_visited) = 0;
- locs_x(is_visited) = 0;
- %Verifie si noir ou blanc
- is_1 = bin_im(sub2ind([rows cols], lx, ly));
- locs_y(~is_1) = 0;
- locs_x(~is_1) = 0;
- %Ajout des points acceptables dans la stack
- for i = 1:4
- if locs_x(i) ~= 0
- stack(cnt:cnt+1) = [locs_x(i) locs_y(i)];
- cnt = cnt + 2;
- end
- end
- end
- %Reinitialisation des variables
- stck_cnt = 1;
- cnt = 3;
- stack = zeros(1,rows*cols);
- ID_counter = ID_counter + 1;
- end
- end
- end
- [max_value max_id] = max(ID_list);
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement