找到矩阵单元格中所有索引的最大值和指标的最优方法

时间:2018-06-12 18:38:13

标签: matlab matrix

我有100个图像,每个图像大小512到512存储在一个单元格数组中。

我想通过搜索所有图像找到每个像素位置的最大值和索引。

以下是示例代表: enter image description here

我的代码:

<% @stores.each do |store| %>
    <h2><%= link_to store.name, store_path(store) + ': ' + store.address %></h2>
<% end %>

<%= link_to "Add Spaeti", new_store_path %>

<%= map(:center => {
    :latlng => [52.52004797921441, 12.4050235665359283],
    :zoom => 3
  },

  :markers => [
    {  
       :latlng => [ Store.last.latitude, Store.last.longitude ],
       :popup => Store.last.name
    }
  ]
) %>

有关如何优化此代码以节省执行时间和内存的任何想法。

注意:这是问题的示例演示,原始单元格和矩阵非常大。

谢谢,

戈皮

2 个答案:

答案 0 :(得分:3)

由于您的所有图像大小相同,因此将它们存储在3D矩阵中比使用单元阵列更有意义,这也极大地简化了在它们上执行此类操作。您可以将imgs从单元格数组转换为3D矩阵,并找到最大值和索引,如下所示:

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

有一些关于使用单元数组与多维数组in this post的讨论。通常,多维数组将为许多操作提供更好的性能,但需要连续的存储空间用于存储(这可能会导致您更快地达到内存限制以增加数组大小)。单元阵列不需要连续的内存空间,因此可以提高内存效率,但会使某些操作复杂化。

答案 1 :(得分:2)

我提出了另一种可能的解决方案:

  • 延长执行时间
  • 消耗更少的内存

如果您的图像很大并且由于内存限制,您无法连接所有图像,这是一个选项。

我不是将所有图像加载到单个3D矩阵中,而是成对比较图像。

如果我举个例子:

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