exponenta event banner

Использование ROI Freehand для уточнения масок сегментации

В этом примере показано, как уточнить маску логической сегментации путем преобразования ее в объект ROI Freehand. В этом методе используется возможность интерактивного изменения формы объекта Freehand ROI для лучшего соответствия края маски сегментации форме области изображения, которую требуется сегментировать.

Введение - сегментация изображений

Алгоритмы сегментации используются для сегментации интересных частей изображения. Для иллюстрации в этом примере используется кластеризация K-средств для сегментации кости и ткани в изображении МРТ.

im = dicomread('knee1.dcm');
segmentedLabels = imsegkmeans(im,3);
boneMask = segmentedLabels==2;
imshowpair(im, boneMask);

Figure contains an axes. The axes contains an object of type image.

После обработки масок сегментации

Часто результаты алгоритмов автоматизированной сегментации требуют дополнительной постобработки для очистки масок. В качестве первого шага выберите две самые большие кости из маски, бедренную и большеберцовую кости.

boneMask = bwareafilt(boneMask, 2);
imshowpair(im, boneMask);

Figure contains an axes. The axes contains an object of type image.

Преобразовать маску в объект ROI Freehand

Чтобы уточнить края автоматической сегментации k-means, преобразуйте две маски в интерактивные объекты окупаемости инвестиций. Сначала извлеките местоположения граничных пикселей, которые определяют эти две сегментированные области. Обратите внимание, что эти объекты ROI имеют плотную выборку - Position имеет такое же разрешение, что и пиксели изображения.

blocations = bwboundaries(boneMask,'noholes');
figure
imshow(im, []);
for ind = 1:numel(blocations)
    % Convert to x,y order.
    pos = blocations{ind};
    pos = fliplr(pos);
    % Create a freehand ROI.
    drawfreehand('Position', pos);
end

Figure contains an axes. The axes contains 3 objects of type image, images.roi.freehand.

Изменение значений ROI

Объект Freehand ROI позволяет выполнять простые интерактивные правки. Для редактирования ROI щелкните и перетащите любую из ППМ вдоль границы ROI. Можно добавить дополнительные ППМ в любом месте границы, дважды щелкнув кромку ROI или используя контекстное меню, доступное щелчком правой кнопкой мыши на кромке.

Преобразовать ROI Freehand обратно в маски

После редактирования ROI преобразуйте эти объекты ROI обратно в двоичные маски с помощью объектов ROI. createMask способ. Обратите внимание на дополнительный шаг, необходимый для включения граничных пикселов в окончательную маску.

% Convert edited ROI back to masks.
hfhs = findobj(gca, 'Type', 'images.roi.Freehand');
editedMask = false(size(im));

for ind = 1:numel(hfhs)
    % Accumulate the mask from each ROI
    editedMask = editedMask | hfhs(ind).createMask();

    % Include the boundary of the ROI in the final mask.
    % Ref: https://blogs.mathworks.com/steve/2014/03/27/comparing-the-geometries-of-bwboundaries-and-poly2mask/
    % Here, we have a dense boundary, so we can take the slightly more
    % performant approach of just including the boundary pixels directly in
    % the mask.
    boundaryLocation = hfhs(ind).Position;
    bInds = sub2ind(size(im), boundaryLocation(:,2), boundaryLocation(:,1));
    editedMask(bInds) = true;
end

См. также

| | | | | |