В этом примере показано, как создать помеченное блокированное изображение из набора ROI.
В этом примере вы используете два подхода, чтобы получить и отобразить маркированные данные. Один подход использует многоугольные объекты ROI, которые хранят координаты контуров опухоли и нормальных областей ткани. polyToBlockedImage
функция преобразует координаты ROI в помеченное блокированное изображение. Второй подход использует маску, чтобы указать на бинарную сегментацию изображения в ткань и фон. Этот пример комбинирует информацию в ROI и рисунках маски, чтобы создать одно блокированное изображение с числовыми пиксельными метками, соответствующими опухоли, нормальной ткани и фоновым областям памяти.
Создайте блокированное изображение с помощью модифицированной версии учебного изображения лимфатического узла, содержащего ткань опухоли от набора данных CAMELYON16. Модифицированное изображение имеет три крупных уровня разрешения. Пространственная ссылка была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.
bim = blockedImage("tumor_091R.tif");
Набор данных CAMELYON16 обеспечивает метки для опухоли и нормальных областей в виде набора координат, задающих вручную аннотируемые контуры области относительно самого прекрасного уровня разрешения. Когда пиксели существуют в контурах и нормальной области и области опухоли, правильная метка для тех пикселей является нормальной тканью.
Загрузите данные о метке для блокированного изображения. Этот пример использует модифицированную версию меток tumor_091.tif
отобразите от набора данных CAMELYON16. Исходные метки хранятся в формате XML. Модифицированные метки передискретизировались и сохранены как файл MAT.
roiPoints = load("labelledROIs.mat")
roiPoints = struct with fields:
nonCancerRegions: {[46×2 double]}
cancerRegions: {6×1 cell}
Создайте многоугольные объекты ROI, которые хранят координаты контуров опухоли и нормальных контуров ткани.
tumorPolys = cellfun(@(position) images.roi.Polygon( ... Position=position,Visible="on",Color="r"), ... roiPoints.cancerRegions); normalPolys = cellfun(@(position) images.roi.Polygon( ... Position=position,Visible="on",Color="g"), ... roiPoints.nonCancerRegions);
Отобразите изображение, наложенное с многоугольными ROI. ROI имеют ту же систему координат, как изображение, таким образом изменяя уровень разрешения отображенного изображения все еще представляет ROI точно.
h = bigimageshow(bim);
set(tumorPolys,Parent=gca);
set(normalPolys,Parent=gca);
title("Resolution Level: " + num2str(h.ResolutionLevel));
Увеличьте масштаб одного ROI. Контур области опухоли отображают красным и окружает внутреннюю область нормальной ткани, отображенной зеленым.
xlim([3940 4290])
ylim([2680 3010])
title("Resolution Level: " + num2str(h.ResolutionLevel));
Используйте polyToBlockedImage
функция, чтобы создать помеченное блокированное изображение ROI координирует данные. polyToBlockedImage
функция требует координат ROI, меток ROI, и размер выхода блокировал изображение как входные параметры.
Получите данные xy-координаты для нормальных областей и областей опухоли, и объедините их в один roiPositions
cellArray.
normalRegions = roiPoints.nonCancerRegions; tumorRegions = roiPoints.cancerRegions; roiPositions = [normalRegions; tumorRegions];
Найдите количество нормальных и областей опухоли, и присвойте метку 1
к нормальной ткани и метке 2
к ткани опухоли. Присвойте метки в том же порядке, заданном roiPositions
. Задайте метки как uint8
значения, чтобы уменьшать память, требуемую для устройства хранения данных.
numNormalRegions = numel(normalRegions); numTumorRegions = numel(tumorRegions); roiLabelIDs = [ones(numNormalRegions,1,"uint8"); 2*ones(numTumorRegions,1,"uint8")];
Выберите уровень нужного разрешения для нового блокированного изображения. Этим выбором является компромисс между КПД и точностью. Используя более грубое разрешение уровень уменьшает время вычислений и размер ресурса хранения. Используя более прекрасное разрешение уровень увеличивает уровень детализации, сохраненный в маске. Крупные уровни разрешения могут использоваться для регулярных ROI как многоугольники. Для маленьких, ROI от руки уровень высокого разрешения может быть более соответствующим. В данном примере используйте промежуточный уровень разрешения.
maskLevel = 2;
Задайте размер изображения для нового блокированного изображения, чтобы совпадать с тем из оригинального изображения, bim
, на уровне нужного разрешения.
imageSize = bim.Size(maskLevel,1:2);
Создайте помеченное блокированное изображение. Обеспечьте пространственную ссылку исходного блокированного изображения, bim
, на уровне нужного разрешения. По умолчанию пиксели, которые не падают ни в каком ROI, присвоены числовая метка 0
.
bROILabels = polyToBlockedImage(roiPositions,roiLabelIDs,imageSize,BlockSize=bim.BlockSize(maskLevel,1:2), ...
WorldStart=bim.WorldStart(maskLevel,1:2),WorldEnd=bim.WorldEnd(maskLevel,1:2));
Отобразите помеченное блокированное изображение, наложенное на оригинальном изображении. Области опухоли отображают красным, и нормальную область ткани, полностью заключенную в область опухоли, отображают зеленым. Фон и нормальную ткань, соединенную с фоном, отображают синим, указывая, что связанные нормальные области неправильно классифицируются как фон.
hbim = bigimageshow(bim); showlabels(hbim,bROILabels,Colormap=[0 0 1; 0 1 0; 1 0 0]);
Увеличьте масштаб нормальной области ткани, отображенной в зеленом. Визуально проверьте, что контуры ROI представлены достаточной деталью.
xlim([3940 4290]) ylim([2680 3010])
Используйте сегментацию изображений, чтобы создать маску, которая правильно отличает нормальную ткань от фона. Поскольку пороговая обработка требует чтения данных об основном изображении в память и фоновые области памяти, и области переднего плана являются достаточно большими, самый грубый уровень разрешения является соответствующим. Маской является 1
TRUE
) для пикселей, полутоновое значение которых меньше 130. Заполните маленькие отверстия в маске путем выполнения морфологического закрытия с помощью bwmorph
функция.
btissueMask = apply(bim, ... @(bs)bwmorph(rgb2gray(bs.Data)<130,"close"),Level=3); bigimageshow(btissueMask);
Объедините маску ткани и данные о метке ROI в финал помеченное блокированное изображение. Несмотря на то, что изображение ROI было создано на более прекрасном уровне разрешения, чем маска ткани, они могут быть обработаны вместе, потому что они выведены из того же изображения и имеют те же мировые степени. Используйте combineLabels
функция помощника, которая задана в конце этого примера.
bLabels = apply(bROILabels,@combineLabels,ExtraImages=btissueMask);
Отобразите помеченное блокированное изображение, наложенное на оригинальном изображении. Три метки (нормальный, опухоль и фон) появляются в зеленом, красном цвете, и синий соответственно.
hbim = bigimageshow(bim);
showlabels(hbim,bLabels,Colormap=[0 0 1; 0 1 0; 1 0 0]);
title("Background (Blue), Normal Tissue (Green), Tumor (Red)")
Увеличьте масштаб необходимой области, чтобы исследовать в более близких деталях.
xlim([3940 4290]) ylim([2680 3010])
combineLabels
комбинирует основанное на ROI изображение метки и основанное на маске изображение метки в одно изображение метки.
function blabel = combineLabels(bs,btissueMask) % The tissue mask block is smaller in size btissueMask = imresize(btissueMask,size(bs.Data)); % Convert to labels, 0 is background, 1 is foreground. blabel = uint8(btissueMask); % Label tumor regions with 2 blabel(bs.Data==2) = 2; end
blockedImage
| bigimageshow
| blockedImageDatastore