Transformaciones afines usando cupy#
Aquí aplicamos una transformación afín usando 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)
De manera análoga a las transformaciones en scipy, cupy también utiliza matrices de transformación para describir la transformación.
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],
])
Antes de poder aplicar una operación de cupy a una imagen, necesitamos enviarla a la memoria de la GPU. Recibimos un manejador de una imagen en la GPU que no se puede mostrar usando imshow.
cuda_image = cupy.asarray(image)
cuda_image.shape
(192, 256, 256)
De manera análoga a la transformación afín en scipy, necesitamos crear la imagen de salida con una forma definida, el doble de grande que la imagen original, antes de poder escribir en ella.
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)
Antes de poder ver la imagen resultante, necesitamos transferirla de la memoria de la GPU a la memoria de la CPU
result = cupy.asnumpy(cuda_scaled)
result.shape
(384, 512, 512)
imshow(result[200], cmap="Greys_r", vmin=0)
<matplotlib.image.AxesImage at 0x1d63076bdc0>