如何在不将所有图像加载在一起的情况下使用PARFOR循环进行图像处理



我想使用parfor循环进行图像处理。我对单个图像和图像堆栈进行操作。为了保持低内存使用率,我想防止将所有图像存储在内存中。

我从单元格结构变量Imagepath{}{}开始,该变量包含细胞中细胞结构中不同图像的路径函数1对所有单个图像进行操作,而函数2则对图像堆栈进行操作,将它们组合为一个新图像。

例如:Imagepath{}{}包含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

有人能提到一个保存所有图像的解决方案吗。

在原始代码中,在parfor循环中有两种形式的Imagepaths索引,这可以防止切片,这正是您想要的。有关切片变量的有效索引表单的更多信息,请参阅文档。让parfor相信您正在做的事情是可以的最简单的方法是使用有效的切片索引从Imagepaths中提取一个临时数组,然后对其进行操作。

我遇到的第二个问题是,临时数组Images的使用方式parfor认为是顺序相关的(严格来说可能是,但我怀疑在实践中不是)。修复此问题的最简单方法是在循环的每次迭代中为Images分配一个新的空cell数组,如下所示:

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

根据Edric的回答,提到临时数组,以下代码也可以在不使用临时变量"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

相关内容

最新更新