自迁移出 MediaWiki 以来,本页内容尚未经过审查。如果您愿意帮忙,请查看帮助指南!
ImageJ Ops 是可重用图像处理操作的框架。 Ops 将 Java 的“一次编写,随处运行”的口号扩展到图像处理算法。
中心目标是使程序员能够在 Ops 框架中编写图像处理算法,然后可以在任何 SciJava 兼容的软件项目中按原样使用,例如ImageJ2、CellProfiler、KNIME、OMERO 和 Alida。
设计目标
Ops 具有三个主要设计目标:
- 易于使用和扩展。 必须有大量易于使用的图像处理操作(“ops”),以及用于在新方向上扩展这些操作的简单框架。
- 功能强大且通用。 操作应该能够包含任意数量的类型化输入和输出参数,对任意数据结构进行操作,包括以多种不同方式存储的 N 维图像:作为磁盘上的文件、在内存中以编程方式生成或在远程数据库中。使用强大的 ImgLib2 库可以实现这一雄心勃勃的目标。
- 非常快。 尽管 ImgLib2 比 ImageJ 的数据模型通用得多,但这种通用性不应以牺牲性能为代价。否则,用户必须支付时间税才能执行他们在 ImageJ 中已经可以执行的操作。 ImageJ Ops 框架需要提供一种方法,用更快但更具体的替代方案来覆盖任何通用但缓慢的操作,并且对用户完全透明。
## 入门
首先阅读这些 Jupyter 笔记本:
- Using ImageJ Ops - 从脚本中调用操作。
- Extending ImageJ: Ops - 编写你自己的操作。
Ops 是一种特殊类型的 ImageJ 插件,因此强烈建议对 SciJava plugin framework 有基本的了解。
除了克隆 imagej-ops 本身之外,以下组件还有有用的操作示例:
- ImageJ-tutorials - 使用 Ops 的 ImageJ 插件示例
- ImageJ-scripting - 规定templates in the Script Editor
教程和研讨会
- Step-by-step guide: Adding new ops
- ImageJ Tutorial: Introduction to ImageJ Ops
- Extending ImageJ: Ops
- “ImageJ 中的脚本 - ImageJ Ops 简介”(2017 年 2 月 NEUBIAS2020) – slides
- “ImageJ2 脚本:参数 + ImageJ Ops”(ImageJ 会议 2015) – slides、video 1、video 2
- “ImageJ Ops 框架:图像处理变得简单”(2015 年 1 月)– slides
- “ImageJ Ops 简介 - 使用和开发”(2015 年 11 月)– slides
## 常问问题
为什么不将算法实现为“普通的旧 Java”方法?
Ops 匹配框架提供了可扩展性。 Ops 是插件,因此任何开发人员都可以根据需要覆盖特定操作的行为,例如,为了提高特殊情况的性能。请参阅上面的“设计目标”。
C/C++ 或 MATLAB 函数可以转换为操作吗?
是的,但是 Ops 中没有对本机/外部功能的自动包装。 ops-experiments 项目是一项持续的努力,旨在为使用本机代码的操作制定基于 Maven 的构建系统。到目前为止,工作重点是使用 javacpp 的反卷积算法的包装、cuda、mkl 和张量流实现。
是否有 Ops 列表及其功能的简要描述?
有关查看所有可用操作的交互式工具,请参阅Op Finder文档。
对于可用的核心操作,您可以访问 ImageJ Ops javadocs。 net.imagej.ops包下的任何类都与Ops相关。
您还可以使用 ImageJ 中的 Script Editor 并使用 Ops 本身主动搜索。以 groovy 语言为例:
// @OpService 操作
打印 ops.help()in groovy 会给出每个 Op 签名的列表。 help op 还可以提供有关 ops 或名称空间的信息;例如,ops.help("add")将返回有关可用add操作的信息。
有图像处理的 Ops 吗?
是的,有。查看使用 Ops Browser 或 ImageJ javadocs 中的 net.imagej.ops.* 包的现有操作。
未来需要开发哪些Ops?
Ops 目前正在开发中,如 0.x.x 版本号所示。有关未来发展的想法和讨论,请访问 ImageJ Ops GitHub page 并查看问题和拉取请求。
为什么匹配很重要?
这是任何基于插件的基础设施的必要部分(参见Inversion of control)。核心库(ImageJ Ops)有许多内置操作,但是:
- 不可能涵盖所有可能的实现方式
- 如果用户必须显式调用其参数的精确签名,那将是不切实际的。
Ops 匹配是一个附加层,允许根据被调用函数的参数定制插件选择。
一个人为的示例:假设 add(array, array) 的默认操作实现迭代数组并组合它们的值。
然后 guava 提出了一种组合数组的方法,速度快了 100 倍;我们不希望基础操作库中存在 guava 依赖项,但我们可以有一个提供 GuavaAddArrayOp 的“imagej-ops-guava”组件。
然后,一位独立开发人员想出了一种新方法来添加数组,速度提高了 50,000 倍。他们将其变成闭源、专有的 Op 并出售。
不管实现的数量如何激增,用户只需编写 ops.math().add(array1, array2) 即可工作。如果他们的类路径上有 guava 实现,速度会更快,如果他们购买专有实现,速度还会更快。但他们的代码不必调整。