单元格阵列中的最大图像数(像素到像素)



我有一个单元格,其中包含一个三维图像的数组列表。 单元格是 9 个元素(图像)的向量,我想在第 10 个元素中存储一个新图像,其中每个像素对应于所有 9 个元素中相应像素的最大值。

让我们举一个简单的例子:

I=imread('image.png');
V=zeros(size(I));
cel={I,2*I,V};

如果cel不是一个单元格,而它只是一个数组,我会像这样轻松地计算最大值:

max(cel,[],3);.

所以我的问题是,如何在不使用大量循环的情况下在单元格的情况下做同样的事情(也许?

编辑! 更多澄清:

我在这样的单元格中有 9 张图像(上面我只声明了一张,我只通过 2*I 创建了第二张cel={I1,I2,I3,I4,I5,i6,i7,I8,i9};,每张都是 RGB 图像。I10图像将形成为 9 个图像中的最大值,如下所示:pixel_I10(1,1,1)=max(pixel_I9(1,1,1),pixel_I8(1,1,1)...)

我想拍摄第一张图像的第一个像素和第二张图像的第一个像素。等,那么其中的最大值将对应于第 10 张图像的第一个像素。

如果你想要的是一个像素的最大像素,我认为最好的方法确实是一个 for 循环。 例如

max_image = zeros(size(cel{1}));
for i = 1:size(cel,2)
max_image = max(cel{i}, max_image);
end

如果你真的不想使用 for 循环,你可能会将单元格转换为 4d 数组或使用带有累加器的递归函数,但我认为循环是这里最简单的解决方案。

imread的情况似乎相当不清楚。但是,您可以使用以下内容从名为cel的单元格中的所有数组中获取所有最大值。

max(cellfun(@(arr)max(arr),cel));

根据我的经验(在R2014a之后几乎没有使用过任何东西),cellfunarrayfun等确实比循环更快。但是,只有恒定的时间差异。因此,使用这些函数主要使您在特定场景中更轻松地维护代码。它们在性能方面没有显着优势。使用它们与矢量化不同

编辑:根据您的澄清,如果您总是想要 9 个数组的元素最大值,您可以按如下方式使用arrayfun。之前关于速度和使用情况的评论不会改变。

arrayfun(@(p1,p2,p3,p4,p5,p6,p7,p8,p9)max(p1,p2,p3,p4,p5,p6,p7,p8,p9),cel{1},...,cel{9});

如果你的图像很大,并且你正在处理很多图像,并且说你并不总是一次处理 9 个批次,你可能想探索使用bsxfun,这是高度优化的。

elementwiseMax=bsxfun(@max,cel{1},cel{2});
for i=3:length(cel)
elementwiseMax=bsxfun(@max,elementwiseMax,cel{i});
end

如果您需要其他二进制函数而不是maxbsxfun仍然可以工作。这里的关键是避免遍历所有像素,这很慢。

最后,如果您愿意,您仍然可以使用cellfun来替换循环。

最新更新