2016-07-27 14 views
1

我想使用parfor循环进行图像处理。我对单幅图像和图像堆栈进行操作。为了保持较低的内存使用量,我想阻止将所有图像存储在内存中。如何在不将所有图像加载在一起的情况下使用PARFOR循环进行图像处理

我从单元格结构变量开始Imagepaths {} {}包含 路径的单元格结构中单元格中的不同图像。 功能1在所有单个图像上运行并且功能2对图像堆栈进行操作,将它们组合成单个新图像。

例如:Imagepaths {} {}包含12个单元格。每个单元格包含一个1x5单元格和图像的路径。 功能2对这样的1x5图像堆栈进行操作。

以下代码我最初尝试使用,但变量Images {}给PARFOR循环提供了一个错误。

parfor l = 1:numel(Imagepaths) 
    for k = 1:numel(Imagepaths{l}) 
     Image = imread(Imagepaths{l}{k}); 
     Images{k} = function1(Image) 
    end 
     Image2{l} = function2(Images) 
end 

我附带了以下解决方案,但缺点是它需要大量的内存,因为所有的图像都存储。

parfor l = 1:numel(Imagepaths) 
    for k = 1:numel(Imagepaths{l}) 
     Image = imread(Imagepaths{l}{k}); 
     Images{l}{k} = function1(Image) 
    end 
end 
parfor l = 1:numel(Imagepaths) 
    Image2{l} = function2(Images{l}) 
end 

有人可以提到一个解决方案来保存所有图像。

回答

1

在你原来的代码,你有两种形式的索引的Imagepathsparfor循环内,并防止切片,这是你想要的。有关切片变量的有效索引表单,请参见the doc。最简单的方法说服parfor你正在做的是OK,就是使用有效的分片索引从Imagepaths中提取一个临时数组,然后对其进行操作。

我遇到的第二个问题是,您的临时数组Imagesparfor认为是顺序依赖的方式使用(严格来说,它可能是,但我怀疑它实际上不是)。要解决这个问题,最简单的方法是将一个新的空cell数组分配给Images在循环的每次迭代,就像这样:

parfor l = 1:numel(Imagepaths) 
    tmp = Imagepaths{l}; %# sliced indexing 
    Images = cell(1, numel(tmp)); %# force "Images" to be "temporary" 
    for k = 1:numel(tmp) 
     Image = imread(tmp{k}); 
     Images{k} = function1(Image) 
    end 
    Image2{l} = function2(Images) 
end 
+0

非常感谢您的回答。实际上,你的解决方案,迫使“图像”是暂时的,足以让“parfor”工作,我发现。但使用“tmp”也可以保留将不必要的信息发送到不同的核心,尽管它不是很多。 –

0

基于埃德里克的答案,提临时数组,下面的代码也可以不使用临时变量“tmp”作为图像路径。

parfor l = 1:numel(Imagepaths) 
    Images = cell(1, number(Imagepaths{l})); 
    for k = 1:numel(Imagepaths{l}) 
     Image = imread(Imagepaths{l}{k}); 
     Images{k} = function1(Image) 
    end 
     Image2{l} = function2(Images) 
end 
相关问题