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

Matlab 单元阵列中的最大图像数(像素到像素),matlab,Matlab,我有一个包含数组列表的单元格,数组是三维图像。单元格是9个元素(图像)的向量,我想在第10个元素中存储一个新图像,其中每个像素对应于所有9个元素中对应像素的最大值 让我们举一个简单的例子: I=imread('image.png'); V=zeros(size(I)); cel={I,2*I,V}; 如果cel不是一个单元格,它只是一个数组,我会很容易地计算出最大值: max(cel,[],3) 所以我的问题是,我如何在不使用大量循环的情况下(可能?)对单元格执行相同的操作 编辑!更多澄清:

我有一个包含数组列表的单元格,数组是三维图像。单元格是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)…


我想取第一幅图像的第一个像素和第二幅图像的第一个像素。以此类推,然后这些像素的最大值将对应于第十幅图像的第一个像素。

您使用
imread
的场景似乎不太清楚。但是,下面是您可以用来从名为
cel
的单元格中的所有数组中获取最大值的方法

max(cellfun(@(arr)max(arr),cel));
根据我的经验(几乎没有使用过R2014a以外的任何东西),
cellfun
arrayfun
等确实比循环快。然而,时间上只有一个恒定的差异。因此,这些函数的使用主要使您更容易在特定场景中维护代码。它们在性能上没有显著优势。使用它们与矢量化不同

编辑:澄清后,如果您始终希望elementwise最多有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
如果需要其他二进制函数而不是
max
,则
bsxfun
仍然可以工作。这里的关键是避免在所有像素上循环,这很慢


最后,如果您喜欢,您仍然可以使用
cellfun
替换循环。

如果您想要的是逐像素最大值,我认为最好的方法确实是for循环。 e、 g


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

为什么要使用imread('image.png')
的“max”来混合不同颜色的强度?此外,如果它是“三维图像”,那么“9个元素的向量”从何而来?我想在Matlab中,我们通常把“向量”称为一维数组,不是吗?我的意思是细胞的9个元素是图像,我在一个细胞中存储了9个图像。我编辑了我的帖子来获取更多的信息啊,现在很清楚了。我更新了我的答案。虽然Ryan已经给了你想要的。虽然它看起来像一个循环,但使用
max
进行元素比较应该是有效的。Matlab有尾部调用优化吗?直到R2014a,我相当肯定它没有。这是一个好问题,我实际上不知道答案。如果是这样,函数式解决方案实际上可能更有效。
max(p1、p2、p3、p4、p5、p6、p7、p8、p9)
在MATLAB中不起作用。同时,如果
cel
的内容没有要扩展的单元素维度,那么
bsxfun(@max,cel{1},cel{2})
max(cel{1},cel{2})
是相同大小的图像的情况,我假设OP已经这样做了)。
max_image = zeros(size(cel{1}));
for i = 1:size(cel,2)
max_image = max(cel{i}, max_image);
end