Transformations affines avec Scipy#
Dans cette section, nous démontrons comment appliquer une transformation affine en utilisant 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)
Les transformations affines sont généralement définies à l’aide de matrices de transformation.
Par exemple, nous pouvons entrer un facteur d’échelle dans une telle matrice comme suit. Typiquement, la transformation inverse est gérée dans ces matrices. Dans le cas de la mise à l’échelle, nous devons entrer un facteur d’échelle de 0.5 si nous voulons augmenter la taille de l’image d’un facteur 2. La raison est que la matrice de transformation affine définit la transformation qui doit être appliquée de chaque pixel de l’image cible à chaque pixel de l’image source. Si l’image cible est deux fois plus grande que la source, nous devons multiplier les coordonnées des pixels cibles par 0.5 pour déterminer les coordonnées des pixels sources correspondants.
# mise à l'échelle par un facteur 1 / s
s = 0.5
matrix = np.asarray([
[s, 0, 0, 0],
[0, s, 0, 0],
[0, 0, s, 0],
[0, 0, 0, 1],
])
Avant d’appliquer la transformation, nous devons également calculer la taille de l’image de sortie (forme) et créer cette image de sortie :
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>