繁体   English   中英

Matlab:如何正确使用Java ImageIO类获取BufferedIMage

[英]Matlab: How to properly use the Java ImageIO class to get a BufferedIMage

我正在尝试在Matlab中对数据库中的某些图像数据进行模拟。 图像数据来自java,以base64编码的字节数组形式输出。 我对[java image]格式不熟悉。 但是,我基于与我一起工作的人编写的一些Java编写了以下Matlab代码。 它们遵循相同的基本轮廓,并且Java代码能够很好地读取图像。 Matlab代码如下所示:

function [ result ] = queryDb( theQuery )
  conn   = database( ... ); % connect to the database
  result = fetch( exec( conn, theQuery ) );
  result = result.Data;

  close( conn );
end

data = queryDb( 'sql query to get the data' );
data = uint8( data{1,1} );
data = org.apache.commons.codec.binary.Base64.decodeBase64( data );
data = uint8( 127 + data ); % the base64 decoder returns signed int8

import javax.imageio.ImageIO;
import java.io.ByteArrayInputStream;

dataStream    = ByteArrayInputStream( data );
bufferedimage = ImageIO.read( dataStream );

在检查bufferedimage ,它是一个空的double数组,与java BufferedImage实例相反。

我对dataStream进行了一些测试,以查看其行为是否符合预期; 类似于以下内容的小型单元测试:

for jj = 1:10
  for kk 1:10
    assert( dataStream.read() == data(kk) );
  end;

  dataStream.reset();
end;

它已签出,因此这使我相信问题出在ImageIO或我使用它。

不幸的是,我发现的使用ImageIO(以及其他一些API)的示例都没有以我在此处概述的方式(在Matlab中)使用。

这段代码以相同的方式使用java.io.ByteArrayInputStream -在某种意义上,所提供的数据是字节数组。

这段代码本质上就是我想要做的-将Java图像转换为Matlab数组。 不幸的是,他们通过获取Matlab图像,将其转换为Java图像,然后将其变回来作弊。

该代码使用ImageIO,但它是通过从文件流中读取来实现的。 我尝试将数据写到文件中,然后使用java.io.File读取它,但是无论哪种方式我都得到相同的结果。

所以,我很茫然。

问题中概述的方法有效...我唯一与上面的代码有任何不同的地方是我没有在uint8数组中添加127:

% Do all the imports
% sql query to get the data
dataStream    = ByteArrayInputStream( decodeBase64( rows.data{1} ) );
bufferedImage = ImageIO.read( dataStream );
[w h] = deal( theWidth, theHeight );
imageData     = uint8( bufferedImage.getData.getPixels( 0,0,w,h,[] ) );
imageData     = permute( reshape( imageData, [3 w h] ), [2 3 1] );

imshow( imageData );
% voila

在链接变为无效的情况下, 编辑并包含链接到的文本@kchja:

主题:如何将“ Java Image”对象转换为MATLAB图像矩阵?

问题描述:IM2JAVA函数可用于将MATLAB图像转换为Java图像。 我想将Java图像转换为MATLAB图像。

解决方案:没有内置功能可将Java图像转换为MATLAB图像。 但是,使用Java API,您可以从Java图像中提取数据并将其存储为矩阵,这是MATLAB的图像表示形式。

下面是将MATLAB映像转换为Java并转换回MATLAB映像的示例。 本示例中使用的图像是MATLAB演示的一部分,位于MATLAB路径上。 在此示例中,Java类“ Raster”的“ getPixels”函数返回图像的RGB值。

根据Java映像的格式,可能需要其他工作。 Java映像可以以多种格式之一存储。 “ getPixels”函数以该格式返回像素数据。 有关更多信息,请参见http://java.sun.com/j2se/1.5.0/docs/api/java/awt/image/Raster.html上 java.awt.image.Raster类的javadoc页面。

% create java image
I = imread('office_3.jpg');
javaImage = im2java(I);

% get image properties
H=javaImage.getHeight;
W=javaImage.getWidth;

% repackage as a 3D array (MATLAB image format)
B = uint8(zeros([H,W,3]));
pixelsData = uint8(javaImage.getBufferedImage.getData.getPixels(0,0,W,H,[]));
for i = 1 : H
base = (i-1)*W*3+1;
B(i,1:W,:) = deal(reshape(pixelsData(base:(base+3*W-1)),3,W)');
end

% display image
imshow(B);

以下是实现此目的的另外两种方法(以更优化的方式):

示例1 :(更快执行)

pixelsData = reshape(typecast(jImage.getData.getDataStorage, 'uint8'), 4, w, h);
imgData = cat(3, ...
        transpose(reshape(pixelsData(3, :, :), w, h)), ...
        transpose(reshape(pixelsData(2, :, :), w, h)), ...
        transpose(reshape(pixelsData(1, :, :), w, h)));

范例2:

imgData = zeros([H,W,3],'uint8');
pixelsData = reshape(typecast(javaImage.getBufferedImage.getData.getDataStorage,'uint32'),W,H).';
imgData(:,:,3) = bitshift(bitand(pixelsData,256^1-1),-8*0);
imgData(:,:,2) = bitshift(bitand(pixelsData,256^2-1),-8*1);
imgData(:,:,1) = bitshift(bitand(pixelsData,256^3-1),-8*2);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM