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

时间:2018-04-13 21:22:26

标签: matlab

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

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

exports.app = functions.https.onRequest((request,response) => {
var listOfClasses = loadClassList().then(
//respond to the user
)};



function loadClassList() {
  var dbRef = db.collection('playerCharacters');
  var getClass = dbRef.get()
  .then(
  //do stuff with the queried data
  ) 
};

如果I=imread('image.png'); V=zeros(size(I)); cel={I,2*I,V}; 不是一个单元格而且它只是一个数组,我会像这样轻松地计算出最大值:

cel

所以我的问题是如果没有使用大量循环的细胞,我怎么能这样做?(可能?)?

修改!更多澄清:

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

我想拍摄第一张图像的第一个像素和第二张图像的第一个像素......然后这些像素的最大值将对应于第10张图像的第一个像素。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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
如果您需要其他二进制函数而不是bsxfun

max仍然有效。这里的关键是避免在所有像素上循环,这很慢。

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