В этом примере показано, как совершенствовать логическую маску сегментации путем преобразования его в объект Freehand ROI. В этом методе вы используете в своих интересах интерактивную возможность изменения объекта Freehand ROI сделать лучший припадок ребра маски сегментации к форме области изображений, которую вы хотите сегментировать.
Алгоритмы сегментации используются, чтобы сегментировать интересные части изображения. Чтобы проиллюстрировать, этот пример использует K-средних значений, кластеризирующихся, чтобы сегментировать кость и ткань в изображении MRI.
im = dicomread('knee1.dcm');
segmentedLabels = imsegkmeans(im,3);
boneMask = segmentedLabels==2;
imshowpair(im, boneMask);
Часто, результатам автоматизированных алгоритмов сегментации нужна дополнительная последующая обработка, чтобы очистить маски. Как первый шаг, выберите две самых больших кости из маски, бедро и большую берцовую кость.
boneMask = bwareafilt(boneMask, 2); imshowpair(im, boneMask);
Чтобы совершенствовать ребра автоматической сегментации k-средних значений, преобразуйте эти две маски в интерактивные объекты ROI от руки. Во-первых, получите местоположения граничных пикселей, которые формируют рисунок этих двух сегментированных областей. Обратите внимание на то, что эти объекты 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
Объект Freehand ROI позволяет простой 'круглой резинке' интерактивные редактирования. Чтобы отредактировать ROI, перетащите любой из waypoints вдоль контура ROI. Можно добавить дополнительный waypoints где угодно на контуре путем двойного клика по ребру ROI или при помощи контекстного меню, доступного путем щелчка правой кнопкой по ребру.
После редактирования 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
dicomread
| imsegkmeans
| bwareafilt
| bwboundaries
| drawfreehand
| Freehand
| createMask