Мне нужно распараллелить один единственный MATLAB l oop. По сути, мой код состоит в том, чтобы последовательно сегментировать каждый извлеченный двоичный объект (который уже сохранен в двоичной маске bw
), который превышает определенный порог по размеру на более мелкие части. После сегментации я хочу заменить каждый двоичный блок его сегментированными частями, но код выдает мне ошибки:
- "PARFOR l oop не может работать из-за переменной пути" watershed_temp " 'используется'
- "PARFOR l oop не может работать из-за способа использования переменной 'img_seg'"
- "Допустимые индексы для watershed_temp ограничены в циклах PARFOR"
- "Допустимые индексы для 'img_seg' ограничены в циклах PARFOR"
Как мне индексировать эти изображения, чтобы код работал? Пожалуйста, помогите.
Спасибо за любой вклад заранее!
Попытка
function [bw_seg] = watershedImage(img, bw, param)
%% Parameters extraction
stats = regionprops(bw, img, 'Area', 'Image', 'PixelIdxList', 'BoundingBox');
param.medianarea = median([stats.Area]);
% Select only the BLOBs with sufficient area for watershed segmentation
thresh = 0.6*param.medianarea; % lower area threshold
BLOBind = find([stats.Area] > thresh); % BLOB indices
boundingboxbuffer = 5; % in pixels
watershed_temp = false(size(img));
bw_seg = logical(bw);
%% Watershed on each individual binary section of the mask
parfor i = 1:length(BLOBind)
% Extract each BLOB by cropping (with a buffer 'safety' border) the
% bounding box of each BLOB
r = round(stats(BLOBind(i)).BoundingBox);
boundingboxBLOB = [max(r(1)-boundingboxbuffer,1) max(r(2)-boundingboxbuffer,1) ...
r(3)+2*boundingboxbuffer-1 r(4)+2*boundingboxbuffer-1];
img_BLOB = imcrop(img, boundingboxBLOB);
% Crop the same region accordingly from the binary mask
bw_BLOB = false(size(bw));
bw_BLOB(stats(BLOBind(i)).PixelIdxList) = 1;
bw_BLOB = imcrop(bw_BLOB, boundingboxBLOB);
% Watershed segmentation (a written watershed segmentation algorithm)
L = watershedBLOB(img_BLOB, bw_BLOB, param);
%%%%%% I'm getting errors here for 'watershed_temp' and 'img_seg'!!! %%%%%%%
if max(max(bwlabel(L))) > 0 && sum(sum(L)) >= 0.6*sum(sum(bw_BLOB))
[f1, f2] = find(L > 0);
fr = f1 + boundingboxBLOB(2) - 1;
fc = f2 + boundingboxBLOB(1) - 1;
watershed_temp(sub2ind(size(img), fr, fc)) = L(sub2ind(size(L), f1, f2));
bw_seg(stats(BLOBind(i)).PixelIdxList) = 0;
end
end
bw_seg = imfill(logical(bw_seg) | watershed_temp, 'holes');
end