Найти элемент в матрице по столбцу - PullRequest
0 голосов
/ 13 января 2020

Я сейчас "играю" с обработкой изображений. Я загружаю изображение .jpg (RGB) в Matlab. После этого я получаю информацию о высоте, ширине и размерах. Следующий шаг - разделить его на 3 матрицы (RGB) и сделать его серым. Последний шаг - это бинаризация. У меня есть бинаризованное изображение с матрицей данных размером ~ 900x1800.

Я хочу извлечь данные из матрицы

Для каждого столбца я хочу найти все строки, содержащие значение равное 1. Например: для столбца 1 я хочу найти все строки, равные 1, а для столбца 2 также 1 (потому что это двоичная матрица.

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)

Ответы [ 3 ]

2 голосов
/ 13 января 2020

Может быть, вы можете использовать arrayfun() над вашей матрицей M, как показано ниже

arrayfun(@(k) find(M(:,k)==k),1:size(M,2),"UniformOutput",false)
1 голос
/ 14 января 2020

Мне удалось сделать это самому, но, ребята, спасибо!

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
1 голос
/ 13 января 2020

Вы можете сделать что-то вроде этого:

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

Вы можете сделать то же самое и без использования bsxfun (возможно, это легче понять):

data=randi(100,[10000 100]);
result=cell(1,100);
for ii=1:size(data,2)
    temp=data(:,ii)==ii;
    result{ii}=find(temp);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...