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

В этом примере показано, как обработать большое изображение эффективно при помощи маски, чтобы изолировать ROI.

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

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

Создайте bigimage. Это примеры использует модифицированную версию изображения "tumor_091.tif" от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.

bim = bigimage('tumor_091R.tif');

Отобразите большое изображение при помощи bigimageshow функция.

bigimageshow(bim);

Создайте маску

Определите размер изображения на самом грубом уровне.

coarseLevel = bim.CoarsestResolutionLevel;
coarseLevelSize = bim.LevelSizes(coarseLevel,:)
coarseLevelSize =

   625   670

Получите изображение на самом грубом уровне разрешения.

imLowRes = bim.getFullLevel(bim.CoarsestResolutionLevel);

Можно использовать imageSegmenter приложение, чтобы сгенерировать маску от крупного уровня. Приложение ожидает полутоновое входное изображение, поэтому получите канал легкости от крупного изображения.

imLowResL = rgb2lightness(imLowRes);

Чтобы запустить imageSegmenter приложение, введите эту команду в командном окне: imageSegmenter(imLowResL)

Можно экспортировать маску, BW, или код, который воспроизводит обработку pipleline, раньше создавал маску. Этот раздел примера использует код, который экспортирует приложение. Запустите этот код, чтобы создать маску из крупного входного изображения.

Автоматически сгенерированный imageSegmenter приложением 05 июня 2019

%----------------------------------------------------
% 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)

Создайте bigimage от маски с той же пространственной ссылкой как маска ввода.

bmask = bigimage(BW, ...
    'SpatialReferencing',bim.SpatialReferencing(coarseLevel));

Отобразите маску с зеленым фоном.

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')
snapnow

Чтобы обработать больше блоков изображения, уменьшите порог включения.

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,1, ...
    @(block)imnlmfilt(block,'DegreeOfSmoothing',15));
tFullProcessing = toc;

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

tic
boutMasked = apply(bim,1, ...
    @(block)imnlmfilt(block,'DegreeOfSmoothing',15), ...
    'Mask',bmask,'InclusionThreshold',0);
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.7672x

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

Можно уменьшиться, размер блока, чтобы получить более трудное переносят 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 с уменьшенным размером блока.

tic
boutMasked = apply(bim,1, ...
    @(block)imnlmfilt(block,'DegreeOfSmoothing',15), ...
    'Mask',bmask,'BlockSize',blockSize,'InclusionThreshold',0);
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: 1.3781x

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

| |