Как использовать переменную FinalImage внутри 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');

Как использовать переменную FinalImage внутри цикла Parfor??

1 ответ

Решение

Извлечь все 16 сегменты (размером 128*128) из 512*512 параллельным образом, вы можете попробовать следующий код:

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 Открытие онлайн-изображений происходит медленно, возможно, вы захотите разместить свои изображения на диске. Кроме того, вы можете раскомментировать parpool изменить количество работников, если вы находитесь в кластере HPC.

Другие вопросы по тегам