如何在不将所有图像一起加载的情况下使用 PARFOR 循环进行图像处理
How to use the PARFOR loop for image processing without loading all images together
我想使用 parfor 循环进行图像处理。我对单个图像和图像堆栈进行操作。为了保持低内存使用率,我想防止将所有图像存储在内存中。
我从单元格结构变量 Imagepaths{}{} 开始,其中包含
单元格结构中单元格中不同图像的路径。 function1 对所有单独的图像进行操作,function2 对一堆图像进行操作,将它们组合成一个新图像。
例如:Imagepaths{}{} 包含 12 个单元格。每个单元格包含一个带有图像路径的 1x5 单元格。 function2 对这样的 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
索引,这可以防止 切片 ,即你想要什么。有关切片变量的有效索引形式的更多信息,请参阅 the doc。要让 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
我想使用 parfor 循环进行图像处理。我对单个图像和图像堆栈进行操作。为了保持低内存使用率,我想防止将所有图像存储在内存中。
我从单元格结构变量 Imagepaths{}{} 开始,其中包含 单元格结构中单元格中不同图像的路径。 function1 对所有单独的图像进行操作,function2 对一堆图像进行操作,将它们组合成一个新图像。
例如:Imagepaths{}{} 包含 12 个单元格。每个单元格包含一个带有图像路径的 1x5 单元格。 function2 对这样的 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
索引,这可以防止 切片 ,即你想要什么。有关切片变量的有效索引形式的更多信息,请参阅 the doc。要让 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