原始 MediaWiki 页面

我知道编辑这个网站吗?
the Fiji distribution of ImageJ本页介绍与 the Fiji distribution of ImageJ 相关的内容。点击徽标查看详情。

反扭曲J

自迁移出 MediaWiki 以来,本页内容尚未经过审查。如果您愿意帮忙,请查看帮助指南

scheme

bUnwarpJ scheme: bidirectional Unwarping in Java.

ImageJ/Fiji 插件基于由 B 样条表示的弹性变形**执行二维图像配准。变形的逆性是通过一致性限制来强制执行的。

为了快速开始,您可以查看video tutorial(在第二届ImageJ用户和开发者大会上颁发)。

一般说明

bUnwarpJ 是一种为 ImageJ 插件开发的弹性且一致的图像配准算法。它同时注册两个图像 A 和 B。图像 A 发生弹性变形,以便外观与图像 B 相似,同时,还计算“逆”变换(从 B 到 A),以便保证最终变形的阿尔可逆性。结果给出两个图像 A 和 B 图像的变形版本。

技术说明

该图像配准算法基于能量函数的最小化,其中源图像和目标图像在两个方向上的方差\(E_{img}\)、任选的地标约束\(E_{\mu}\)、正则化项\((E_{div} + E_{rot})\)以及能量项\(E_{cons}\)(说明两个方向上弹性变形之间的几何一致性)。即,由下式给出的能量函数

\[E = w_iE_{img} + w_{\mu}E_{\mu} + (w_dE_{div} + w_rE_{rot}) + w_cE_{cons}\]

每个术语的权重用户由在插件的主窗口中设置。过程是通过目标函数的优化Hessian估计增强的Broyden–Fletcher–Goldfarb–Shanno algorithm最小化,而图像和变形都由Levenberg–Marquardt algorithm表示。

用户手册

###一般性

该插件可以从 ImageJ/Fiji 主菜单的 RegistrationbUnwarpJ 下调用。需要打开两个图像(8、16、32 位灰度或 RGB 颜色)才能使用该插件。如果是这样,插件的主对话框窗口将打开。

main-dialog

bUnwarpJ main dialog

选定的图像将作为源图像和目标图像,它们的标签只是为了澄清起见。注册模式可以是“准确”、“快速”和“单一”。注册模式“Mono”(从2.5版本开始包含)使程序仅执行单向注册,即从源到目标。 “准确”和“快速”两种注册模式涉及执行第三方注册并影响程序内部使用的停止标准。更多内部选项可以在“高级选项”面板中修改。通过此面板,您可以访问修改的大部分内部参数。“初始”和“最终”变形列表允许您选择样条变形场的最粗和最细比例。“非常粗糙”对应于4一个样条线(图像的每个角都有一个)。随着变形程度的增加,样条线的数量在每个方向(水平和垂直)上都会加倍。

bUnwarpJ 2.5 起,主窗口上有一个新的参数,允许对输入图像进行二次采样。然后,将使用的图像二次采样版本来计算配准,但结果将返回原始图像。图像二次采样参数可以在 0 和 7 之间选择,即图像尺寸可以减少 20 = 1 到27 = 128倍。这在配准大图像时非常有用。

目标函数的不同权重控制每一项的相对权重。这些权重不限于0到1之间,而且它们可以取任何值,只要是非负的即可。您可以在第二届ImageJ用户和开发者大会(2008)上给出的演示文稿“bUnwarpJ: Consistent and Elastic Registration in ImageJ. Methods and Applications.”中不同函数权重的描述,或者查看常见问题解答部分。

当托盘相对变化不大于该阈值时,算法使用停止阈值来每个停止多分辨率级别的优化过程。

RGB 彩色图像将在注册过程中转换为灰度,但生成的转换将评估原始彩色图像。

如果您想退出插件,请按“取消”。当您希望插件执行注册时,请按“确定”。运行插件后(在“准确”或“快速”模式下),结果是两个堆栈,其中包含以下三个图像:

  1. 注册一个图像(变形图像)适合另一个图像(固定图像); 2、固定图像; 3.与变形图像具有相同变形的变形蒙版。

最终值显示在单独的(“结果”)窗口中。

下图显示了将源(移动)桥图像注册到相同图像的目标(固定)扭曲版本的结果堆栈之一:

From left to right, consecutive slices of the resulting stack: elastic-transformed image, original moving image and warped moving mask. From left to right, consecutive slices of the resulting stack: elastic-transformed image, original moving image and warped moving mask.

详细模式产生更多信息:

1.作为向量场的弹性变形。固定图像中的每个点都必须根据该场变形以适应变形图像; 2、将固定图像用上述向量场变形后得到的网格; 3.单独(“结果”)窗口中的优化过程的步长值。

From left to right: the last consecutive slices of the resulting stack in verbose mode (deformation field and deformation grid) and the Log window with the optimization steps, final optimal values and execution time. From left to right: the last consecutive slices of the resulting stack in verbose mode (deformation field and deformation grid) and the Log window with the optimization steps, final optimal values and execution time.

由于源图像和目标图像都作为移动图像和固定图像工作,因此有结果(堆栈):从源到目标和从目标到源。

“简单”模式只是产生从源图像到目标图像的结果。

在配准过程中,显示当前的偏差图像以及从固定图像到移动图像的网格映射:

bUnwarpJ toolbar when the registration process has started. bUnwarpJ toolbar when the registration process has started.

在注册过程中,工具栏将更改为 {::nomarkdown}

Example of bUnwarpJ output during the registration process: difference image and grid on top of moving image. Example of bUnwarpJ output during the registration process: difference image and grid on top of moving image.

{:/} 单击停止按钮停止该过程。当前优化状态的输出将以正常方式返回。

地标

调用插件时,在主窗口中按“确定”之前,工具栏会更改其外观,并且可以手动向选定的图像添加地标:

bUnwarpJ toolbar with bUnwarpJ toolbar with "Move crosses" button selected.

按下的按钮表示您现在可以添加地标。地标被添加到任一图像中。地标将自动放置在两个图像上的相同位置。新的地标成为“当前地标”(当前图像中用较粗的[+]符号表示,另一图像中用[×]符号表示,其余的都用[+]符号表示)。要移动任何地标,请按“移动十字”按钮: {::nomarkdown}

bUnwarpJ toolbar before starting registration. bUnwarpJ toolbar before starting registration.

{:/} 单击并拖动任何地标,使其对应于两个图像中的相同位置。这是带有相应地标的两个桥梁图像的示例: {::nomarkdown}

{:/} 可以通过“删除十字”按钮删除地标: {::nomarkdown}

Example of landmarks on moving and fixed images. Example of landmarks on moving and fixed images.

{:/} 这是在注册过程中手动添加地标的方法。但是,自 bUnwarpJ v2.0 起,还可以选择使用自动地标,如 SIFT 和 MOPS 支持部分中所述,或在调用插件之前在两个图像中手动添加点选择。如果两幅图像中的点选择数量相同,它们将被转换为地标。 退出bUnwarpJ时,所有图像都恢复到之前的状态,即恢复原始感兴趣的区域并点选择。

面具

该程序允许以两种互斥的方式使用掩码。在第一种方式中,模拟器与输入图像一起引入。在这种模式下,输入图像必须是图像堆栈(第一个切片:图像本身,第二个切片:蒙版)。这样,网关可以具有任何形状。第一个方式,输入图像不能是这样的,可以使用简单的化妆蒙版。这些蒙版是使用两个按钮(“内部蒙版”和“外部蒙版”)定义的,如下所示:

bUnwarpJ toolbar with bUnwarpJ toolbar with "Draw an outer mask" button selected.

bUnwarpJ toolbar with bUnwarpJ toolbar with "Draw an inner mask" button selected.

内掩模将信息保留在多边形内部,而外掩模将信息保留在多边形外部。丢弃的信息呈灰色。这是一个内部掩码的示例: {::nomarkdown}

{:/} 遮罩可用于其中一张图像、全部图像或不使用。您可以在其中一个图像中放置蒙版,而不在另一张图像中放置蒙版,您可以在两个图像中都放置蒙版(具有不同的形状),或者您可能根本不使用蒙版。调用插件后,蒙版将被擦除并恢复初始图像。

输入/输出选项

当使用工具栏上的“输入/输出菜单”时,我们有可能处理影响注册的不同输入和输出文件。

bUnwarpJ example of inner mask on bridge image. bUnwarpJ example of inner mask on bridge image.

bUnwarpJ Input/Output menu. bUnwarpJ Input/Output menu.

在上一个版本中,该插件提供了以下输入/输出选项:

  • 加载地标:它允许加载地标文件。
  • 将地标另存为:它允许将图像地标保存到文件中。
  • 显示地标:它强制地标在单独的表中。
  • 加载弹性转换:它从文件加载弹性转换将其应用到所谓的源图像。转换文件必须采用插件 B 样条转换的格式,即与使用“保存转换”创建的文件格式选项相同。
  • 加载原始转换:它从文件加载原始转换中获取其调用的源图像。转换文件必须为“原始”格式,即与使用“将转换转换为原始”选项的文件格式相同。有关格式说明,请参见 raw transformation example
  • 比较相反的弹性变形:它计算两个弹性变形的扭曲指数,即应用两个变形(直接和反向)后每个像素与版本之间的几何距离的指令。该值作为结果给出。变形文件必须采用插件 B 样条变形的格式(与使用“保存变形”选项创建的文件格式相同)。
  • 比较弹性/原始转换:它计算弹性和原始转换(方向相同)的翘曲指数。第二个转换文件必须为“原始”格式,即与使用“将转换转换为原始”选项创建的文件格式相同。
  • 比较原始转换:它计算两个原始转换相同(方向必须)的扭曲指数。转换文件为“原始”格式,即与使用“将转换转换为原始”选项的文件格式相同。
  • 将转换转换为原始:将B样条转换文件转换为原始转换文件。
  • 将转换转换为弹性:将原始转换文件转换为B样条转换文件(近似值)。
  • 组合弹性转换:将两个弹性转换组合成一个原始转换。输入文件必须采用 B 样条转换格式,输出文件将为“原始”格式。
  • 组合原始转换:将一个原始转换组合成另一个原始转换。输入和输出文件都将为“原始”格式。
  • 组合原始变换和弹性变换:将一个原始和一个弹性变换组合成一个原始变换。
  • 逆原始变换:它近似于原始变换的逆。
  • 评估图像相似度:它计算源图像和目标图像之间的当前相似度。结果显示在“结果”窗口中。
  • 适应系数:它根据真实的图像因子来变换特定的弹性变换的系数。例如当我们有非常大的图像时非常有用。我们可以注册图像的子采样版本(比方说小4倍),调整结果转换(图像因子=然后4),以便可以将它们应用到高分辨率图像。
  • 加载源蒙版:它从源图像中的文件(二进制图像)加载蒙版。
  • 加载源最初仿射矩阵:它从文本文件加载仿射矩阵源-目标转换的起点。文本文件的格式如下:cos(angle) -sin(angle) sin(angle) cos(angle) Translation_X Translation_Y

这些新选项(自版本 1.1 起)允许用户将我们的程序的结果与任何其他注册方法进行比较。

您还可以使用 Spline Deformation Generator 测试 bUnwarpJ,这是一个 ImageJ 插件,允许用户生成五种不同的图像变形:弹性、鱼眼、透视、桶形/枕形和微笑效果。 Spline Deformation Generator 使用与 bUnwarpJ 相同的原始转换文件格式,因此它们完全兼容。

宏呼吁

bUnwarpJImageJ macro language完全兼容。如有疑问,请使用Macro Recorder来确定需要使用哪些命令。

主对话框

用户可以通过设置插件主对话框的所有参数来自宏启动插件,例如: run( “bUnwarpJ”, “source_image=A target_image=B registration=Accurate image_subsample_factor=0 initial_deformation=[Very Coarse] final_deformation=Fine divergence_weight=0 curl_weight=0 landmark_weight=0 image_weight=1 consistency_weight=10 stop_threshold=0.01 save_transformations save_direct_transformation=/my-path/A_direct_transf.txt save_inverse_transformation=/my-path/B_inverse_transf.txt”); 请注意,只有当使用“save_transformations”选项时才需要转换文件的路径。

输入/输出方法

要使用宏的主输入/输出选项,主类 (bUnwarpJ_) 中定义了相应的静态方法。同样,Macro Recorder将为每个命令提供正确的宏命令。例如:

  • 加载弹性转换为源图像:

    call(“bunwarpj.bUnwarpJ_.loadElasticTransform”, “/my-path-to-transf/source_elastic_transf.txt”, “target-image.png”, “source-image.png”);

  • 将原始转换加载到源图像:

    call(“bunwarpj.bUnwarpJ_.loadRawTransform”, “/my-path-to-transf/source_raw_transf.txt”, “target-image.png”, “source-image.png”);

  • 比较简单的弹性变形:

    call(“bunwarpj.bUnwarpJ_.compareOppositeElasticTransforms”, “/my-path-to-transf/inverse_transf.txt”, “/my-path-to-transf/direct_transf.txt”, “target-image.png”, “source-image.png”);

  • 比较弹性变换和原始变换(方向相同):

    call(“bunwarpj.bUnwarpJ_.compareElasticRawTransforms”, “/my-path/source_direct_transf.txt”, “/my-path/source_direct_transf_RAW.txt”, “target-image.png”, “source-image.png”);

  • …等等。

#####旧方法

在 bUnwarpJ v2.6.7 之前,这些调用是使用适用于图像文件的方法完成的(不在 ImageJ 中打开)。出于不兼容的原因,这些方法仍然可用: elasticTransformImageMacro、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#rawTransformImageMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String) rawTransformImageMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#composeRawElasticTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String) composeRawElasticTransformationsMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#composeRawTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String) composeRawTransformationsMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#composeElasticTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String) composeElasticTransformationsMacro]、 [http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#compareElasticRawTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)compareElasticRawTransformationsMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#compareElasticTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)compareElasticTransformationsMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#compareRawTransformationsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)compareRawTransformationsMacro]、[http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#convertToRawTransformationMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)convertToRawTransformationMacro]、[<http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#adaptCoefficientsMacro(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String)adaptCoefficientsMacro]。

请注意,输入和输出文件名必须包含路径,因为它们不是从图像列表中获取的。例如,我们如果将存储在文件 A_direct_transf.txt 中的弹性变形应用到源图像 A.jpg 和目标图像 B.jpg 把结果保存在 output.tif 中,我们可以调用: call( “bunwarpj.bUnwarpJ_.elasticTransformImageMacro”, “My_path/A.jpg”, “My_path/B.jpg”, “My_path/A_direct_transf.txt”, “My_path/output.tif” );

命令行调用

bUnwarpJ 可以像 ImageJ 命令一样从命令行调用。在命令行中,该程序提供以下选项:

  • -help:显示程序的语法
  • -align:启动两个输入图像的注册
  • -elastic_transform:使用给定的弹性变形(先前计算)变换源图像
  • -raw_transform:使用给定的原始变形(先前计算)来变换源图像
  • -compare_elastic:通过翘曲指数比较两个先前计算的相反弹性变形
  • -compare_elastic_raw:通过翘曲指数将弹性变形与原始变形(均为直接变换)进行比较
  • -compare_raw:通过翘曲指数比较两个先前计算的直接原始变形
  • -convert_to_raw:将弹性变换转换为原始格式
  • -compose_elastic:组成两个弹性变形,结果将是原始格式
  • -compose_raw:组成两个原始变形,结果也将是原始格式
  • -compose_raw_elastic:组成原始变形和弹性变形。原始格式的结果
  • -adapt_transform:在给定分辨率图像因子的情况下适应特定的弹性变换

例如,要查看程序帮助,我们可以在 Linux 中从命令行调用该程序(其中 $IJDIR 是 ImageJ 的安装目录),如下所示:

java -Xmx512m -cp $IJDIR/ij.jar:$IJDIR/plugins/bUnwarpJ_.jar bunwarpj.bUnwarpJ_ -help

对于其余选项,请按照帮助说明进行操作。

一致性权重

创建bUnwarpJ的主要原因是通过一致性权重强制变形的一致性。这个数字迫使算法转向确保所产生的变形的可逆性的解决方案。因此,该数字越高,一种变形与另一种变形的逆关系越严格。由于单位不同,参数的选择没有一定的规则,需要通过实验来找到。

bUnwarpJ相对于前一种方法的一个重要优点在于,许多配准问题可以在不使用能量函数的界标和正则化项(即将其相应参数设置为0.0)的情况下得到解决。因此,不需要用户交互,降低了算法的计算复杂度。

SIFT 和 MOPS 插件支持

bUnwarpJ: example of SIFT correspondences converted to registration landmarks. bUnwarpJ: example of SIFT correspondences converted to registration landmarks.

The last release of bUnwarpJ has compatibility with Stephan Saalfeld’s plugin for automatic feature extraction (implementations of SIFT and MOPS algorithms).

参数的解释是 here。该插件也集成在斐济。

应用 SIFT 或 MOPS 方法后,您将在两张图像中获得两组对应点。如果您调用 bUnwarpJ,相应的点将显示为源地标和目标地标。

下载

bUnwarpJ 的最新稳定发行版始终可以在斐济找到,并且**最新发布的 JAR 可在 ** GitHub repository 中找到。如果您发现任何错误,请随时联系维护人员。任何反馈将不胜感激。

API 文档

API 文档可以访问online

### 安装

在斐济,默认安装 bUnwarpJ。在ImageJ中,您只需将最新的bUnwarpJ_.jar下载到ImageJ的Plugins文件夹中,重新启动ImageJ,Plugins菜单中就会出现一个新的PluginsRegistrationbUnwarpJ命令。

要将 bUnwarpJ 作为宏或从命令行执行,请参阅用户手册中的说明。

常见问题

如何选择权重?每个权重的真正含义是什么?

权重需要通过实验来选择,测试和误差是了解配准图像的最佳权重的唯一方法,但让我们详细讨论一下:

散度和旋度权重

发散权重和旋度权重通过惩罚变形矢量场的B-splineDivergence来规范变形。换句话说,我们用许多点来惩罚向量场,如下所示:

Divergence curl 2d examples

这些是使变形过于粗糙的吸引点。其中一个不是问题(可能只是轮换),但很多都是问题。因此控制它们我们可以使变形平滑。如果您发现您的转换变得过于粗糙,那么使用它们是个好主意。如果没有关于变形形状的先验知识,0.1 和 0.1 通常是不错的值

地标重量

它强制变形以适应两个图像上的标志点。将其设置为 1.0 除非您不使用地标。

图像权重

这是控制像素值差异的权重。将其保留为1.0,除非您想要进行例如仅地标注册。

稠度权重

它迫使产生的变形(源到目标)尽可能接近另一种变形(目标到源)的倒数。 10.0 到 30.0 之间的值通常可以正常工作。仅在注册模式“快速”或“准确”时才考虑它。

如何选择初始和最终变形?它们是什么意思?

这些值决定初始和最终变形的详细程度。在bUnwarpJ中,这是由我们用来表示变形的 B 样条数定义的:

变形 间隔数(在 B 样条网格中)  
非常粗糙 1x1 1x1
2x2 2x2
很好 4x4 4x4
非常好 8x8  
超细 16x16 16x16

初始变形和最终变形如​​何选择?这取决于您的图像的错位程度。如果它们一开始就偏离正确的对齐方式,那么从“非常粗”到“非常细”通常是一个好主意。如果它们开始时接近正确对齐,则使用非常粗略的初始变形可能会导致算法失败。因此,在这种情况下,将初始变形设置为“精细”并将最终变形设置为“非常精细”就足够了。仅当您需要非常高的精度时才使用“超精细”,因为根据图像尺寸,它会使算法变得相当慢。

bUnwarpJ 可以注册 3D 图像吗?

不幸的是,没有。如果您使用两个堆栈作为输入图像来调用 bUnwarpJ,它将使用每个堆栈的第二个切片作为第一个切片的相应掩码。如果您正在寻找 3D 图像配准软件,您可能需要看看 Elastix,这是一个优秀的开源工具包,用于执行用 ITK 编写的图像配准。

如何引用 bUnwarpJ?

相应的论文引用位于References上。

我可以在没有图形界面的情况下运行 bUnwarpJ 吗?

