Параллельно для l oop для обработки областей двоичного изображения (MATLAB) - PullRequest
0 голосов
/ 05 апреля 2020

Мне нужно распараллелить один единственный 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...