在jupyter笔记本中交互式查看图像堆栈
项目描述
stackview 🧊👀
基于 ipycanvas 和 ipywidgets 的 jupyter笔记本中交互式图像堆栈查看。TL;DR
stackview.curtain(image, labels, continuous_update=True)
安装
stackview 可以使用 conda 或 pip 安装。
conda install -c conda-forge stackview
或者
pip install stackview
如果您在笔记本中运行安装,您需要在使用 stackview 之前重新启动 Jupyter(而不仅仅是内核)。
使用
您可以在 jupyter 笔记本中使用 stackview
,如下所示。还可以查看 中的演示。
有关如何使用 stackview 在 Google Colab 中的演示,请参阅 此处。
更多示例笔记本可以在 此文件夹 中找到。
起点是提供的 3D 图像数据集,作为 numpy 数组。
from skimage.io import imread
image = imread('data/Haase_MRT_tfl3d1.tif', plugin='tifffile')
切片视图
然后您可以逐个切片查看它
import stackview
stackview.slice(image, continuous_update=True)
拾取强度
要读取鼠标移动处的像素强度,请使用拾取器。
stackview.picker(image)
显示范围
要调整显示图像时显示的最小和最大强度,请使用 display_range
函数。
stackview.display_range(image)
静态洞察视图
insight
函数将 numpy-array 转换为与 numpy 兼容的数组,该数组在 jupyter 笔记本中具有图像显示。
stackview.insight(image[60])
32 位和 64 位类型整数的图像显示为标签。
blobs = imread('data/blobs.tif')
labels = label(blobs > 120)
stackview.insight(labels)
类似于 matplotlib 的 imshow
为了更灵活地可视化图像,有imshow
,它的工作方式与matplotlib的imshow类似,但增加了更多灵活性,例如在颜色图方面。它支持在microfilm中引入的pure...
颜色图。
stackview.imshow(image, axes=True, colorbar=True, colormap='pure_magenta')
...或者绘制标签图像。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 3, figsize=(15,15))
stackview.imshow(image, plot=axs[0], title='image', axes=True)
stackview.imshow(labels, plot=axs[1], title='labels')
stackview.imshow(image, plot=axs[2], continue_drawing=True)
stackview.imshow(labels, plot=axs[2], alpha=0.4, title='image + labels')
静态动画
可以使用animate
和animate_curtain
函数将图像堆栈/图像混合动画存储为gif到磁盘。
stackview.animate(blobs_images, frame_delay_ms=50)
stackview.animate_curtain(blobs, blobs > 128)
标注区域
要交互式地创建标签图像,例如用于机器学习训练,stackview.annotate
函数提供了基本的标签绘图工具。点击并拖动进行绘制。按住ALT
键进行擦除。标注将绘制到您在绘制之前需要创建的labels
图像中。
import numpy as np
labels = np.zeros(image.shape).astype(np.uint32)
stackview.annotate(image, labels)
注意:如果界面响应慢,请考虑使用较小的图像,例如通过裁剪或重采样。
正交视图
正交视图也是可用的
stackview.orthogonal(image)
幕布
此外,为了同时可视化原始图像和经过处理的版本,幕布视图可能很有用
stackview.curtain(image, modified_image * 65537)
幕布也可以与2D数据一起使用。顺便说一下,为了正确可视化两个图像,您需要自己调整它们的灰度值范围。例如,将二值图像乘以255,以便在8位范围内与原始图像很好地并排显示
binary = (slice_image > threshold_otsu(slice_image)) * 255
stackview.curtain(slice_image, binary)
这同样适用于标签图像
from skimage.measure import label
labels = label(binary)
stackview.curtain(slice_image, labels)
并排视图
还提供了用于共定位可视化的并排视图。如果您处理的是时间推移数据,您还可以使用此视图来可视化时间点之间的差异
stackview.side_by_side(image_stack[1:], image_stack[:-1])
切换
switch
函数允许在图像列表或字典之间切换。
stackview.switch([
slice_image,
binary,
labels
])
切换可切换
您还可以使用switch
的toggleable
参数同时查看多个通道和不同的颜色图。建议还传递一个颜色图列表。颜色图名称可以来自Matplotlib,stackview旨在与microfilm兼容。
hela_cells = imread("data/hela-cells.tif")
stackview.switch(
{"lysosomes": hela_cells[:,:,0],
"mitochondria":hela_cells[:,:,1],
"nuclei": hela_cells[:,:,2]
},
colormap=["pure_magenta", "pure_green", "pure_blue"],
toggleable=True
)
nD-Viewer
您还可以使用上述所有功能与n维数据(自stackview 0.10.0以来)一起使用。您将看到多个滑块来导航空间和时间等维度。如果您处理多个通道,建议使用带有toggleable=True
的stackview.switch()
(更多信息)。
裁剪
您可以交互式地裁剪图像
crop_widget = stackview.crop(image_stack)
crop_widget
...并检索裁剪范围为slice
对象的元组
r = crop_widget.range
r
输出
(slice(0, 40, 1), slice(40, 80, 1), slice(80, 120, 1))
...或者您可以直接裁剪图像
cropped_image = crop_widget.crop()
cropped_image.shape
输出
(40, 40, 40)
散点图和聚类图
使用stackview.scatterplot
,您可以创建用于pandas DataFrames的交互式绘图(完整示例)。
stackview.scatterplot(df, 'area', 'feret_diameter_max', "selection", figsize=(5,4))
如果您想将此类DataFrame与它所属的标签图像的测量值并排显示,则可以使用clusterplot
stackview.clusterplot(image=image,
labels=labeled_image,
df=df,
column_x="area",
column_y="aspect_ratio",
zoom_factor=1.6,
alpha=0.7)
此功能灵感来源于napari-clusters-plotter。
交互
可以使用interact
探索图像处理函数的参数空间。
from skimage.filters.rank import maximum
stackview.interact(maximum, slice_image)
这对于实现图像处理工作流程的自定义函数可能很有用。
from skimage.filters import gaussian, threshold_otsu, sobel
def my_custom_code(image, sigma:float = 1, show_labels: bool = True):
sigma = abs(sigma)
blurred_image = gaussian(image, sigma=sigma)
binary_image = blurred_image > threshold_otsu(blurred_image)
edge_image = sobel(binary_image)
if show_labels:
return label(binary_image)
else:
return edge_image * 255 + image
stackview.interact(my_custom_code, slice_image)
如果您想使用下拉菜单选择输入图像,则需要传递一个(name, image)
对的字典作为context
,例如context=globals()
。
image1 = imread("data/Haase_MRT_tfl3d1.tif")
image2 = image1[:,:,::-1]
stackview.interact(gaussian, context=globals())
要自动将insight
-视图添加到函数的结果中,可以添加此功能。
@jupyter_displayable_output
def my_gaussian(image, sigma):
return gaussian(image, sigma)
my_gaussian(image[60], 2)
哇哦
如果您将stackview与voila结合使用,您可以构建功能强大、交互式、基于浏览器的图像处理应用程序和演示者。只需在Jupyter笔记本中构建图形用户界面,然后使用以下命令启动它
贡献
欢迎贡献、错误报告和进一步开发的想法。
许可
在BSD-3许可证的条款下分发,“stackview”是免费且开源的软件。
问题
如果您遇到任何问题,请在image.sc上创建一个帖子,并附带详细描述和标签@haesleinhuepf。
另请参阅
还有其他库正在做类似的事情
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。