2

データベース内のいくつかの画像データについて、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 );

を調べると、これはJavaインスタンスではなくbufferedimageの空の配列です。doubleBufferedImage

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が、どちらの方法でも同じ結果が得られます。

だから、私は途方に暮れています。

4

1 に答える 1

0

質問で概説されているアプローチは機能します...上記のコードとはまったく異なる唯一のことは、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 イメージ」オブジェクトを MATLAB イメージ マトリックスに変換するにはどうすればよいですか?

問題の説明: IM2JAVA 関数を使用して、MATLAB イメージを Java イメージに変換できます。Java イメージを MATLAB イメージに変換したいと考えています。

解決策: Java イメージを MATLAB イメージに変換する組み込み関数はありません。ただし、Java API を使用すると、Java イメージからデータを抽出し、MATLAB のイメージ表現である行列として格納できます。

以下は、MATLAB イメージを Java に変換し、MATLAB イメージに戻す例です。この例で使用されるイメージは MATLAB デモの一部であり、MATLAB パス上にあります。この例では、Java クラス「Raster」の「getPixels」関数が画像の RGB 値を返します。

Java イメージの形式によっては、追加の作業が必要になる場合があります。Java イメージは、さまざまな形式のいずれかで保存できます。「getPixels」関数は、ピクセル データをその形式で返します。詳細については、java.awt.image.Raster クラスの javadoc ページ ( http://java.sun.com/j2se/1.5.0/docs/api/java/awt/image/Raster.html ) を参照してください。

% 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);

これを実装する他の 2 つの方法を次に示します (より最適化された方法で)。

例 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);
于 2011-11-16T06:58:38.397 に答える