В этом примере показано, как установить и проверить пространственную информацию о ссылке bigimage
объект.
bigimage
bigimage
работает с изображениями мультиразрешения, в которых данные изображения сцены хранятся как набор изображений на различных уровнях разрешения. bigimage
принимает, что пространственные степени каждого уровня являются тем же самым, другими словами, что все уровни покрывают ту же физическую область в реальном мире. Первый шаг в работе с большим изображением мультиразрешения должен подтвердить это предположение.
Это примеры использует одно изображение от набора данных Camelyon16. Этот набор данных содержит 400 изображений целого понижения (WSIs) лимфатических узлов, сохраненных как мультиразрешение.TIF файлы, которые являются слишком большими, чтобы загрузиться в память.
Создайте директорию, чтобы сохранить изображение Camelyon16.
imageDir = fullfile(tempdir,'Camelyon16'); if ~exist(imageDir,'dir') mkdir(imageDir); end
Чтобы загрузить изображение, перейдите к веб-сайту Camelyon17 и щелкните по первой "ссылке" набора данных CAMELYON16. Откройте "обучение" затем директория "опухоли". Загрузите "tumor_091.tif" файл и переместите файл в директорию, заданную imageDir
переменная.
Создайте bigimage
с пространственной информацией о ссылке по умолчанию. По умолчанию, bigimage
устанавливает пространственную ссылку каждого уровня иметь те же мировые степени как самый прекрасный слой. Самый прекрасный слой является слоем, который имеет самое высокое разрешение и большинство пикселей.
bim = bigimage([imageDir '/tumor_091.tif']);
Отобразите пространственную информацию о ссылке на самом прекрасном уровне. Размер изображения (заданный ImageSize
свойство), совпадает со степенями в мировых координатах. Заметьте, что система координат изображений по умолчанию помещает центр первого пикселя в (1,1). Поскольку пиксельные степени являются 1 единицей в ширину в каждой размерности, левый край первого пикселя запускается в (0.5 0.5).
finestLevel = bim.FinestResolutionLevel; finestLevelInfo = bim.SpatialReferencing(finestLevel)
finestLevelInfo = imref2d with properties: XWorldLimits: [0.5000 6.1441e+04] YWorldLimits: [0.5000 5.3761e+04] ImageSize: [53760 61440] PixelExtentInWorldX: 1 PixelExtentInWorldY: 1 ImageExtentInWorldX: 61440 ImageExtentInWorldY: 53760 XIntrinsicLimits: [0.5000 6.1441e+04] YIntrinsicLimits: [0.5000 5.3761e+04]
Отобразите пространственную информацию о ссылке на самом грубом уровне. Мировые степени совпадают с самым прекрасным уровнем, но крупный размер изображения является только 512 512 пикселями. Эффективно, каждый пиксель на этом крупном уровне соответствует 105 120 блок пикселей в самом прекрасном разрешении.
coarsestLevel = bim.CoarsestResolutionLevel; disp(bim.SpatialReferencing(coarsestLevel))
imref2d with properties: XWorldLimits: [0.5000 6.1441e+04] YWorldLimits: [0.5000 5.3761e+04] ImageSize: [512 512] PixelExtentInWorldX: 120 PixelExtentInWorldY: 105 ImageExtentInWorldX: 61440 ImageExtentInWorldY: 53760 XIntrinsicLimits: [0.5000 512.5000] YIntrinsicLimits: [0.5000 512.5000]
Отобразите размер изображения и соотношение сторон на каждом уровне. Соотношение сторон не сопоставимо, который указывает, что уровни все не охватывают ту же мировую область. Поэтому предположение по умолчанию является неправильным для этого изображения.
t = table((1:8)',bim.LevelSizes(:,1),bim.LevelSizes(:,2), ... bim.LevelSizes(:,1)./bim.LevelSizes(:,2), ... 'VariableNames',["Level" "Height" "Width" "Aspect Ratio"]); disp(t)
Level Height Width Aspect Ratio _____ ______ _____ ____________ 1 53760 61440 0.875 2 27136 30720 0.88333 3 13824 15360 0.9 4 7168 7680 0.93333 5 3584 4096 0.875 6 2048 2048 1 7 1024 1024 1 8 512 512 1
Отобразите bigimage
при помощи bigimageshow
функция. Отобразите самый грубый уровень разрешения на левой стороне окна рисунка.
<span class="codeinput">figure</span><span class="codeinput">subplot(1,2,1);</span><span class="codeinput">hl = bigimageshow(bim,'ResolutionLevel',coarsestLevel);</span><span class="codeinput">title('Coarsest Resolution Level (8)')</span>
Данные об изображении на дисплее на уровне разрешения по умолчанию на правой стороне окна рисунка. По умолчанию, bigimageshow
выбирает уровень, чтобы отобразиться на основе разрешения экрана и размера отображенной области.
<span class="codeinput">subplot(1,2,2);</span><span class="codeinput">hr = bigimageshow(bim);</span><span class="codeinput">title('Default Resolution Level')</span>
Убедитесь, что оба отображения показывают те же степени.
<span class="codeinput">linkaxes([hl.Parent,hr.Parent]);</span>
Увеличьте масштаб функции.
<span class="codeinput">xlim([45000 50000]);</span><span class="codeinput">ylim([12000 17000]);</span>
Измените уровень разрешения изображения на правой стороне окна рисунка. На уровне 6 функции выглядят выровненными с самым грубым уровнем.
<span class="codeinput">hr.ResolutionLevel = 6;</span><span class="codeinput">title('Level 6');</span><span class="codeinput">snapnow</span>
На уровне 1 не выравниваются функции. Поэтому уровень 1 и уровень 8 не охватывают те же мировые степени.
<span class="codeinput">hr.ResolutionLevel = 1;</span><span class="codeinput">title('Level 1');</span><span class="codeinput">snapnow</span>
Обычно первоисточнику данных кодировали пространственную информацию о ссылке в ее метаданных. Для набора данных Camelyon16 пространственная информация о ссылке хранится как содержание XML в ImageDescription
поле метаданных на самом прекрасном уровне разрешения. Содержание XML имеет атрибут DICOM_PIXEL_SPACING для каждого уровня разрешения, который задает пиксельные степени.
Получите ImageDescription
поле метаданных на самом прекрасном уровне разрешения bigimage
.
binfo = imfinfo(bim.DataSource); binfo = binfo(1).ImageDescription;
Ищите содержимое строку "DICOM_PIXEL_SPACING". Существует девять найденных соответствий. Второй экземпляр атрибута соответствует пиксельному интервалу самого прекрасного уровня. Последний экземпляр атрибута соответствует пиксельному интервалу самого грубого уровня.
indx = strfind(binfo,"DICOM_PIXEL_SPACING");
Сохраните пиксельный интервал на самом прекрасном уровне. Чтобы извлечь значение пиксельного интервала из текста XML, визуально смотрите текст после второго экземпляра атрибута "DICOM_PIXEL_SPACING".
disp(binfo(indx(2):indx(2)+100)) pixelSpacing_L1 = 0.000227273;
DICOM_PIXEL_SPACING" Group="0x0028" Element="0x0030" PMSVR="IDoubleArray">"0.000227273" &qu
Точно так же сохраните пиксельный интервал на самом грубом уровне. Чтобы извлечь значение пиксельного интервала из текста XML, визуально смотрите текст после последнего экземпляра атрибута "DICOM_PIXEL_SPACING".
disp(binfo(indx(end):indx(end)+100)) pixelSpacing_L8 = 0.0290909;
DICOM_PIXEL_SPACING" Group="0x0028" Element="0x0030" PMSVR="IDoubleArray">"0.0290909" "
Вычислите относительную пиксельную ширину между уровнем 8 и уровнем 1.
pixelDims = pixelSpacing_L8/pixelSpacing_L1;
Самый прекрасный уровень имеет ссылочную пространственную степень. Вычислите соответствующие степени для уровня 8 относительно степеней уровня 1.
worldExtents = bim.SpatialReferencing(8).ImageSize.*pixelDims;
Обновите пространственную ссылку уровня 8.
bim.SpatialReferencing(8).XWorldLimits = [0.5 worldExtents(2)]; bim.SpatialReferencing(8).YWorldLimits = [0.5 worldExtents(1)];
Вновь отобразите данные, чтобы подтвердить выравнивание ключевой возможности. Покажите уровень 8 на левой стороне и уровень 1 на правой стороне.
<span class="codeinput">hl.CData = bim;</span><span class="codeinput">hl.ResolutionLevel = 8;</span><span class="codeinput">hr.CData = bim;</span><span class="codeinput">hr.ResolutionLevel = 1;</span>