0
votes

Trouver l'élément dans la matrice en fonction de la colonne

Je "joue" maintenant avec le traitement d'image. Je télécharge une image .jpg (RVB) sur un matlab. Après cela, je reçois des informations sur la hauteur, la largeur et la dimension. L'étape suivante consiste à le diviser en 3 matrices (RVB) et à le rendre gris. La dernière étape consiste à le binariser. J'ai une image binarisée avec une matrice de données d'une taille de ~ 900x1800.

Je veux extraire des données de la matrice

Pour chaque colonne, je veux trouver toutes les lignes qui contiennent la valeur égale à 1 . Par exemple: pour la colonne 1 je veux trouver toutes les lignes égales à 1 et pour la colonne 2 également 1 ( car c'est une matrice binaire.

img = imread(jpeg);
inf2=imfinfo(jpeg); 
[height, width,  dim] = size(img); 
if dim == 3 
    R=img(:, :, 1);
    G=img(:, :, 2);
    B=img(:, :, 3); 
    gray_img=rgb2gray(img); 
    level=graythresh(gray_img); 
    img_bin2 = im2bw(gray_img,level); 
    img_bin2= ~img_bin2;
%     imshow(img_bin2)


4 commentaires

Ce que vous voulez extraire des colonnes n'est pas clair pour moi. Vous avez une image binaire avec 1800 colonnes et pour chaque colonne vous voulez extraire quelque chose. Mais qu'est-ce que c'est quelque chose, pouvez-vous essayer d'expliquer à nouveau?


Ok, je pense que je l'ai maintenant: pour la première colonne, vous voulez trouver tous les index de ligne où la valeur est égale à 1 . Pour la 2ème colonne, vous voulez trouver toutes les lignes égales à 2 et ainsi de suite. Est-ce exact?


Oui (comme vous l'avez dit dans le deuxième commentaire), et je veux l'enregistrer dans une autre matrice.


Ou recherchez simplement la première position de la ligne (pour chaque colonne) dont la valeur est égale à 1


3 Réponses :


1
votes

Vous pouvez faire quelque chose comme ceci:

data=randi(100,[10000 100]);
result=cell(1,100);
for ii=1:size(data,2)
    temp=data(:,ii)==ii;
    result{ii}=find(temp);
end

Vous pouvez également faire la même chose sans utiliser bsxfun (peut-être que c'est plus facile à comprendre):

data=randi(100,[10000 100]); % generate test data
compared=bsxfun(@eq,data,1:size(data,2)); % compare each value to their respective row index
result=cell(1,100); % create a cell array to store the result in. It needs to be a cell array instead of a matrix because each column can have a different amount of matches.
for ii=1:size(data,2)
    result{ii}=find(compared(:,ii)); % loop over the columns and find the row indexes for each column
end


0 commentaires

2
votes

Vous pouvez peut-être utiliser arrayfun () sur votre matrice M comme ci-dessous

arrayfun(@(k) find(M(:,k)==k),1:size(M,2),"UniformOutput",false)


0 commentaires

1
votes

J'ai réussi à le faire moi-même, mais merci les gars!

max_val_of_1 = find(num_of_1, 1, 'last'); 
for k = 1:width
  y_max_val = find(img_bin2(:,k),1,'first');
  y_val = max_val_of_1 - y_max_val;
  y(k) = y_val;
end


0 commentaires