В этом примере показано, как настроить и проверить пространственную ссылочную информацию 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" "
Вычислите относительную ширину пикселя между уровнем 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