图像配准工具(ImageJ/FIJI Plugin TurboReg/StackReg 的 python 实现)
项目描述
pyStackReg
概括
Philippe Thevenaz/EPFL 编写的 ImageJ 扩展 TurboReg/StackReg 的 Python/C++ 端口。
用于将源图像或堆栈(电影)自动对齐到目标图像/参考帧的 python 扩展。
描述
pyStackReg 用于将一个或多个图像对齐(注册)到一个公共参考图像,这通常在时间分辨荧光或广域显微镜中需要。它直接从 ImageJ 插件 TurboReg 的源代码移植而来,并额外提供了ImageJ 插件StackReg的功能,这两者都是由 Philippe Thevenaz/EPFL 编写的(可在http://bigwww.epfl.ch/thevenaz/turboreg /)。
pyStackReg 提供了以下五种失真:
翻译
刚体(平移+旋转)
缩放旋转(平移+旋转+缩放)
仿射(平移+旋转+缩放+剪切)
双线性(非线性变换;不保留直线)
pyStackReg 支持 StackReg 的全部功能以及一些附加选项,例如,使用不同的参考图像并访问实际的转换矩阵(请参见下面的示例)。请注意,pyStackReg 使用 TurboReg 的高质量(即高精度)模式,该模式使用三次样条插值进行变换。
请注意:双线性变换不能传播,因为双线性变换的组合通常不会导致双线性变换。因此,当使用“前一个”图像作为参考图像时,堆栈注册/变换函数将无法与双线性变换一起使用。您可以使用另一个参考(“第一”或“平均”分别用于第一或平均图像),或者尝试将堆栈的每个图像分别注册/转换为其各自的先前图像(并使用已经转换的先前图像作为参考下一张图片)。
安装
该软件包在 conda forge 和 PyPi 上可用。
使用conda安装
conda install pystackreg -c conda-forge
使用pip安装
pip install pystackreg
文档
该文档可以在 readthedocs 上找到:
教程
教程笔记本可以在示例/笔记本文件夹中找到,也可以在此处静态找到:https ://pystackreg.readthedocs.io/en/latest/tutorial.html
用法
以下示例打开两个不同的文件并使用所有不同的可能转换注册它们
from pystackreg import StackReg
from skimage import io
#load reference and "moved" image
ref = io.imread('some_original_image.tif')
mov = io.imread('some_changed_image.tif')
#Translational transformation
sr = StackReg(StackReg.TRANSLATION)
out_tra = sr.register_transform(ref, mov)
#Rigid Body transformation
sr = StackReg(StackReg.RIGID_BODY)
out_rot = sr.register_transform(ref, mov)
#Scaled Rotation transformation
sr = StackReg(StackReg.SCALED_ROTATION)
out_sca = sr.register_transform(ref, mov)
#Affine transformation
sr = StackReg(StackReg.AFFINE)
out_aff = sr.register_transform(ref, mov)
#Bilinear transformation
sr = StackReg(StackReg.BILINEAR)
out_bil = sr.register_transform(ref, mov)
下一个示例展示了如何将配准与转换分开(例如,在一个颜色通道中配准,然后使用该信息来转换另一个颜色通道):
from pystackreg import StackReg
from skimage import io
img0 = io.imread('some_multiframe_image.tif')
img1 = io.imread('another_multiframe_image.tif')
# img0.shape: frames x width x height (3D)
sr = StackReg(StackReg.RIGID_BODY)
# register 2nd image to 1st
sr.register(img0[0, :, :], img0[1,:,:])
# use the transformation from the above registration to register another frame
out = sr.transform(img1[1,:,:])
下一个示例展示了如何注册和转换整个堆栈:
from pystackreg import StackReg
from skimage import io
img0 = io.imread('some_multiframe_image.tif') # 3 dimensions : frames x width x height
sr = StackReg(StackReg.RIGID_BODY)
# register each frame to the previous (already registered) one
# this is what the original StackReg ImageJ plugin uses
out_previous = sr.register_transform_stack(img0, reference='previous')
# register to first image
out_first = sr.register_transform_stack(img0, reference='first')
# register to mean image
out_mean = sr.register_transform_stack(img0, reference='mean')
# register to mean of first 10 images
out_first10 = sr.register_transform_stack(img0, reference='first', n_frames=10)
# calculate a moving average of 10 images, then register the moving average to the mean of
# the first 10 images and transform the original image (not the moving average)
out_moving10 = sr.register_transform_stack(img0, reference='first', n_frames=10, moving_average = 10)
下一个示例展示了如何将堆栈的注册与转换分开(例如,在一个颜色通道中注册,然后使用该信息来转换另一个颜色通道):
from pystackreg import StackReg
from skimage import io
img0 = io.imread('some_multiframe_image.tif') # 3 dimensions : frames x width x height
img1 = io.imread('another_multiframe_image.tif') # same shape as img0
# both stacks must have the same shape
assert img0.shape == img1.shape
sr = StackReg(StackReg.RIGID_BODY)
# register each frame to the previous (already registered) one
# this is what the original StackReg ImageJ plugin uses
tmats = sr.register_stack(img0, reference='previous')
out = sr.transform_stack(img1)
# tmats contains the transformation matrices -> they can be saved
# and loaded at another time
import numpy as np
np.save('transformation_matrices.npy', tmats)
tmats_loaded = np.load('transformation_matrices.npy')
# make sure you use the correct transformation here!
sr = StackReg(StackReg.RIGID_BODY)
# transform stack using the tmats loaded from file
sr.transform_stack(img1, tmats=tmats_loaded)
# with the transformation matrices at hand you can also
# use the transformation algorithms from other packages:
from skimage import transform as tf
out = np.zeros(img0.shape).astype(np.float)
for i in range(tmats.shape[0]):
out[i, :, :] = tf.warp(img1[i, :, :], tmats[i, :, :], order=3)
执照
You are free to use this software for commercial and non-commercial purposes. However, we expect you to include a citation or acknowledgement whenever you present or publish research results that are based on this software. You are free to modify this software or derive works from it, but you are only allowed to distribute it under the same terms as this license specifies. Additionally, you must include a reference to the research paper above in all software and works derived from this software.
变更日志
0.2.6
添加
在 util 包中公开 simple_slice 和 running_mean 函数
将转换函数添加到任何整数 dtype
0.2.5
固定的
在没有 numpy 的环境中编译
0.2.3
添加
添加了示例数据和教程笔记本
添加了单元测试
附加文件
检测堆栈中的时间序列轴 - 如果堆栈注册中提供的轴与检测到的轴不对应,将发出警告
改变了
progress_callback函数现在使用迭代编号调用,而不是迭代索引(迭代编号 = 迭代索引 + 1)
固定的
修复了使用与 0 不同的轴来注册堆栈时的异常
0.2.2
改变了
许可证更改为允许在 python 包存储库上分发
0.2.1
添加
进度回调函数可以通过 progress_callback 提供给register_stack ()和register_transform_stack()函数,然后在每次迭代后调用(即每次图像注册后)
改变了
默认情况下不显示进度条输出,必须使用register_stack()和register_transform_stack()函数中的verbose=True参数启用
0.2.0
添加
双线性变换