Transformations affines utilisant cupy#

Ici, nous appliquons une transformation affine en utilisant cupy.

from skimage.io import imread, imshow

import cupy
from cupyx.scipy import ndimage as ndi
image = imread('../../data/Haase_MRT_tfl3d1.tif')

imshow(image[100])
image.shape
(192, 256, 256)
../_images/b9ec53895c9942461dd35e1b88b95a9557441ceb09c074bd865d8bb6ddfdb74b.png

De manière analogue aux transformations dans scipy, cupy utilise également des matrices de transformation pour décrire la transformation.

import numpy as np

# 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],
])

Avant de pouvoir appliquer une opération cupy à une image, nous devons l’envoyer dans la mémoire GPU. Nous recevons un handle vers une image sur le GPU qui ne peut pas être affichée en utilisant imshow.

cuda_image = cupy.asarray(image)
cuda_image.shape
(192, 256, 256)

De manière analogue à la transformation affine dans scipy, nous devons créer l’image de sortie avec une forme définie, deux fois plus grande que l’image originale, avant de pouvoir y écrire.

output_shape = tuple((np.asarray(image.shape) / s).astype(int))
cuda_scaled = cupy.ndarray(output_shape)
print(cuda_scaled.shape)
(384, 512, 512)
r = ndi.affine_transform(cuda_image, cupy.asarray(matrix), output=cuda_scaled, output_shape=output_shape)

Avant de pouvoir visualiser l’image résultante, nous devons la transférer de la mémoire GPU à la mémoire CPU

result = cupy.asnumpy(cuda_scaled)
result.shape
(384, 512, 512)
imshow(result[200], cmap="Greys_r", vmin=0)
<matplotlib.image.AxesImage at 0x1d63076bdc0>
../_images/278376013e6ab625f623e6a2b01e4906416b1740025c14410368b67414979692.png