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