В этом примере показано, как обработать большое изображение эффективно при помощи маски, чтобы изолировать ROI.
Некоторые источники больших изображений имеют значимые данные только в небольшой части изображения. Можно улучшить общее время вычислений путем ограничения обрабатывающий к видимым областям (ROI), содержащим значимые данные. Используйте маску, чтобы задать ROI. Маска является логическим изображением в который true
пиксели представляют ROI.
В bigimage
рабочий процесс, маска представляет ту же пространственную область как данные изображения, но это не должно не иметь размера как изображения. Чтобы далее повысить эффективность рабочего процесса, создайте маску из крупного изображения, особенно то, которое умещается в памяти. Затем используйте крупную маску, чтобы обработать более прекрасные изображения.
Создайте bigimage
. Это примеры использует модифицированную версию изображения "tumor_091.tif" от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.
bim = bigimage('tumor_091R.tif');
Отобразите большое изображение при помощи bigimageshow
функция.
bigimageshow(bim);
Определите размер изображения на самом грубом уровне.
coarseLevel = bim.CoarsestResolutionLevel; coarseLevelSize = bim.LevelSizes(coarseLevel,:)
coarseLevelSize = 625 670
Получите изображение на самом грубом уровне разрешения.
imLowRes = bim.getFullLevel(bim.CoarsestResolutionLevel);
Можно использовать imageSegmenter приложение, чтобы сгенерировать маску от крупного уровня. Приложение ожидает полутоновое входное изображение, поэтому получите канал легкости от крупного изображения.
imLowResL = rgb2lightness(imLowRes);
Чтобы запустить imageSegmenter приложение, введите эту команду в командном окне: imageSegmenter(imLowResL)
Можно экспортировать маску, BW
, или код, который воспроизводит обработку pipleline, раньше создавал маску. Этот раздел примера использует код, который экспортирует приложение. Запустите этот код, чтобы создать маску из крупного входного изображения.
Автоматически сгенерированный imageSegmenter приложением 05 июня 2019
%---------------------------------------------------- % Normalize input data to range in [0,1]. Xmin = min(imLowResL(:)); Xmax = max(imLowResL(:)); if isequal(Xmax,Xmin) imLowResL = 0*imLowResL; else imLowResL = (imLowResL - Xmin) ./ (Xmax - Xmin); end % Threshold image - global threshold BW = imbinarize(imLowResL); % Invert mask BW = imcomplement(BW); % Open mask with square width = 3; se = strel('square', width); BW = imopen(BW, se); %---------------------------------------------------- imshow(BW)
Создайте bigimage
от маски с той же пространственной ссылкой как маска ввода.
bmask = bigimage(BW, ... 'SpatialReferencing',bim.SpatialReferencing(coarseLevel));
Отобразите маску с зеленым фоном.
h = bigimageshow(bim); h.Parent.Color = 'g'; h.Parent.Alphamap = [1 .5]; h.AlphaData = bmask; h.AlphaDataMapping = 'direct';
apply
функциональные процессы большие изображения один блок за один раз. Можно использовать 'InclusionThreshold'
свойство с маской, чтобы задать, который блоки apply
функциональное использование. Порог включения задает процент пикселей маски, которые должны быть true
для apply
обработать блок.
Подсветите блоки что apply
обработает использование порога включения по умолчанию, 0.5
. Только центральные блоки, подсвеченные в зеленом, будут обработаны.
h = bigimageshow(bim);
showmask(h,bmask,1);
title('Mask with Default Inclusion Threshold')
snapnow
Чтобы обработать больше блоков изображения, уменьшите порог включения.
showmask(h,bmask,1,'InclusionThreshold', 0.4); title('InclusionThreshold == 0.4')
В крайнем случае, обрабатывают все блоки, которые имеют, по крайней мере, один true
пиксель в маске. Чтобы задать эту опцию, установите 'InclusionThreshold'
свойство к 0
. Не все блоки изображения включены.
showmask(h,bmask,1,'InclusionThreshold',0); title('InclusionThreshold == 0')
Используя маску с любым значением 'InclusionThreshold'
уменьшит общее время выполнения потому что apply
обработает меньше блоков, чем полный образ. Преимущество использования маски становится более значительным, когда изображение увеличивается в разрешении и как увеличения конвейеров обработки сложности.
Измерьте время выполнения фильтрации полного образа.
tic bout = apply(bim,1, ... @(block)imnlmfilt(block,'DegreeOfSmoothing',15)); tFullProcessing = toc;
Измерьтесь время выполнения фильтрации только блокируется с ROI.
tic boutMasked = apply(bim,1, ... @(block)imnlmfilt(block,'DegreeOfSmoothing',15), ... 'Mask',bmask,'InclusionThreshold',0); tMaskedProcessing = toc; bigimageshow(boutMasked) defaultBlockSize = bim.BlockSize(1,:); title(['Processed Image Using Mask with Default BlockSize == [' ... num2str(defaultBlockSize) ']']);
Сравните время выполнения обработки полного образа по сравнению с обработкой только блокируется в ROI.
disp(['Speedup using mask: ' ... num2str(tFullProcessing/tMaskedProcessing) 'x']);
Speedup using mask: 1.675x
Можно уменьшиться, размер блока, чтобы получить более трудное переносят ROI. Для некоторых размеров блока это будет уменьшать время выполнения потому что apply
обработает меньше пикселей вне ROI. Однако, если размер блока слишком будет мал, то производительность уменьшится, потому что издержки обработки большего числа блока возместят сокращение количества обработанных пикселей.
Подсветите блоки что apply
обработает использование меньшего размера блока. Чтобы задать размер блока, установите 'BlockSize'
свойство.
blockSize = [512 512]; h = bigimageshow(bim); showmask(h,bmask,1,'BlockSize',blockSize,'InclusionThreshold',0); title(['BlockSize == [' num2str(blockSize) '], InclusionThreshold == 0'])
Измерьте время выполнения фильтрации всех блоков в ROI с уменьшенным размером блока.
tic boutMasked = apply(bim,1, ... @(block)imnlmfilt(block,'DegreeOfSmoothing',15), ... 'Mask',bmask,'BlockSize',blockSize,'InclusionThreshold',0); tSmallerBlockProcessing = toc; bigimageshow(boutMasked); title(['Processed Image Using Mask with BlockSize == [' ... num2str(blockSize) ']']);
Сравните время выполнения обработки целого ROI с меньшими блоками по сравнению с большими блоками.
disp(['Additional speedup using mask with decreased block size: ' ... num2str(tMaskedProcessing/tSmallerBlockProcessing) 'x']);
Additional speedup using mask with decreased block size: 1.2794x