【问题标题】:maximum of images (pixel to pixel) in a cell array单元阵列中的最大图像(像素到像素)
【发布时间】:2018-04-16 06:53:21
【问题描述】:

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

我们举个简单的例子:

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

如果cel 不是一个单元格而只是一个数组,我会很容易地计算出最大值:

max(cel,[],3);

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

编辑!更多说明:

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

我想取第一张图像的第一个像素和第二张图像的第一个像素..等等,然后它们的最大值将对应于第 10 个图像的第一个像素..

【问题讨论】:

  • 你为什么要imread('image.png')的“最大值”,它混合了不同颜色的强度?另外,如果是“三维图像”,“9 个元素的向量”从哪里来?我想我们通常在 Matlab 中将“向量”称为一维数组,不是吗?
  • 我的意思是单元格的 9 个元素是图像,我在一个单元格中存储了 9 个图像。我编辑了我的帖子以获取更多信息
  • 啊,现在清楚了。我更新了我的答案。虽然瑞恩已经给了你想要的。虽然它看起来像是一个循环,但使用 max 进行元素比较应该是有效的。

标签: matlab


【解决方案1】:

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

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

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

【讨论】:

  • Matlab 有尾调用优化吗?直到 R2014a,我相当肯定它没有。
  • 这是个好问题,我实际上不知道答案。如果是这样,功能性解决方案实际上可能更有效。
【解决方案2】:

您使用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 替换循环。

【讨论】:

  • max(p1,p2,p3,p4,p5,p6,p7,p8,p9) 在 MATLAB 中不起作用。您一次只能按元素最多取两个数组。
  • 另外,bsxfun(@max,cel{1},cel{2})max(cel{1},cel{2}) 相同,如果 cel 的内容没有要扩展的单例尺寸(就像我认为的具有相同尺寸的图像的情况一样) OP有)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多