与 3D 图像(肾脏组织)交互#

在本教程中,我们以交互方式探索一个具有三个空间维度和三个颜色维度(通道)的生物医学图像。有关 3D 图像处理的概述,请参阅探索 3D 图像(细胞)。我们在此处使用的数据对应于使用共聚焦荧光显微镜成像的肾脏组织(更多详细信息请参见[1],位于kidney-tissue-fluorescence.tif下)。

import matplotlib.pyplot as plt
import numpy as np

import plotly
import plotly.express as px
from skimage import data

加载图像#

此生物医学图像可通过scikit-image的数据注册表获得。

返回的数据集是一个 3D 多通道图像

print(f'number of dimensions: {data.ndim}')
print(f'shape: {data.shape}')
print(f'dtype: {data.dtype}')
number of dimensions: 4
shape: (16, 512, 512, 3)
dtype: uint16

维度按以下顺序提供:(z, y, x, c),即[平面,行,列,通道]

让我们暂时只考虑数据的一个切片(2D 平面)。更具体地说,让我们考虑位于堆栈中间的切片。imshow函数可以显示灰度和 RGB(A) 2D 图像。

plot 3d interaction
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [64..4095].

<matplotlib.image.AxesImage object at 0x7f115e08e840>

根据警告消息,值的范围出乎意料。从颜色上看,图像渲染显然不令人满意。

vmin, vmax = data.min(), data.max()
print(f'range: ({vmin}, {vmax})')
range: (10, 4095)

我们转向 Plotly 的plotly.express.imshow()函数的实现,因为它支持超出(0.0, 1.0)(浮点数)和(0, 255)(整数)的值范围

就是这样,荧光显微镜!

为每个通道规范化范围#

一般来说,我们可能希望在每个通道的基础上规范化值范围。让我们沿通道轴对数据(切片)进行分面。这样,我们得到三个单通道图像,其中每个图像的最大值都被使用

fig = px.imshow(
    data[n_plane // 2], facet_col=2, binary_string=True, labels={'facet_col': 'channel'}
)
plotly.io.show(fig)

每个颜色通道的值范围是多少?我们通过获取所有非通道轴上的最小值和最大值来检查。

vmin_0, vmin_1, vmin_2 = np.min(data, axis=(0, 1, 2))
vmax_0, vmax_1, vmax_2 = np.max(data, axis=(0, 1, 2))
print(f'range for channel 0: ({vmin_0}, {vmax_0})')
print(f'range for channel 1: ({vmin_1}, {vmax_1})')
print(f'range for channel 2: ({vmin_2}, {vmax_2})')
range for channel 0: (10, 4095)
range for channel 1: (68, 4095)
range for channel 2: (35, 4095)

让我们非常具体,并在每个通道的基础上传递值范围

Plotly 允许您通过平移、放大和缩小以及将所需的图形导出为 PNG 格式的静态图像来与此可视化交互。

将切片探索为动画帧#

单击播放按钮以沿z轴移动,穿过所有 16 个切片的堆栈。

fig = px.imshow(
    data,
    zmin=[vmin_0, vmin_1, vmin_2],
    zmax=[vmax_0, vmax_1, vmax_2],
    animation_frame=0,
    binary_string=True,
    labels={'animation_frame': 'plane'},
)
plotly.io.show(fig)

组合通道分面和切片动画#

fig = px.imshow(
    data,
    animation_frame=0,
    facet_col=3,
    binary_string=True,
    labels={'facet_col': 'channel', 'animation_frame': 'plane'},
)
plotly.io.show(fig)

生物学家的眼睛可以发现这两个明亮的斑点(在channel=2中最好看到)是肾小球[2]

脚本的总运行时间:(0 分钟 7.125 秒)

由 Sphinx-Gallery 生成的图库