Настройте пространственные ссылки для заблокированных изображений

В этом примере показано, как настроить и проверить пространственную ссылочную информацию blockedImage объект.

Пространственные ссылки на заблокированные изображения

Заблокированные изображения работают с мультирезолюционными изображениями, в которых данные изображения сцены хранятся как набор изображений на разных уровнях разрешения. Заблокированные изображения предполагают, что пространственные границы каждого уровня одинаковы, другими словами, что все уровни охватывают одну и ту же физическую область в реальном мире. Первым шагом в работе с большим мультиразрешением является подтверждение этого предположения.

Загрузка данных заблокированных изображений

В этом примере используется одно изображение из Camelyon16 набора данных. Этот набор данных содержит 400 изображений с полным слайдом (WSI) лимфатических узлов, сохраненных в виде мультирезолюционных файлов, которые являются слишком большими, чтобы быть загруженными в память.

Создайте директорию для хранения Camelyon16 изображения.

imageDir = fullfile('I:\','Camelyon16');
if ~exist(imageDir,'dir')
    mkdir(imageDir);
end

Чтобы скачать изображение, зайдите на Camelyon17 сайт и щелкните первую ссылку «CAMELYON16 данных set». Откройте директорию «обучение» затем «опухоль». Загрузите файл «tumor_091.tif» и переместите файл в директорию, заданный imageDir переменная.

Исследуйте пространственные ссылки по умолчанию

Создайте blockedImage объект с пространственной справочной информацией по умолчанию. По умолчанию заблокированное изображение устанавливает пространственные ссылки на каждый уровень так же, как и на самый мелкий слой. Самый мелкий слой является слоем, который имеет самое высокое разрешение и больше всего пикселей.

fileName = fullfile(imageDir,'tumor_091.tif');
bim = blockedImage(fileName);

Отобразите пространственную ссылочную информацию на самом высоком уровне. Размер изображения (заданный как Size свойство) соответствует границам в мировых координатах. Заметьте, что система координат изображения по умолчанию помещает центр первого пикселя в (1,1). Поскольку границы пикселей имеют ширину 1 модуль в каждой размерности, левый край первого пикселя начинается с (0.5,0.5).

finestLevel = 1;
finestStart = bim.WorldStart(finestLevel,:)
finestEnd = bim.WorldEnd(finestLevel,:)
finestStart =

    0.5000    0.5000    0.5000


finestEnd =

   1.0e+04 *

    5.3761    6.1441    0.0003

Отобразите пространственную ссылочную информацию на самом грубом уровне. Мировые границы совпадают с самым мелким уровнем, но размер грубого изображения составляет всего 512 на 512 пикселей. Эффективно, каждый пиксель в этом грубом уровне соответствует блоку 105 на 120 пикселей в лучшем разрешении.

coarsestLevel = bim.NumLevels;
coarsestStart = bim.WorldStart(coarsestLevel,:)
coarsestEnd = bim.WorldEnd(coarsestLevel,:)
coarsestStart =

    0.5000    0.5000    0.5000


coarsestEnd =

   1.0e+04 *

    5.3761    6.1441    0.0003

Проверьте соотношение сторон

Отобразите размер изображения и соотношение сторон на каждом уровне. Соотношение сторон не является последовательным, что указывает на то, что уровни не все охватывают одну и ту же мировую площадь. Поэтому предположение по умолчанию неверно для этого изображения.

t = table((1:8)',bim.Size(:,1),bim.Size(:,2), ...
    bim.Size(:,1)./bim.Size(:,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   

Отобразите слои для сравнения пространственных границ

Отображение заблокированного изображения при помощи bigimageshow функция. Отобразите наиболее грубый уровень разрешения.

figure
subplot(1,2,1);
hl = bigimageshow(bim,'ResolutionLevel',coarsestLevel);
title('Coarsest Resolution Level (8)')
%

Отобразите данные изображения на уровне разрешения по умолчанию в том же окне рисунка. По умолчанию bigimageshow выбирает уровень для отображения в зависимости от разрешения экрана и размера отображаемой области.

subplot(1,2,2);
hr = bigimageshow(bim);
title('Default Resolution Level')
%

Убедитесь, что оба отображений показывают одинаковые границы.

linkaxes([hl.Parent,hr.Parent]);

Проверяйте пространственные ссылки по умолчанию

Изменение масштаба функции.

xlim([45000 50000]);
ylim([12000 17000]);

Измените уровень разрешения изображения в правой части окна рисунка. На уровне 6 функции выглядят выровненными с самым грубым уровнем.

hr.ResolutionLevel = 6;
title('Level 6');
snapnow
%

На уровне 1 функции не выровнены. Поэтому уровни 1 и 8 не охватывают одни и те же границы мира.

hr.ResolutionLevel = 1;
title('Level 1');
snapnow
%

Получение пространственных границ из метаданных заблокированных изображений

Обычно исходный источник данных имеет пространственную ссылочную информацию, закодированную в его метаданных. Для Camelyon16 набора данных пространственная ссылочная информация сохранена как XML- содержимое в ImageDescription поле метаданных на самом высоком уровне разрешения. XML- содержимое имеет атрибут DICOM_PIXEL_SPACING для каждого уровня разрешения, который задает границы пикселей.

Получите ImageDescription поле метаданных на самом высоком уровне разрешения blockedImage объект.

binfo = imfinfo(bim.Source);
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" &quot

Установите пространственные границы

Вычислите относительную ширину пикселя между уровнем 8 и уровнем 1.

pixelDims = pixelSpacing_L8/pixelSpacing_L1;

Самый мелкий уровень имеет ссылку пространственную протяженность. Вычислите соответствующие границы для уровня 8 относительно границ уровня 1.

worldExtents = bim.Size(8,1:2).*pixelDims;

Обновите пространственную привязку уровня 8.

bim.WorldEnd(8,1:2) =  worldExtents(2);

Проверьте выравнивание с помощью пользовательских пространственных ссылок

Повторно отобразите данные, чтобы подтвердить выравнивание ключевой возможности. Отображение уровня 8 на левой оси и уровня 1 на правой оси.

hl.CData = bim;
hl.ResolutionLevel = 8;
snapnow
hr.CData = bim;
hr.ResolutionLevel = 1;
snapnow

См. также

|

Похожие темы