Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. function [lab_im,max_id] = labelingsimu (bin_im)
  2.  
  3. [rows, cols] = size(bin_im);
  4.  
  5. %%%Création des matrices utilisées pour l'algo CCL
  6. visited = false(rows,cols);
  7. lab_im = zeros(rows,cols);
  8.  
  9. %%%Création des différentes variables a l'avance pour ne pas allouer dynamiquement de la mémoire
  10. %La pile (taille maximum si l'image est totalement noir)
  11. stack = zeros(1,rows*cols);
  12.  
  13. %Compteur pour déterminer les prochaines coordonnées a retirer de la pile
  14. stck_cnt = 1;
  15. %Compteur pour déterminer les prochaines coordonnées a ajouter sur la pile
  16. cnt = 3;
  17.  
  18. %Les coordonnées d'un seul point
  19. location = zeros(1,2);
  20. %Les coordonnées en x et en y des 4 valeurs autour du point examiné
  21. locs_x = zeros(4,1);
  22. locs_y = zeros(4,1);
  23.  
  24. %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).
  25. ID_counter = 1;
  26. ID_list = zeros(1,rows*cols);
  27.  
  28. %Le pas utilisé lorsque l'on parcours la matrice
  29. step_px = 5;
  30.  
  31. for i = 1:step_px:rows
  32. for j = 1:step_px:cols
  33.  
  34. %Regarde si noir
  35. if bin_im(i,j) == 0
  36. visited(i,j) = true;
  37.  
  38. %Regarde si visité
  39. elseif visited(i,j)
  40. continue;
  41.  
  42. %Ajoute dans la stack
  43. else
  44. stack(stck_cnt:stck_cnt+1) = [i j];
  45.  
  46. %Trouve tous les CC
  47. while stack(stck_cnt) ~= 0
  48. location= stack(stck_cnt:stck_cnt+1);
  49. %stack(stck_cnt:stck_cnt+1) = ones(1,2)*400; A vor si on veut la «nettoyer» et la reutiliser
  50. stck_cnt = stck_cnt + 2;
  51.  
  52. if visited(location(1),location(2))
  53. continue;
  54. end
  55.  
  56. visited(location(1),location(2)) = true;
  57. lab_im(location(1),location(2)) = ID_counter;
  58.  
  59. %Pour trouver celui qui en a le max
  60. ID_list(ID_counter) = ID_list(ID_counter) + 1;
  61.  
  62. %Garde en mémoire les 4 valeurs autour du point
  63. locs_y = [location(2)-1; location(2)+1; location(2); location(2)];
  64. locs_x = [location(1); location(1); location(1)-1; location(1)+1];
  65. lx = locs_x;
  66. ly = locs_y;
  67.  
  68. %Vérifier les frontieres de l'image
  69. frontieres = locs_x < 1 | locs_x > rows | locs_y < 1 | locs_y > cols;
  70.  
  71. locs_y(frontieres) = 0;
  72. locs_x(frontieres) = 0;
  73.  
  74. %Verifie si deja visité
  75. is_visited = visited(sub2ind([rows cols], lx, ly));
  76. locs_y(is_visited) = 0;
  77. locs_x(is_visited) = 0;
  78.  
  79. %Verifie si noir ou blanc
  80. is_1 = bin_im(sub2ind([rows cols], lx, ly));
  81. locs_y(~is_1) = 0;
  82. locs_x(~is_1) = 0;
  83.  
  84. %Ajout des points acceptables dans la stack
  85. for i = 1:4
  86. if locs_x(i) ~= 0
  87. stack(cnt:cnt+1) = [locs_x(i) locs_y(i)];
  88. cnt = cnt + 2;
  89. end
  90. end
  91.  
  92. end
  93. %Reinitialisation des variables
  94. stck_cnt = 1;
  95. cnt = 3;
  96. stack = zeros(1,rows*cols);
  97. ID_counter = ID_counter + 1;
  98. end
  99. end
  100. end
  101.  
  102. [max_value max_id] = max(ID_list);
  103.  
  104. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement