【问题标题】:Calling ImageJ from Mathematica从 Mathematica 调用 ImageJ
【发布时间】:2012-02-24 20:17:22
【问题描述】:

在 Mathematica 中,我希望将图像传递给 ImageJ 插件,并将结果从 ImageJ 发送到 Mathematica。

JLink 是有用的工具,但我既不熟悉它也不熟悉 ImageJ(因此很难利用现有的 SO 相关问题)。你知道怎么做吗?

(我已经在我的 Mac 上安装了 ImageJ。)

【问题讨论】:

  • 大概您必须阅读 ImageJ API 以供初学者使用。您能否举一个需要使用 ImageJ 解决的问题的示例?这里有几位 Mathematica 参与者,他们是图像处理方面的专家,他们可能会建议本地 Mathematica 方法。您可能还想考虑在这里发帖:mathematica.stackexchange.com/questions
  • 您能否给出一些(简单!)示例 Java 代码来演示如何使用 ImageJ?这是第一步。然后我们可以将该代码翻译成 JLink。
  • @MikeHoneychurch 好主意,如果这里没有任何内容,我将交叉发布。我对 Mathematica 中没有的 ImageJ 插件感兴趣。
  • @Szabolcs 这是问题的一部分......似乎可以有不同类型的 ImageJ 插件。我仍然需要弄清楚如何以编程方式调用它们。
  • 如果您从事此工作,也许您可​​以在这里提供答案:mathematica.stackexchange.com/q/180513/12

标签: java image-processing wolfram-mathematica imagej jlink


【解决方案1】:

这应该只是作为向您展示的预告片,这并不像看起来那么难。没有办法,您必须熟悉 Java、ImageJ-API,当然还有 JLink。

您可以从这里开始:您需要 ImageJ java 存档ij.jar,您可以从the ImageJ Website 下载它。这个 jar 包含 ImageJ 自己使用的所有类和函数。

您要做的是创建一个图像,而不是通过 ImageJ-GUI 打开它,而是使用 Java 方法。为此,您必须熟悉 ImageJ-API 以了解如何从例如创建图像。一个数字数组,因为这就是我们想要将 Mathematica 图像传输到 Java 的方式。 浏览此文档将我带到ImageProcessor classes。如您所见,它们提供了两种方法:setPixelsgetPixels,它们都接受简单的数组。让我们使用它并编写一个非常基本的过滤器:

import ij.process.FloatProcessor;

public class SimpleTest {

    public static float[] func(float []bm, int nx, int ny) {
        FloatProcessor p = new FloatProcessor(nx,ny);
        p.setPixels(bm);
        float[] kernel = new float[{0.111f,0.111f,0.111f,0.111f,
                                    0.111f,0.111f,0.111f,0.111f,0.111f};
        p.convolve(kernel, 3, 3);
        return (float[]) p.getPixels();
    }
}

此函数获取图像数据和图像尺寸,进行卷积并返回过滤后的图像数据。要编译它,请记住 ij.process.FloatProcessorij.jar 内。您必须将此存档包含在您的类路径中。稍后,您必须确保 JLink 找到ij.jar 和您的SimpleTest.class。我通常也把我的课程装在一个罐子里。为此我称之为simple.jar

虽然 java 端现在已经准备就绪,但我们需要几行代码来从 Mathematica 图像中提取图像数据和尺寸

img = ColorConvert[ExampleData[{"TestImage", "Lena"}], "Grayscale"];
{nx, ny} = ImageDimensions[img];
data = ImageData[img] // Flatten;

我们现在要做的是将平面整数数组data 发送到我们的Java 函数,获取结果并构建输出图像。要让 Mathematica 找到您的 jar-archives,一种方法是调用 AppendToClassPath:

Needs["JLink`"]
AddToClassPath["/pathTo/ij.jar","pathTo/simple.jar"];

simpleTest = LoadJavaClass["SimpleTest", StaticsVisible -> True];
output = SimpleTest`func[data, nx, ny];
Image[Partition[output, nx]]

通过最后一步,我们完成了循环并获得最终结果。

最后说明:

  • 您或许应该(这意味着“做”)使用 JLink 用于编译代码的相同 java 版本。
  • ij.jar 中已有插件。这将不包括所有可用的东西。但请记住:ImageJ-GUI 只是调用来自 ij.jar 的方法来使用辅助插件,因此您可以对您的代码执行相同的操作。
  • 某些插件使用本机 (JNI) 代码,当您在 Mathematica 中使用它时,可能会导致意外错误

【讨论】:

  • 感谢概念证明。事实上,我需要坐下来阅读更多文档,然后可能会提出更具体的问题。
  • 我也从未对 ImageJ 做过任何事情,而查找这些东西只需要几分钟。因此,您的学习曲线很可能会非常陡峭。拿一个好的Java-IDE!这已经成功了一半。您当然可以改用 C++ 并使用 ITK。然后你可以问你的同事如何快速设置;-)
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多