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