В этом примере показано, как настроить и проверить информацию пространственных ссылок blockedImage объект.
Заблокированные изображения работают с изображениями с множественным разрешением, в которых данные изображения сцены хранятся как набор изображений на разных уровнях разрешения. Заблокированные изображения предполагают, что пространственные границы каждого уровня одинаковы, другими словами, что все уровни покрывают одну и ту же физическую область в реальном мире. Первым шагом в работе с большим образом с несколькими решениями является проверка этого предположения.
В этом примере используется одно изображение из набора данных Camelyon16. Этот набор данных содержит 400 изображений всего слайда (WSI) лимфатических узлов, хранящихся в виде файлов TIF с множественным разрешением, которые слишком велики для загрузки в память.
Создайте каталог для хранения Camelyon16 образа.
imageDir = fullfile('I:\','Camelyon16'); if ~exist(imageDir,'dir') mkdir(imageDir); end
Чтобы загрузить изображение, перейдите на веб-сайт Camelyon17 и нажмите первую ссылку «CAMELYON16 набор данных». Откройте каталог «обучение», а затем «опухоль». Загрузите файл «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

