exponenta event banner

Эффективно обрабатывать заблокированные изображения с помощью маски

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

Вы можете создать маску на грубом уровне с помощью приложения «Сегментатор изображения». Приложение ожидает ввод изображения в градациях серого, поэтому получите канал освещенности от грубого изображения.

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

См. также

| |