Déconvolution de Richardson-Lucy sur des GPUs compatibles OpenCL#
La déconvolution de Richardson-Lucy est un algorithme courant et pourtant basique pour la déconvolution d’images en microscopie. Dans ce notebook, nous utiliserons une version accélérée par GPU qui est implémentée dans le plugin napari RedLionFish. Ainsi, vous pouvez utiliser le même algorithme depuis l’interface utilisateur graphique dans napari.
from skimage.io import imread
from pyclesperanto_prototype import imshow
import RedLionfishDeconv as rl
import matplotlib.pyplot as plt
Nous allons charger une image montrant l’intensité fluorescente le long de lignes. Cette image 3D a été prise avec un microscope confocal.
image = imread('../../data/DeconvolutionSampleVerticalGrid1AU-crop.tif')
image.shape
(21, 150, 150)
imshow(image, colorbar=True)
L’image PSF suivante a été extraite d’images prises avec le même microscope en utilisant la procédure expliquée précédemment.
psf = imread('../../data/psf.tif')
imshow(psf, colorbar=True)
Nous pouvons maintenant déconvoluer l’image en utilisant l’algorithme de déconvolution de Richardson-Lucy de RedLionFish. Nous devons spécifier que l’algorithme doit être exécuté sur le gpu.
iterations = 50
deconvolved = rl.doRLDeconvolutionFromNpArrays(image,
psf,
niter=iterations,
method='gpu',
resAsUint8=False )
imshow(deconvolved)
ERROR:root:Failed to setup Reikna with OpenCL.
ERROR:root:No module named 'reikna'
Pour visualiser plus précisément comment l’image originale et la version déconvoluée diffèrent, nous pouvons tracer l’intensité le long d’une ligne de gauche à droite. Nous récupérons ces nombres à partir d’une projection d’intensité maximale le long de Z.
max_intensity_image = image.max(axis=0)
max_intensity_image.shape
(150, 150)
max_intensity_deconvolved = deconvolved.max(axis=0)
max_intensity_deconvolved.shape
(150, 150)
plt.plot(max_intensity_image[80])
plt.plot(max_intensity_deconvolved[80])
plt.show()
Comme vous pouvez le voir, la plage d’intensité a changé avec la déconvolution. Cela dépend de l’algorithme et de l’implémentation. Lorsque vous appliquez une déconvolution, pensez à vérifier si l’intensité totale dans l’image originale et l’image déconvoluée se situe dans la même plage :
image.min(), image.max()
(1, 8)
deconvolved.min(), deconvolved.max()
(0.0, 28.122286)