Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Procesar imágenes grandes de manera eficiente usando la máscara

En este ejemplo se muestra cómo procesar una imagen grande de forma eficaz mediante el uso de una máscara para aislar los ROI.

Algunas fuentes de imágenes grandes tienen datos significativos en solo una pequeña parte de la imagen. Puede mejorar el tiempo total de procesamiento limitando el procesamiento a las regiones de interés (ROI) que contienen datos significativos. Utilice una máscara para definir los ROI. Una máscara es una imagen lógica en la que los píxeles representan el ROI.true

En el flujo de trabajo, la máscara representa la misma región espacial que los datos de imagen, pero no necesita tener el tamaño que la imagen.bigimage Para mejorar aún más la eficiencia del flujo de trabajo, cree una máscara a partir de una imagen gruesa, especialmente una que se ajuste a la memoria. A continuación, utilice la máscara gruesa para procesar las imágenes más finas.

Cree un archivo .bigimage Este ejemplo utiliza una versión modificada de la imagen "tumor_091.tif" del archivo .Conjunto de datos CAMELYON16 La imagen original es una imagen de entrenamiento de un ganglio linfático que contiene tejido tumoral. La imagen original tiene ocho niveles de resolución, y el nivel más alto tiene resolución 53760-por-61440. La imagen modificada tiene solo tres niveles de resolución gruesa. La referencia espacial de la imagen modificada se ha ajustado para aplicar una relación de aspecto coherente y registrar entidades en cada nivel.

bim = bigimage('tumor_091R.tif'); 

Muestre la imagen grande utilizando la función.bigimageshow

bigimageshow(bim); 

Crear máscara

Determine el tamaño de la imagen en el nivel más grueso.

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

Obtenga la imagen en el nivel de resolución más grueso.

imLowRes = bim.getFullLevel(bim.CoarsestResolutionLevel); 

Puede usar la aplicación imageSegmenter para generar una máscara a partir del nivel grueso. La aplicación espera una imagen de entrada en escala de grises, así que obtenga el canal de ligereza de la imagen gruesa.

imLowResL = rgb2lightness(imLowRes); 

Para ejecutar la aplicación imageSegmenter, escriba este comando en la ventana de comandos:imageSegmenter(imLowResL)

Puede exportar la máscara o el código que reproduce la piplelina de procesamiento utilizada para crear una máscara.BW En esta sección del ejemplo se usa código que exporta la aplicación. Ejecute este código para crear una máscara a partir de la imagen de entrada gruesa.

Generado automáticamente por la aplicación imageSegmenter el 05-Jun-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) 

Cree una a partir de la máscara con la misma referencia espacial que la máscara de entrada.bigimage

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

Muestre la máscara con un fondo verde.

h = bigimageshow(bim); h.Parent.Color = 'g'; h.Parent.Alphamap = [1 .5]; h.AlphaData = bmask; h.AlphaDataMapping = 'direct'; 

Ajustar el umbral de inclusión para cubrir la región de interés

La función procesa imágenes grandes de un bloque a la vez.apply Puede utilizar la propiedad con la máscara para especificar qué bloques utiliza la función.'InclusionThreshold'apply El umbral de inclusión especifica el porcentaje de píxeles de máscara que deben ser para procesar el bloque.trueapply

Resalte los bloques que se procesarán utilizando el umbral de inclusión predeterminado, .apply0.5 Solo se procesarán los bloques centrales, resaltados en verde.

h = bigimageshow(bim); showmask(h,bmask,1); title('Mask with Default Inclusion Threshold') snapnow 

Para procesar más bloques de la imagen, disminuya el umbral de inclusión.

showmask(h,bmask,1,'InclusionThreshold', 0.4); title('InclusionThreshold == 0.4') 

En el caso extremo, procese todos los bloques que tengan al menos un solo píxel en la máscara.true Para especificar esta opción, establezca la propiedad en .'InclusionThreshold'0 No se incluyen todos los bloques de la imagen.

showmask(h,bmask,1,'InclusionThreshold',0); title('InclusionThreshold == 0') 

El uso de la máscara con cualquier valor de disminuirá el tiempo total de ejecución porque procesará menos bloques que la imagen completa.'InclusionThreshold'apply La ventaja de usar una máscara se vuelve más significativa a medida que la imagen aumenta en resolución y a medida que las canalizaciones de procesamiento aumentan en complejidad.

Mida el tiempo de ejecución del filtrado de la imagen completa.

tic bout = apply(bim,1, ...     @(block)imnlmfilt(block,'DegreeOfSmoothing',15)); tFullProcessing = toc; 

Mida el tiempo de ejecución del filtrado solo bloquea con el 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) ']']); 

Compare el tiempo de ejecución del procesamiento de la imagen completa en comparación con el procesamiento de solo bloques en el ROI.

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

Ajuste el tamaño del bloque para seguir los contornos de la región de interés

Puede reducir el tamaño del bloque para obtener una envoltura más ajustada alrededor del ROI. Para algunos tamaños de bloque, esto reducirá el tiempo de ejecución porque procesará menos píxeles fuera del ROI.apply Sin embargo, si el tamaño del bloque es demasiado pequeño, el rendimiento disminuirá porque la sobrecarga de procesamiento de un mayor número de bloques compensará la reducción en el número de píxeles procesados.

Resalte los bloques que se procesarán con un tamaño de bloque más pequeño.apply Para especificar el tamaño del bloque, establezca la propiedad.'BlockSize'

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

Mida el tiempo de ejecución del filtrado de todos los bloques dentro del ROI con un tamaño de bloque reducido.

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

Compare el tiempo de ejecución del procesamiento de todo el ROI con bloques más pequeños en comparación con bloques más grandes.

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

Consulte también

| |