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

В этом примере показов, как уточнить логическую маску сегментации путем преобразования ее в объект 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.

Преобразуйте маску в объект Freehand информации только для чтения

Чтобы уточнить ребра автоматической сегментации k-средних значений, преобразуйте две маски в интерактивные объекты ROI freehand. Сначала найдите местоположения краевых пикселей, которые очерчивают эти две сегментированные области. Обратите внимание, что эти объекты информация только для чтения являются плотно выборочными --their 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.

Редактирование ROIs

Объект Freehand ROI допускает простые интерактивные правки «rubber-band». Чтобы отредактировать информация только для чтения, щелкните и перетащите любую из путевых точек вдоль контура информация только для чтения. Вы можете добавить дополнительные путевые точки в любом месте контура, дважды кликнув по информации только для чтения ребра или используя контекстное меню, доступное щелчком правой кнопкой мыши по ребру.

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

После редактирования 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

См. также

| | | | | |

Для просмотра документации необходимо авторизоваться на сайте