Процесс блокированные изображения эффективно Используя маску

В этом примере показано, как обработать блокированное изображение эффективно при помощи маски, чтобы изолировать видимые области (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

Смотрите также

| |