Оптимальный способ найти максимальное значение и индексы для всех индексов в ячейке матриц - PullRequest
0 голосов
/ 12 июня 2018

У меня есть 100 изображений размером 512 на 512, сохраненных в массиве ячеек.

Я хочу найти максимальное значение и индексы для каждого местоположения пикселя, выполнив поиск по всем изображениям.

Вот примерное представление: enter image description here

Мой код:

imgs = cell(1,5);
imgs{1} = [2,3,2;3,2,2;3,1,1];
imgs{2} = [2,3,1;4,2,3;2,2,1];
imgs{3} = [3,2,1;5,3,5;3,2,3];
imgs{4} = [4,4,2;5,3,4;4,2,2];
imgs{5} = [4,5,2;4,2,5;3,3,1];

[nrows, ncols] = size(imgs{1});
maxVal_Mat = zeros(nrows,ncols);
maxIdx_Mat = zeros(nrows,ncols);
for nrow = 1:nrows
    for ncol = 1:ncols
        [maxVal_Mat(nrow, ncol), maxIdx_Mat(nrow, ncol)] = max(cellfun(@(x) x(nrow, ncol) , imgs));
    end
end

maxVal_Mat =

     4     5     2
     5     3     5
     4     3     3

maxIdx_Mat =

     4     5     1
     3     3     3
     4     5     3

Любые идеи о том, как оптимизировать этот код для экономии времени выполнения и памяти.

Примечание. Это примерная демонстрация проблемы, исходная ячейка и матрицы довольно большие.

Спасибо,

Гопи

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я предлагаю другое решение, которое, вероятно, будет:

  • Увеличение времени выполнения
  • Потребление меньше памяти

Это вариант, если ваши изображениябольшой и из-за ограничения памяти вы не можете объединить все изображения.

Вместо загрузки всех изображений в одну трехмерную матрицу я сравниваю изображения по парам.

Если я возьму ваш пример:

imgs = cell(1,5);
imgs{1} = [2,3,2;3,2,2;3,1,1];
imgs{2} = [2,3,1;4,2,3;2,2,1];
imgs{3} = [3,2,1;5,3,5;3,2,3];
imgs{4} = [4,4,2;5,3,4;4,2,2];
imgs{5} = [4,5,2;4,2,5;3,3,1];

% Only for the first image
Mmax = imgs{1};
Mind = ones(size(imgs{1}));

for ii = 2:numel(imgs)
    % 2 by 2 comparison
    [Mmax,ind] = max(cat(3,Mmax,imgs{ii}),[],3);
    Mind(ind == 2) = ii;
end

Результаты:

Mmax =

   4   5   2
   5   3   5
   4   3   3

Mind =

   4   5   1
   3   3   3
   4   5   3

В конкретных терминах тот же код будет выглядеть так:

% your list of images
file = {'a.img','b.img','c.img'}

I = imread(file{1}); 
Mmax = I;
Mind = ones(size(I));

for ii = 2:numel(file)
    I = imread(file{ii})
    [Mmax,ind] = max(cat(3,Mmax,I),[],3);
    Mind(ind == 2) = ii;
end
0 голосов
/ 12 июня 2018

Поскольку все ваши изображения имеют одинаковый размер, имеет смысл хранить их в трехмерной матрице, а не в массиве ячеек, что также значительно упрощает выполнение таких операций над ними.Вы можете преобразовать imgs из массива ячеек в трехмерную матрицу и найти максимумы и индексы следующим образом:

imgs = cat(3, imgs{:});  % Concatenate into a 3D matrix
[maxValue, index] = max(imgs, [], 3)  % Find max across third dimension

maxValue =

     4     5     2
     5     3     5
     4     3     3

index =

     4     5     1
     3     3     3
     4     5     3

В этом посте обсуждается использование массивов ячеек по сравнению с многомерными массивами .В общем случае многомерный массив даст вам лучшую производительность для многих операций, но требует непрерывного пространства памяти для хранения (что может привести к тому, что вы достигнете пределов памяти быстрее для увеличения размера массива).Массивы ячеек не требуют непрерывного пространства памяти и, следовательно, могут быть более эффективными, но усложняют определенные операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...