В этом примере показано, как уточнить маску логической сегментации путем преобразования ее в объект ROI Freehand. В этом методе используется возможность интерактивного изменения формы объекта Freehand ROI для лучшего соответствия края маски сегментации форме области изображения, которую требуется сегментировать.
Алгоритмы сегментации используются для сегментации интересных частей изображения. Для иллюстрации в этом примере используется кластеризация K-средств для сегментации кости и ткани в изображении МРТ.
im = dicomread('knee1.dcm');
segmentedLabels = imsegkmeans(im,3);
boneMask = segmentedLabels==2;
imshowpair(im, boneMask);
Часто результаты алгоритмов автоматизированной сегментации требуют дополнительной постобработки для очистки масок. В качестве первого шага выберите две самые большие кости из маски, бедренную и большеберцовую кости.
boneMask = bwareafilt(boneMask, 2); imshowpair(im, boneMask);

Чтобы уточнить края автоматической сегментации 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

Объект Freehand ROI позволяет выполнять простые интерактивные правки. Для редактирования ROI щелкните и перетащите любую из ППМ вдоль границы ROI. Можно добавить дополнительные ППМ в любом месте границы, дважды щелкнув кромку 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
bwareafilt | bwboundaries | createMask | dicomread | drawfreehand | Freehand | imsegkmeans