如何在 parfor 循环中使用 FinalImage 变量?
How to use FinalImage variable inside parfor Loop?
我正在尝试将 (512 x 512) 的图像分割成 4 段 (128 x 128) 图像,这些图像具有原始图像的上一行。然后尝试 运行 并行 parfor 循环就可以了。但不能这样做。这是我的代码。
FinalImage = ones(512,512);
%visiblity function initialization, see equation (4)
parfor imageSegment = 1:8;
img = double(imread([filename '.jpg']))./255;
img = im2bw(img);
if imageSegment == 1
img = img(1:128,1:128);
[nrow, ncol] = size(img);
elseif imageSegment == 2
img = img(1:128,129:256);
[nrow, ncol] = size(img);
elseif imageSegment == 3
img = img(1:128,257:384);
[nrow, ncol] = size(img);
elseif imageSegment == 4
img = img(1:128,385:512);
[nrow, ncol] = size(img);
for nMethod = 3:3;
//Some code
end
end
imwrite(FinalImage, gray(256), [filename '_FinalImage_' num2str(nMethod) '.bmp'], 'bmp');
fprintf('close');
如何在 parfor 循环中使用 FinalImage 变量??
要以并行方式提取 512*512
图像的所有 16
段(大小 128*128
),您可能需要尝试以下代码:
clear;
clc
% #1 image from dataset of standard 512X512 grayscale test images
% Availabe online at http://decsai.ugr.es/cvg/CG/base.htm
img = imbinarize(imread('http://decsai.ugr.es/cvg/CG/images/base/1.gif'));
d = 512; % Needs to be a power of 2
n = 4; % Needs to be a power of 2
s = d/n;
tmp = zeros(s, s);
ind = 1:s:d;
% parpool(numel(ind))
disp('Process')
tic
parfor i = 1:numel(ind)
j = ind(mod(i,n)+1);
for k = 0:n-1
l = ind(mod(k,n)+1);
tmp = img(j:j+s-1, l:l+s-1);
imwrite(tmp,[num2str((i*n)+1+k),'.jpg'])
end
end
toc
disp('done')
结果将是 16
个图像,顺序如下:
01.jpg | 02.jpg | 03.jpg | 04.jpg
05.jpg | 06.jpg | 07.jpg | 08.jpg
09.jpg | 10.jpg | 11.jpg | 12.jpg
13.jpg | 14.jpg | 15.jpg | 16.jpg
我以参数化方式编写程序,即您可以输入 2^m*2^m
的任何图像并请求任意数量的段 n = 2^q
,其中 m
和 q
是任意数字。
imread
打开在线图像很慢,您可能希望将图像保存在磁盘上。此外,如果您在 HPC 集群上,您可以取消注释 parpool
以更改工作人员数量。
我正在尝试将 (512 x 512) 的图像分割成 4 段 (128 x 128) 图像,这些图像具有原始图像的上一行。然后尝试 运行 并行 parfor 循环就可以了。但不能这样做。这是我的代码。
FinalImage = ones(512,512);
%visiblity function initialization, see equation (4)
parfor imageSegment = 1:8;
img = double(imread([filename '.jpg']))./255;
img = im2bw(img);
if imageSegment == 1
img = img(1:128,1:128);
[nrow, ncol] = size(img);
elseif imageSegment == 2
img = img(1:128,129:256);
[nrow, ncol] = size(img);
elseif imageSegment == 3
img = img(1:128,257:384);
[nrow, ncol] = size(img);
elseif imageSegment == 4
img = img(1:128,385:512);
[nrow, ncol] = size(img);
for nMethod = 3:3;
//Some code
end
end
imwrite(FinalImage, gray(256), [filename '_FinalImage_' num2str(nMethod) '.bmp'], 'bmp');
fprintf('close');
如何在 parfor 循环中使用 FinalImage 变量??
要以并行方式提取 512*512
图像的所有 16
段(大小 128*128
),您可能需要尝试以下代码:
clear;
clc
% #1 image from dataset of standard 512X512 grayscale test images
% Availabe online at http://decsai.ugr.es/cvg/CG/base.htm
img = imbinarize(imread('http://decsai.ugr.es/cvg/CG/images/base/1.gif'));
d = 512; % Needs to be a power of 2
n = 4; % Needs to be a power of 2
s = d/n;
tmp = zeros(s, s);
ind = 1:s:d;
% parpool(numel(ind))
disp('Process')
tic
parfor i = 1:numel(ind)
j = ind(mod(i,n)+1);
for k = 0:n-1
l = ind(mod(k,n)+1);
tmp = img(j:j+s-1, l:l+s-1);
imwrite(tmp,[num2str((i*n)+1+k),'.jpg'])
end
end
toc
disp('done')
结果将是 16
个图像,顺序如下:
01.jpg | 02.jpg | 03.jpg | 04.jpg
05.jpg | 06.jpg | 07.jpg | 08.jpg
09.jpg | 10.jpg | 11.jpg | 12.jpg
13.jpg | 14.jpg | 15.jpg | 16.jpg
我以参数化方式编写程序,即您可以输入 2^m*2^m
的任何图像并请求任意数量的段 n = 2^q
,其中 m
和 q
是任意数字。
imread
打开在线图像很慢,您可能希望将图像保存在磁盘上。此外,如果您在 HPC 集群上,您可以取消注释 parpool
以更改工作人员数量。