В этом примере показано, как обработать блокированное изображение эффективно при помощи маски, чтобы изолировать видимые области (ROIs).
Некоторые источники больших изображений имеют значимые данные только в небольшой части изображения. Можно улучшить общее время вычислений путем ограничения обрабатывающий к ROI, содержащему значимые данные. Используйте маску, чтобы задать ROI. Маска является логическим изображением в который true
пиксели представляют ROI.
В блокированном рабочем процессе изображений маска представляет ту же пространственную область как данные изображения, но это не должно быть одного размера с изображением. Чтобы далее повысить эффективность рабочего процесса, создайте маску из крупного изображения, особенно то, которое умещается в памяти. Затем используйте крупную маску, чтобы обработать более прекрасные изображения.
Создайте блокированное изображение с помощью модифицированной версии изображения tumor_091.tif
от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.
bim = blockedImage("tumor_091R.tif");
Отобразите блокированное изображение при помощи bigimageshow
функция.
bigimageshow(bim);
Определите размер изображения на самом грубом уровне.
coarseLevel = bim.NumLevels; % The highest numbered level is the 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); showlabels(h,bmask,AlphaDat=bmask,Alphamap=[0 0.5],Colormap=[0 0 0; 0 1 0])
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.6918x
Можно уменьшиться, размер блока, чтобы создать более трудное переносят 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 с меньшими блоками ко времени выполнения обработки целого ROI с исходными блоками.
disp("Additional speedup using mask with decreased block size: " + ... num2str(tMaskedProcessing/tSmallerBlockProcessing) + "x");
Additional speedup using mask with decreased block size: 0.9917x