是的,你可以。你有不同的可能性:

  • 您可以按照第 user manual 中的说明从命令行调用该程序,
  • 或者您可以在批处理模式下制作macro call
  • 或者您也可以创建一个脚本并使用任何名为 [http://javadoc.imagej.net/Fiji/bunwarpj/bUnwarpJ_.html#alignImagesBatch(ij.ImagePlus,%20ij.ImagePlus,%20ij.process.ImageProcessor,%20ij.process.ImageProcessor,%20int,%20int,%20int,%20int,%20double,%20double,%20double,%20double,%20double,%20double) bUnwarpJ_.alignImagesBatch] 的方法。

我的结果图像是 32 位,尽管我的输入图像是 8 位,这是一个错误吗?

不,这不是一个错误。为了计算弹性变换图像bUnwarpJ需要对像素值进行插值,因此该过程的第一步是将 8 位(字节)图像转换为 32 位(浮点)图像。您可能需要在注册后将它们转换回 8 位 ProcessEnhance Contrast 并调整对比度 ImageType8-bit

如何将 SIFT/MOPS 结果集成到 bUnwarpJ 中?

如果您使用的是 ImageJ 图形界面,请等到 SIFT/MOPS 插件显示结果,然后立即调用 bUnwarpJ。 SIFT 或 MOPS 算法后找到的对应关系会自动转换为 bUnwarpJ 地标。请注意,如果您在调用 bUnwarpJ 之前触摸任何输入图像,您可能会丢失该图像的点选择(SIFT/MOPS 对应关系),然后不会显示任何地标。

如果您执行宏调用或使用方法 bUnwarpJ_.alignImagesBatch,也将从输入图像的点选择中读取地标。

如果您从命令行调用bUnwarpJ,则必须将 SIFT/MOPS 点选择保存在文件中,并在命令行调用中使用该文件名。

###“源和目标”是什么意思?哪个图像正在被变换?

“源”图像是正在变换的图像,即移动图像,而“目标”图像是固定图像。在“准确”和“快速”模式下,两个图像都用作源图像和目标图像。

原始转换文件的格式是什么?

原始转换文件应该是具有以下结构的文本文件: Width=[TARGET IMAGE WITH] Height=[TARGET IMAGE HEIGHT]

X Trans -----------------------------------
   [(Height * Width) coordinates representing the X transformation for every pixel on the target image]
   
Y Trans -----------------------------------
   [(Height * Width) coordinates representing the Y transformation for every pixel on the target image] ## 参考文献(引用)

bUnwarpJ 上实现的算法及其技术在书籍中有详细介绍。如果您成功将其用于您的研究,请引用我们的工作:

前期工作(UnwarpJ)的相关论文是:

  • C.O.桑切斯·索尔扎诺、P.特维纳兹、M. Unser,“使用向量样条正则化对生物图像进行弹性配准”,IEEE生物医学工程汇刊,卷。52,没有。4,第652-663页,2005年4月。

许可证

该程序是免费软件;您可以根据自由软件基金会 (http://www.gnu.org/licenses/gpl.txt) 发布的 GNU 通用公共许可证 的条款重新分发和/或修改它。

分发此程序的目的是希望它有用,但不提供任何保证;甚至没有适用性或特定用途适用性的默许保证。有关更多详细信息,请参阅 GNU 通用公共许可证。

##致谢

bUnwarpJ已经发展了好几年了,许多人需要承认:

它是Carlos O. S. SorzanoUnwarpJ最初的延伸,感谢他和布拉格Center for Machine PerceptionJan KybicbUnwarpJ于2005年夏季诞生,并于2006年在线出版。

如果没有Janelia Research Campus(弗吉尼亚州,2008年夏季)和Institute of Neuroinformatics(苏黎世,2008年冬季)进行的hackathons,许多插件的更新和改进将永远不可能实现。

Albert Cardona 组织了黑客马拉松并负责代码化和 JavaScript 支持。

Stephan Saalfeld使SIFT/MOPS支持成为可能。

Marta Rivera-Alba帮助宏支持和代码调试。

Johannes Schindelin负责斐济集成,只要出现Java问题,他就在那里!