如何将Java BufferedImage加载到Matlab中

3
我正在尝试从MATLAB调用一些Java方法,并且已经成功地处理了返回字符串、文件等内容的方法。但现在我有一个返回BufferedImage的方法,虽然MATLAB目前没有问题,但是如何在MATLAB中可视化这个BufferedImage呢?或者至少将其转换为矩阵?
我从MATLAB调用了以下方法(在我的Java类中):
MATLAB代码:
bufferedImage = pictureObject.getBufferedImage 

MATLAB 显示如下...

pictureObject =

BufferedImage@9d7ae3: 类型 = 13 IndexColorModel: #像素位数 = 8 numComponents = 3 颜色空间 = java.awt.color.ICC_ColorSpace@eee0e3 透明度 = 1 transIndex = -1 是否具有 alpha 通道 = false 是否为 alphaPremultiplied = false ByteInterleavedRaster: 宽度 = 640 高度 = 480 #numDataElements 1 dataOff[0] = 0

我试图将上述内容转换成 MATLAB 中可视化的形式。


我的回答是否满足了您的需求? - chappjc
2个回答

3

对于名为 jbi 的 Java BufferedImage,您可以使用 getDatagetPixels 来获取一个 MATLAB 数组。

使用 im2java2d 创建一个测试 BufferedImage(太糟糕了,没有 java2d2im):

>> I = imread('cameraman.tif');
>> jbi = im2java2d(I)
jbi =
BufferedImage@7ed666f9: type = 0 IndexColorModel: #pixelBits = 8 numCompon<snip>

转换回:

nrows = jbi.getHeight; ncols = jbi.getWidth;
matImg = jbi.getData.getPixels(0,0,ncols,nrows,[]);
matImg = uint8(reshape(matImg,nrows,ncols)');

上述内容适用于灰度图像“cameraman.tif”(pixelBits = 8)。

对于颜色为“peppers.png”图像(pixelBits = 24):

data = jbi.getData.getPixels(0,0,ncols,nrows,[]);
matImg = permute(reshape(data,3,ncols,nrows),[3 2 1]);

或者

data = reshape(typecast(jbi.getData.getDataStorage, 'uint8'), [], ncols, nrows);
matImg = permute(data,[3 2 1]);

查看这个MathWorks答案以获取更多技巧。


它给了我一个错误:Java异常发生: java.lang.OutOfMemoryError: Java堆空间在java.awt.image.SampleModel.getPixels(未知来源)处在java.awt.image.Raster.getPixels(未知来源)处 - Rajnikant Sharma

0

BufferedImage不是Matlab能理解的原始Java对象,也没有简单的方法将其转换为Matlab数组。你应该采用以下其中一种方式:

  1. 使用Java GUI(awt)进行可视化,
  2. 在Matlab中创建一个相同大小的3D数组,并在循环中逐个复制所有像素,或者
  3. 将图像保存到Matlab可以理解的文件中(例如png),然后从Matlab中加载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接