В этом примере показано, как обработать блокированное изображение эффективно при помощи маски, чтобы изолировать ROI.
Некоторые источники больших изображений имеют значимые данные только в небольшой части изображения. Можно улучшить общее время вычислений путем ограничения обрабатывающий к видимым областям (ROI), содержащим значимые данные. Используйте маску, чтобы задать ROI. Маска является логическим изображением в который true
пиксели представляют ROI.
В блокированном рабочем процессе изображений маска представляет ту же пространственную область как данные изображения, но это не должно не иметь того же размера как изображение. Чтобы далее повысить эффективность рабочего процесса, создайте маску из крупного изображения, особенно то, которое умещается в памяти. Затем используйте крупную маску, чтобы обработать более прекрасные изображения.
Создайте блокированное изображение с помощью модифицированной версии изображения "tumor_091.tif" от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.
bim = blockedImage('tumor_091R.tif');
Отобразите блокированное изображение при помощи bigimageshow
функция.
bigimageshow(bim);
Определите размер изображения на самом грубом уровне.
coarseLevel = bim.NumLevels; % maximum is coarsest level
coarseLevelSize = bim.Size(coarseLevel,:)
coarseLevelSize = 1×3
625 670 3
Получите изображение на самом грубом уровне разрешения.
imLowRes = gather(bim);
Можно сгенерировать маску от крупного уровня с помощью приложения Image Segmenter. Приложение ожидает полутоновое входное изображение, поэтому получите канал легкости от крупного изображения.
imLowResL = rgb2lightness(imLowRes);
Чтобы запустить приложение Image Segmenter, введите эту команду в командном окне: imageSegmenter(imLowResL)
. После того, как вы задаете маску, экспортируете маску, BW
, или код, что приложение раньше создавало маску. Этот раздел примера использует код, экспортируемый из приложения. Запустите этот код, чтобы создать маску из крупного входного изображения.
%---------------------------------------------------- % 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)
Создайте блокированное изображение из маски с той же пространственной ссылкой как маска ввода.
bmask = blockedImage(BW,'WorldEnd',bim.WorldEnd(3,1:2));
Отобразите маску с зеленым фоном.
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')
Чтобы обработать больше блоков изображения, уменьшите порог включения.
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, ... @(bs)imnlmfilt(bs.Data,'DegreeOfSmoothing',15)); tFullProcessing = toc;
Измерьтесь время выполнения фильтрации только блокируется с ROI.
bls = selectBlockLocations(bim, "Mask", bmask,"InclusionThreshold", 0); tic boutMasked = apply(bim, ... @(bs)imnlmfilt(bs.Data,'DegreeOfSmoothing',15), ... 'BlockLocationSet',bls); 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.6988x
Можно уменьшиться, размер блока, чтобы получить более трудное переносят 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 с уменьшенным размером блока.
bls = selectBlockLocations(bim, "Mask",bmask,"InclusionThreshold", 0); tic boutMasked = apply(bim, ... @(bs)imnlmfilt(bs.Data,'DegreeOfSmoothing',15), ... 'BlockLocationSet',bls);
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: 0.97433x