Matlab 到 Java - 如何像在 MATLAB 中那样在 Java 中绘制数据和显示图像?
Matlab to Java - How do I plot data and show images in Java like in MATLAB?
我完全是 Java 的新手。我正在使用 Eclipse。
我在Matlab中写了代码,用'imread'函数导入了.pgm图像,然后算法在上面应用了Brushfire方法。
问题是,对于像我这样的新手来说,编写代码并同时查看结果非常容易,因为 Matlab 有类似 "workspace" 的工具(我可以在其中看到矩阵中的图像形式)或绘图选项,还有命令 window。但是它在 Eclipse 中的表现如何呢?如何编写代码并监控结果?
Eclipse 是否也有类似 "imread" 功能的东西?
MATLAB(在大多数情况下)主要是一个原型制作环境,它允许您轻松导入数据(在您的案例中是图像),具有绘制数据的工具,并且还有一个 Read-Eval-Print-Loop,您可以在其中进行交互式交流使用 MATLAB 并立即查看结果。
在像这样完整的环境中工作时,最大的问题之一是将代码转移到另一个环境……所以在您的情况下,Java。如果您这样做,许多 MATLAB 的功能将超出 window 并且很难复制。您可以做的最好的事情是自己编写功能...这 非常 困难,或者寻找外部库或代码来帮助您做到这一点。
让我们通过绘图解决您的问题。有 许多(我不是在开玩笑)Java 外部库可以帮助您绘制 2D 和 3D 数据。这是我在 Github 中的最爱之一:
https://github.com/yannrichet/jmathplot
它真的只是在一对(或三重)或数组中定义一堆点,并简单地调用几个方法。然后它将以漂亮的 JFrame
为您显示所有这些数据。
至于图像,那就有点困难了。有 built-in Java 个库可以为您读入图像。具体来说,如果您引用 ImageIO
class,Java 可以本地读取 GIF、PNG、JPEG、BMP 和 WBMP,如果您想要 TIF 或 JPEG 2000,则有扩展。请参阅here for more details。但是,没有对 PGM 图像的原生支持。
您有两个选择:
使用 MATLAB 并将 PGM 图像读入 MATLAB,然后将其重新保存为 PNG、JPEG 或 ImageIO
支持的任何数据类型。一旦你这样做了,它只是假设你导入了正确的库:BufferedImage, ImageIO
,等等:
BufferedImage img = null;
try {
img = ImageIO.read(new File("image_to_load.jpg"));
} catch (IOException e) {
}
一旦你这样做了,跳到我谈论在 BufferedImage
中加载并在下面的 JFrame
上显示它的部分。
编写您自己的 PGM 解析器。如果您想这样做,这里有一些 Whosebug 上读取 PGM 图像的代码:
How to read PGM images in Java?
检查实际数据时PGM图像是一堆字符。前 3(或 4)行处理 header 信息本身。从第一行到第四行开始,PGM图像通常由
组成
- 第 1 行 -
P5
- 表示这是一个灰度 PGM 图像
- 第 2 行 - 由
#
符号分隔的注释。在 MATLAB 中,当您保存 PGM 图像时,会有一条注释告诉您它已保存在 MATLAB 中。一些 PGM 文件没有这个。
- 第 3 行 - 分别是宽度和高度的两个整数
- 第 4 行 - 图像中遇到的最大强度
这些行之后是 raster-scan 格式的图像数据本身。 "raster-scan" 格式的意思是图像的行堆叠在一起成为一个巨大的行,并且与图像的总大小(width x height
)一样长。我上面链接的代码为您提供了一个很好的 Java 实现,说明如何将像素读入二维整数数组。
接下来需要做的是转换它,以便获得单个 interleaved 像素阵列,然后从中创建一个 BufferedImage
类型。你可以在这里找到答案:
将其转换为正确的格式后,您现在的目标就是显示图像。只需使用您创建的 BufferedImage
实例并将其显示在 JFrame
中。可以在这里完成:
How can I display a BufferedImage in a JFrame?
您所做的只是创建一个新的 ImageIcon
并将其放入 JLabel
容器中,然后将此容器添加到 JFrame
。这将最终为您提供显示图像的内容。
至于复制 MATLAB 的 REPL,这可能是在有限的时间内无法完成的。一方面,它需要编写您自己的后端 - 文本解析和编写方法来显示内容。 MATLAB 的优点在于,无论何时在工作区中声明变量,您都可以在工作区 window 或使用 who
中立即访问它们。如果您想在 Java 中复制相同的行为,那将更加困难,如果您的目标只是绘制数据或显示图像,我可能不建议您这样做。让 Eclipse 通过使用它们的调试器为您完成一些工作。我会说改用调试器,希望这足以检查在给定时间创建的所有变量和 objects。
希望对您有所帮助!
我完全是 Java 的新手。我正在使用 Eclipse。
我在Matlab中写了代码,用'imread'函数导入了.pgm图像,然后算法在上面应用了Brushfire方法。
问题是,对于像我这样的新手来说,编写代码并同时查看结果非常容易,因为 Matlab 有类似 "workspace" 的工具(我可以在其中看到矩阵中的图像形式)或绘图选项,还有命令 window。但是它在 Eclipse 中的表现如何呢?如何编写代码并监控结果? Eclipse 是否也有类似 "imread" 功能的东西?
MATLAB(在大多数情况下)主要是一个原型制作环境,它允许您轻松导入数据(在您的案例中是图像),具有绘制数据的工具,并且还有一个 Read-Eval-Print-Loop,您可以在其中进行交互式交流使用 MATLAB 并立即查看结果。
在像这样完整的环境中工作时,最大的问题之一是将代码转移到另一个环境……所以在您的情况下,Java。如果您这样做,许多 MATLAB 的功能将超出 window 并且很难复制。您可以做的最好的事情是自己编写功能...这 非常 困难,或者寻找外部库或代码来帮助您做到这一点。
让我们通过绘图解决您的问题。有 许多(我不是在开玩笑)Java 外部库可以帮助您绘制 2D 和 3D 数据。这是我在 Github 中的最爱之一:
https://github.com/yannrichet/jmathplot
它真的只是在一对(或三重)或数组中定义一堆点,并简单地调用几个方法。然后它将以漂亮的 JFrame
为您显示所有这些数据。
至于图像,那就有点困难了。有 built-in Java 个库可以为您读入图像。具体来说,如果您引用 ImageIO
class,Java 可以本地读取 GIF、PNG、JPEG、BMP 和 WBMP,如果您想要 TIF 或 JPEG 2000,则有扩展。请参阅here for more details。但是,没有对 PGM 图像的原生支持。
您有两个选择:
使用 MATLAB 并将 PGM 图像读入 MATLAB,然后将其重新保存为 PNG、JPEG 或
ImageIO
支持的任何数据类型。一旦你这样做了,它只是假设你导入了正确的库:BufferedImage, ImageIO
,等等:BufferedImage img = null; try { img = ImageIO.read(new File("image_to_load.jpg")); } catch (IOException e) { }
一旦你这样做了,跳到我谈论在
BufferedImage
中加载并在下面的JFrame
上显示它的部分。编写您自己的 PGM 解析器。如果您想这样做,这里有一些 Whosebug 上读取 PGM 图像的代码:
How to read PGM images in Java?
检查实际数据时PGM图像是一堆字符。前 3(或 4)行处理 header 信息本身。从第一行到第四行开始,PGM图像通常由
组成- 第 1 行 -
P5
- 表示这是一个灰度 PGM 图像 - 第 2 行 - 由
#
符号分隔的注释。在 MATLAB 中,当您保存 PGM 图像时,会有一条注释告诉您它已保存在 MATLAB 中。一些 PGM 文件没有这个。 - 第 3 行 - 分别是宽度和高度的两个整数
- 第 4 行 - 图像中遇到的最大强度
这些行之后是 raster-scan 格式的图像数据本身。 "raster-scan" 格式的意思是图像的行堆叠在一起成为一个巨大的行,并且与图像的总大小(
width x height
)一样长。我上面链接的代码为您提供了一个很好的 Java 实现,说明如何将像素读入二维整数数组。接下来需要做的是转换它,以便获得单个 interleaved 像素阵列,然后从中创建一个
BufferedImage
类型。你可以在这里找到答案:- 第 1 行 -
将其转换为正确的格式后,您现在的目标就是显示图像。只需使用您创建的 BufferedImage
实例并将其显示在 JFrame
中。可以在这里完成:
How can I display a BufferedImage in a JFrame?
您所做的只是创建一个新的 ImageIcon
并将其放入 JLabel
容器中,然后将此容器添加到 JFrame
。这将最终为您提供显示图像的内容。
至于复制 MATLAB 的 REPL,这可能是在有限的时间内无法完成的。一方面,它需要编写您自己的后端 - 文本解析和编写方法来显示内容。 MATLAB 的优点在于,无论何时在工作区中声明变量,您都可以在工作区 window 或使用 who
中立即访问它们。如果您想在 Java 中复制相同的行为,那将更加困难,如果您的目标只是绘制数据或显示图像,我可能不建议您这样做。让 Eclipse 通过使用它们的调试器为您完成一些工作。我会说改用调试器,希望这足以检查在给定时间创建的所有变量和 objects。
希望对您有所帮助!