Transformaciones afines usando Scipy#

En esta sección demostramos cómo aplicar una transformación afín usando scipy.

import numpy as np
from skimage.io import imread, imshow
from scipy import ndimage as ndi
image = imread('../../data/Haase_MRT_tfl3d1.tif')
imshow(image[100])
image.shape
(192, 256, 256)
../_images/b9ec53895c9942461dd35e1b88b95a9557441ceb09c074bd865d8bb6ddfdb74b.png

Las transformaciones afines se definen típicamente utilizando matrices de transformación.

Por ejemplo, podemos introducir un factor de escala en dicha matriz como en el siguiente ejemplo. Típicamente, la transformación inversa se maneja en estas matrices. En el caso de escalar, necesitamos introducir un factor de escala de 0.5 si queremos aumentar el tamaño de la imagen por un factor de 2. La razón es que la matriz de transformación afín define la transformación que necesita aplicarse desde cada píxel en la imagen de destino a cada píxel en la imagen de origen. Si la imagen de destino es el doble de grande que la de origen, necesitamos multiplicar las coordenadas de los píxeles de destino por 0.5 para determinar las coordenadas de los píxeles correspondientes en la imagen de origen.

# scaling by factor 1 / s
s = 0.5
matrix = np.asarray([
    [s, 0, 0, 0],
    [0, s, 0, 0],
    [0, 0, s, 0],
    [0, 0, 0, 1],
])

Antes de aplicar la transformación, también necesitamos calcular el tamaño de la imagen de salida (forma) y crear esa imagen de salida:

output_shape = tuple((np.asarray(image.shape) / s).astype(int))
scaled = np.ndarray(output_shape)
scaled.shape
(384, 512, 512)
result = ndi.affine_transform(image, matrix, output=scaled, output_shape=output_shape)
imshow(scaled[200], cmap="Greys_r", vmin=0)
<matplotlib.image.AxesImage at 0x14efd955df0>
../_images/278376013e6ab625f623e6a2b01e4906416b1740025c14410368b67414979692.png