Matlab: как правильно использовать класс Java ImageIO для получения BufferedIMage - PullRequest
2 голосов
/ 11 мая 2011

Я пытаюсь сделать макет в Matlab для некоторых данных изображения в базе данных.Данные изображения взяты из Java, выводятся в виде байтового массива в кодировке base64.Я не знаком с форматом [java image].Однако я написал следующий код Matlab, основанный на некотором Java, написанном кем-то, кто работает со мной.Они следуют той же основной схеме, и код 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, но в любом случае получаю тот же результат.

Итак, я в растерянности.

1 Ответ

0 голосов
/ 16 ноября 2011

Подход, изложенный в вопросе, работает ... Единственное, что у меня отличается от кода выше, это то, что я не добавляю 127 в массив uint8:

% 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

edit Включение текста @kchja , связанного с , в случае, если эта ссылка становится недействительной:

Тема: Как я могу преобразовать объект "Java Image"в матрицу изображений MATLAB?

Описание проблемы: Функция IM2JAVA доступна для преобразования изображения MATLAB в изображение Java.Я хотел бы преобразовать изображение Java в изображение MATLAB.

Решение: Нет встроенной функции для преобразования изображений Java в изображения MATLAB.Однако, используя Java API, вы можете извлечь данные из изображения Java и сохранить их в виде матрицы, которая является представлением изображения MATLAB.

Ниже приведен пример преобразования изображения MATLAB в Java и обратно в изображение MATLAB.,Изображение, используемое в этом примере, является частью демонстрации MATLAB и находится в пути MATLAB.В этом примере функция «getPixels» Java-класса «Raster» возвращает значения RGB для изображения.

В зависимости от формата вашего образа Java может потребоваться дополнительная работа.Изображения Java могут быть сохранены в одном из многих форматов;функция «getPixels» возвращает данные пикселей в этом формате.Для получения дополнительной информации см. Страницу javadoc для класса java.awt.image.Raster по адресу 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);

Ниже приведены два других способа реализации этого (более подробнооптимизированный способ):

Пример 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...