Main Content

Warp Big Image

En este ejemplo se muestra cómo aplicar una transformación geométrica (deformación) a una imagen grande.

La aplicación de una transformación geométrica a una imagen es un paso clave en muchas aplicaciones de procesamiento de imágenes, como el registro de imágenes. Puede utilizar para deformar imágenes gruesas que se ajusten en memoria.imwarp Para imágenes grandes de alta resolución que no caben en la memoria, los bloques warp de la imagen. Establezca la referencia espacial de la imagen deformada para conservar las características de la imagen, como las extensiones de píxel.

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

Aplicar transformación geométrica a la imagen gruesa

Cree un objeto que almacene información sobre una transformación geométrica afín.affine2d Esta transformación aplica traducción y cizallamiento.

tform = affine2d([     0.99 0.01 0     0.17 0.98 0     120 -30 1]);

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

imCoarse = getFullLevel(bim);

Deformar la imagen gruesa mediante el uso de .imwarp Muestre la imagen original y la imagen deformada en un montaje.

imCoarseWarped = imwarp(imCoarse,tform); montage({imCoarse,imCoarseWarped})

Crear referencia espacial para imagen fina deformada

Antes de aplicar la transformación geométrica a la imagen a un nivel de resolución fina, calcule la referencia espacial de la imagen grande después de la deformación. Utilice esta referencia espacial al transformar bloques

Obtenga la extensión de píxel de la imagen original de su información de referencia espacial.

srcLevel = bim.FinestResolutionLevel; inRef = bim.SpatialReferencing(srcLevel); inPixelExtent = [inRef.PixelExtentInWorldX,inRef.PixelExtentInWorldY];

Calcule los límites espaciales horizontales y verticales de salida cuando se aplique la transformación.

[xout,yout] = outputLimits(tform,inRef.XWorldLimits,inRef.YWorldLimits);

Calcule el tamaño de la imagen de salida que conserva la extensión de píxel. Especifique el tamaño de la imagen en el formato [ , ].numrowsnumcols

outImgSize = [ceil(diff(yout)/inPixelExtent(2)),ceil(diff(xout)/inPixelExtent(1))];

Cree un objeto que almacene la información de referencia espacial de la imagen deformada.imref2d Establezca los límites del mundo y el tamaño de la imagen deformada.

outRef = imref2d(outImgSize,xout,yout)
outRef =    imref2d with properties:             XWorldLimits: [120.5800 6275]            YWorldLimits: [-29.5050 4.9241e+03]               ImageSize: [4954 6155]     PixelExtentInWorldX: 0.9999     PixelExtentInWorldY: 0.9999     ImageExtentInWorldX: 6.1544e+03     ImageExtentInWorldY: 4.9536e+03        XIntrinsicLimits: [0.5000 6.1555e+03]        YIntrinsicLimits: [0.5000 4.9545e+03]  

Especifique el origen de la salida como el píxel superior izquierdo.

outOrigin = [xout(1),yout(1)];

Calcule las dimensiones de píxeles de salida correspondientes.

outPixelExtent = [outRef.PixelExtentInWorldX,outRef.PixelExtentInWorldY]; halfPixWidth = outPixelExtent/2;

Aplicar deformación de bloques a imagen fina

Cree una escritura especificando la información de referencia espacial de salida.bigimage Especifique un tamaño de bloque que sea lo suficientemente grande como para utilizar la memoria de forma eficaz.

outBlockSize = [1024 1024]; bwarped = bigimage(outRef,bim.Channels,bim.ClassUnderlying, ...     'BlockSize',outBlockSize);

Recorlas la imagen de salida, un bloque a la vez. Para cada bloque de salida:

  1. Busque las coordenadas de las cuatro esquinas del bloque de salida.

  2. Los mapas inversos asignan estas coordenadas a la entrada para obtener la región de entrada (origen).

  3. Lea el contenido de la región de entrada.

  4. Cree referencias espaciales que describan la región de entrada.

  5. Calcule el contenido del bloque de salida mediante .imwarp

  6. Escriba el bloque de salida en la imagen de salida mediante la función.setBlock

Si tiene Parallel Computing Toolbox™, puede reemplazar la instrucción externa por una instrucción para ejecutar el bucle en paralelo.forparfor

colStarts = 1:outBlockSize(2):outRef.ImageSize(2); for cInd = 1:numel(colStarts)     colStart = colStarts(cInd);     for rStart = 1:outBlockSize(1):outRef.ImageSize(1)                  % Center of top left pixel of this block in world units         xyStart = [colStart,rStart].* outPixelExtent;         xyStart = xyStart + outOrigin;                  % Center of bottom right pixel of this block in world units         bsize = fliplr(bwarped.BlockSize); % (r,c) -> (x,y)         xyEnd = ([colStart,rStart] + (bsize-1)).*outPixelExtent;         xyEnd = xyEnd + outOrigin;                  % Output bounding box         outbbox = [xyStart             xyStart(1) xyEnd(2)             xyEnd(1) xyStart(2)             xyEnd];                  % Corresponding spatial reference which describes this rectangle         outRegionRef = imref2d(bsize);         outRegionRef.XWorldLimits = [xyStart(1)-halfPixWidth(1),xyEnd(1)+halfPixWidth(1)];         outRegionRef.YWorldLimits = [xyStart(2)-halfPixWidth(2),xyEnd(2)+halfPixWidth(2)];                  % Get corresponding input region. The region is not rectangular if the transformation         % includes shear         inRegion = transformPointsInverse(tform,outbbox);                     % Clamp to image extents (working with pixel centers)         xcenterLims = inRef.XWorldLimits + [halfPixWidth(1)-halfPixWidth(1)];         ycenterLims = inRef.YWorldLimits + [halfPixWidth(2)-halfPixWidth(2)];         inRegion(:,1) = max(inRegion(:,1),xcenterLims(1));         inRegion(:,1) = min(inRegion(:,1),xcenterLims(2));         inRegion(:,2) = max(inRegion(:,2),ycenterLims(1));         inRegion(:,2) = min(inRegion(:,2),ycenterLims(2));                  % Find the input bounding box (still using pixel centers)         inbboxStart = [min(inRegion(:,1)) min(inRegion(:,2))];         inbboxEnd = [max(inRegion(:,1)) max(inRegion(:,2))];                  % Read corresponding input region          inputRegion = getRegion(bim,srcLevel,inbboxStart,inbboxEnd);                  % Input region's spatial referencing         inRegionRef = imref2d(size(inputRegion));         % Convert to pixel edges from pixel centers         inRegionRef.XWorldLimits = [inbboxStart(1)-halfPixWidth(1),inbboxEnd(1)+halfPixWidth(2)];         inRegionRef.YWorldLimits = [inbboxStart(2)-halfPixWidth(1),inbboxEnd(2)+halfPixWidth(2)];                  warpedBlock = imwarp(inputRegion,inRegionRef,tform,'OutputView',outRegionRef);                  % Set the block data in the output bigimage         setBlock(bwarped,1,xyStart,warpedBlock);     end end

Muestre la imagen deformada.

bigimageshow(bwarped)

Consulte también

| | | | | |