OpenCL兼容GPU上的Richardson-Lucy反卷积#

Richardson-Lucy反卷积是显微镜图像反卷积中常见且基本的算法。在本notebook中,我们将使用napari插件RedLionFish中实现的GPU加速版本。因此,您可以在napari的图形用户界面中使用相同的算法。

from skimage.io import imread
from pyclesperanto_prototype import imshow
import RedLionfishDeconv as rl
import matplotlib.pyplot as plt

我们将加载一张显示沿线荧光强度的图像。这个3D图像是用共焦显微镜拍摄的。

image = imread('../../data/DeconvolutionSampleVerticalGrid1AU-crop.tif')
image.shape
(21, 150, 150)
imshow(image, colorbar=True)
../_images/dcb7253afa0708bc1466100c38ca84c604606d441c48a94631fc9f7b7d6212ac.png

以下PSF图像是使用之前解释的程序从同一显微镜拍摄的图像中提取的。

psf = imread('../../data/psf.tif')

imshow(psf, colorbar=True)
../_images/a9ef73e14ebfd8a086446101509d41b76b27e3fc686670b9e4d076e15758902b.png

现在我们可以使用RedLionFish的Richardson-Lucy反卷积算法对图像进行反卷积。我们应该指定算法在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'
../_images/6196b1264f6a72457f0b4c418c842f03d15c187f3d5a0e3b47dcb093596f0c33.png

为了更精确地可视化原始图像和反卷积版本之间的差异,我们可以绘制从左到右的线上的强度。我们从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()
../_images/784be31367ebbb4a870b07ac894f215ce8a9376033cce6227646848b6b76325a.png

如您所见,通过反卷积,强度范围发生了变化。这取决于算法和实现。在应用反卷积时,考虑检查原始图像和反卷积图像中的总强度是否在相同范围内:

image.min(), image.max()
(1, 8)
deconvolved.min(), deconvolved.max()
(0.0, 28.122286)