Подход, изложенный в вопросе, работает ... Единственное, что у меня отличается от кода выше, это то, что я не добавляю 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);