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

Этот пример показывает, как эффективно обработать заблокированное изображение с помощью маски для изоляции ROIs.

Некоторые источники больших изображений имеют значимые данные только в небольшом фрагменте изображения. Можно улучшить общее время вычислений путем ограничения обработки интересующими вас регионами (ROI), содержащими значимые данные. Используйте маску для определения ROIs. Маска является логическим изображением, в котором true пиксели представляют информация только для чтения.

В рабочем процессе заблокированного изображения маска представляет ту же пространственную область, что и данные изображения, но она не должна иметь такой же размер, как изображение. Чтобы еще больше улучшить эффективность рабочего процесса, создайте маску из грубого изображения, особенно того, которое помещается в памяти. Затем используйте грубую маску для обработки более мелких изображений.

Создайте заблокированное изображение с помощью измененной версии изображения «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 app. Приложение ожидает полутонового входного изображения, поэтому получите канал яркости от грубого изображения.

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';

Корректировка порога включения для охвата области интереса

The 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;

Измерьте время выполнения фильтрации только блоков с информация только для чтения.

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) ']']);

Сравните время выполнения обработки полного изображения по сравнению с обработкой только блоков в информация только для чтения.

disp(['Speedup using mask: ' ...
    num2str(tFullProcessing/tMaskedProcessing) 'x']);
Speedup using mask: 1.6988x

Настройте размер блока, чтобы следовать контурам необходимой области

Можно уменьшить размер блока, чтобы получить более плотный перенос вокруг информация только для чтения. Для некоторых размеров блоков это сократит время выполнения, потому что apply будет обрабатывать меньше пикселей вне информация только для чтения. Однако, если размер блока слишком мал, то эффективность уменьшится, потому что накладные расходы на обработку большего количества блоков будут смещать уменьшение количества обработанных пикселей.

Выделите блоки, которые apply будет обрабатываться с использованием меньшего размера блока. Чтобы задать размер блока, установите 'BlockSize' свойство.

blockSize = [512 512];
h = bigimageshow(bim);
showmask(h,bmask,1,'BlockSize',blockSize,'InclusionThreshold',0);
title(['BlockSize == [' num2str(blockSize) '], InclusionThreshold == 0'])

Измерьте время выполнения фильтрации всех блоков в информация только для чтения с уменьшенным размером блока.

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) ']']);

Сравните время выполнения обработки всего информация только для чтения с меньшими блоками по сравнению с большими блоками.

disp(['Additional speedup using mask with decreased block size: ' ...
    num2str(tMaskedProcessing/tSmallerBlockProcessing) 'x']);
Additional speedup using mask with decreased block size: 0.97433x

См. также

| |