В этом примере показано, как обработать большое изображение быстро с помощью двух стратегий, которые включают расчеты на меньших репрезентативных пробах изображения с высоким разрешением.
Обработка больших изображений может быть трудоемкой. Это делает итерационную разработку алгоритмов предельно дорогой. Существует два распространенных способа сократить цикл обратной связи: выполните итерации на более низком разрешении, отображают или выполняют итерации на частичной области большого изображения. Этот пример демонстрирует оба из этих подходов для создания маски сегментации для большого изображения.
Если вам установили Parallel Computing Toolbox™, то можно далее ускорить обработку при помощи нескольких рабочих.
Создайте bigimage
использование модифицированной версии изображения "tumor_091.tif" от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.
bim = bigimage('tumor_091R.tif');
Отобразите большое изображение при помощи bigimageshow
функция.
bigimageshow(bim);
Много больших изображений содержат несколько уровней разрешения, включая крупные более низкие версии разрешения самого прекрасного изображения с высоким разрешением. В общем случае распределение отдельных пиксельных значений должно быть примерно равным через все уровни. Усиливая это предположение, можно вычислить глобальную статистику на крупном уровне и затем использовать статистику, чтобы обработать более прекрасные уровни.
Извлеките изображение на самом грубом уровне, затем преобразуйте изображение в шкалу полутонов.
imLowRes = getFullLevel(bim,bim.CoarsestResolutionLevel); imLowResGray = rgb2gray(imLowRes);
Порог изображение в два класса и отображает результат.
thresh = graythresh(imLowResGray); imLowResQuant = imbinarize(imLowResGray,thresh); imshow(imLowResQuant)
Подтвердите на самом большом изображении. Инвертируйте результат получить маску для запятнанной области.
bq = apply(bim,bim.FinestResolutionLevel, ...
@(im)~imbinarize(rgb2gray(im),thresh));
Визуализируйте результат на самом прекрасном уровне.
bigimageshow(bq,'CDataMapping','scaled');
Другой подход, в то время как работа с большими изображениями должна извлечь меньшую область с функциями интереса. Можно вычислить статистику из ROI и затем использовать статистику, чтобы обработать целое изображение с высоким разрешением.
% Zoom in on a region of interest.
bigimageshow(bim);
xlim([2400,3300])
ylim([900 1700])
Извлеките область, показываемую из самого прекрасного уровня.
xrange = xlim; yrange = ylim; imRegion = bim.getRegion(1,[xrange(1),yrange(1)],[xrange(2),yrange(2)]); imshow(imRegion);
Моделируйте с этой областью, затем отображают результаты.
imRegionGray = rgb2gray(imRegion); thresh = graythresh(imRegionGray); imLowResQuant = ~imbinarize(imRegionGray,thresh); imshow(imLowResQuant)
Подтвердите на полном большом изображении и отобразите результаты.
bq = apply(bim, bim.FinestResolutionLevel,... @(im)~imbinarize(rgb2gray(im), thresh)); bigimageshow(bq,'CDataMapping','scaled');
Если вам установили Parallel Computing Toolbox™, то можно распределить обработку на нескольких рабочих, чтобы ускорить обработку. Чтобы попытаться обработать изображение параллельно, установите runInParallel
переменная к true
.
runInParallel = false; if runInParallel % Open a pool p = gcp; % Ensure workers are on the same folder as the file to be able to % access it using just the relative path sourceDir = fileparts(which('tumor_091R.tif')); spmd cd(sourceDir) end % Run in parallel bq = apply(bim,bim.FinestResolutionLevel, ... @(im)~imbinarize(rgb2gray(im),thresh),'UseParallel',true); end