多维图像堆栈#

多维图像数据可以以类似于多通道图像数据的方式处理。

三维图像堆栈#

还有具有三个空间维度的图像:X、Y和Z。在显微镜和医学成像中可以找到典型的例子。让我们来看一个磁共振成像(MRI)数据集:

from skimage.io import imread
from pyclesperanto_prototype import imshow
image_stack = imread('../../data/Haase_MRT_tfl3d1.tif')
image_stack.shape
(192, 256, 256)

我们看到数据确实有三个维度,在这种情况下是192个Z平面和256个X和Y像素。我们可以使用pyclesperanto的imshow来显示它:

imshow(image_stack)
../_images/b7eb0daa981a0e0e7b9f7a66f6e6518446cadb2d0d0c416a7699b45e9b07611d.png

这个MRI数据集看起来不寻常,因为我们看到的是最大强度投影,这是pyclesperanto默认的三维数据可视化方式。

图像切片#

我们可以通过指定3D numpy数组中的索引来检查单个图像切片,这次我们使用Matplotlib的imshow进行可视化:

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 3, figsize=(15,15))

# show three planar images
axs[0].imshow(image_stack[48], cmap='Greys_r')
axs[1].imshow(image_stack[96], cmap='Greys_r')
axs[2].imshow(image_stack[144], cmap='Greys_r');
../_images/b0cadf82902fe151d22829d91e6e836894316134ac8e73e22cec49bf70d8da9d.png

由于所有三个维度都是空间维度,我们还可以制作垂直于图像平面的切片,对应于解剖平面。为了正确定向图像,我们可以通过在末尾添加.T来转置它们的轴。

saggital = image_stack[:,:,128].T
coronal = image_stack[:,128,:].T
transverse = image_stack[96]

fig, axs = plt.subplots(1, 3, figsize=(15,15))

# show orthogonal planes
axs[0].imshow(saggital, cmap='Greys_r')
axs[0].set_title('矢状面')

axs[1].imshow(coronal, cmap='Greys_r')
axs[1].set_title('冠状面')

axs[2].imshow(transverse, cmap='Greys_r')
axs[2].set_title('横断面');
../_images/fbe6b8c3814bec1fc94a65df4753d35fd7e22da92545ef200c36a893d720e959.png

视频#

如果图像数据集有时间维度,我们称之为视频。处理视频的方式类似于多通道图像和图像堆栈。让我们打开一个显示酵母细胞随时间变圆的显微镜数据集。(图像数据由Anne Esslinger,Alberti实验室,MPI CBG提供)

video = imread('../../data/rounding_assay.tif')

video.shape
(64, 512, 512)
fig, axs = plt.subplots(1, 4, figsize=(15,15))

# show three planar images
axs[0].imshow(video[0], cmap='Greys_r')
axs[1].imshow(video[5], cmap='Greys_r')
axs[2].imshow(video[10], cmap='Greys_r')
axs[3].imshow(video[15], cmap='Greys_r');
../_images/786c44989c9b55b88e72757baf5813c3f0d589980c6d8997029be9c9dbcd0b02.png

n维数据#

高维数据在显微镜领域很常见。为了正确处理它们,必须仔细研究图像数据集具有哪些维度。我们可以使用mitosis数据集探索可能性:

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

mitosis.shape
(51, 5, 2, 196, 171)

提示:在ImageJ/Fiji中打开数据集以了解这些数字代表什么。你可以看到有细胞分裂数据集具有

  • 51帧,

  • 5个Z切片,

  • 2个通道 和

  • 171 x 196像素大小。

我们现在获取第一个时间点(索引0)中心平面(索引2)的通道1和2:

timepoint = 0
plane = 2

channel1 = mitosis[timepoint, plane, 0]
channel2 = mitosis[timepoint, plane, 1]

fig, axs = plt.subplots(1, 2, figsize=(15,15))

axs[0].imshow(channel1, cmap='Greys_r')
axs[1].imshow(channel2, cmap='Greys_r');
../_images/5524b1dc3a127e2e76ef33ff81b8a96cfde59b8e0f07d9d17438848293dcb23d.png

练习#

打开细胞分裂数据集,选择三个时间点并并排显示它们。结果图应该有三列两行。在第一行显示channel1,第二行显示channel2。