我有100个图像,每个图像大小512到512存储在一个单元格数组中。
我想通过搜索所有图像找到每个像素位置的最大值和索引。
我的代码:
<% @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
}
]
) %>
有关如何优化此代码以节省执行时间和内存的任何想法。
注意:这是问题的示例演示,原始单元格和矩阵非常大。
谢谢,
戈皮
答案 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