2017-01-02 15 views
1

Я пытаюсь сегментировать изображение (512 x 512) на 4 сегмента (128 x 128) изображений, имеющих верхнюю строку изображения orignal. Затем попытаемся запустить параллельный цикл parfor. Но не в силах это сделать. Вот мой код.Как использовать переменную FinalImage внутри parfor Loop?

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?

+0

Я знаю, что вы хотите воспроизвести первую строку в каждом суб-изображении, но я не совсем уверен в размерах последних 4 изображений! Вы хотите нарезать 512 * 512 изображений на 4 суб-изображения 512 * 128? Кроме того, используйте 'imbinarize' вместо' im2bw', поскольку Matlab не рекомендует использовать его. – hmofrad

+0

Мне нужна только верхняя строка изображения orignal..4 сегментов 128 x 128 –

+0

Честно говоря, я думаю, вам не нужно использовать 'parfor' для этого. У меня есть процессор i5, а реализация 'for' кода ниже взята' 0.018'', тогда как 'parfor' взял' 0.12'', что намного медленнее. – hmofrad

ответ

0

Чтобы извлечь все 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.

+0

Как получить все 16 сегментов? 128 x 128 размер –

+0

@ Видимый Ансари, я изменил ответ, чтобы извлечь все 16 сегментов. Надеюсь, на этот раз работает для вас! – hmofrad