Как конвертировать между форматами изображений RGB565 и RGB24 в MATLAB?

Я получаю матрицу RGB от микропроцессора, который выводит изображение в формате RGB565. Я хочу прочитать это в MATLAB, преобразовать его в формат RGB24 и вывести изображение. Как мне это сделать?

2 ответов


сначала нужно прочитать данные из текстового файла в матрицу в MATLAB. Поскольку я не знаю, в каком формате находится ваш текстовый файл, я могу только предположить, что вам, вероятно, понадобится использовать функцию fscanf читать во всех ваших значениях (возможно, типа uint16), то вам, вероятно, придется изменить значения в матрицу изображений N-by-M с помощью функции reshape.

давайте предположим, что вы сделали все, что и вы теперь есть матрица N-by-M img 16-разрядных целых чисел без знака. Во-первых, вы можете использовать функцию bitand чтобы извлечь биты для красного, зеленого и синего компонентов, позиции которых в 16-битном целочисленном изображены здесь:

alt text

Далее, вы можете использовать функцию bitshift и умножение на масштабный коэффициент, чтобы масштабировать красные, зеленые и синие значения в диапазоне от 0 до 255, а затем преобразовать их в 8-разрядное целое число без знака использование функции uint8. Это даст вам три цветовые компонентные матрицы того же размера, что и img:

imgR = uint8((255/31).*bitshift(bitand(img, 63488), -11));  % Red component
imgG = uint8((255/63).*bitshift(bitand(img, 2016), -5));    % Green component
imgB = uint8((255/31).*bitand(img, 31));                    % Blue component

теперь вы можете использовать функцию cat чтобы поместить три цветовых компонента в матрицу изображений RGB N-by-M-by-3, затем сохраните изображение в растровый файл RGB24 с помощью функции imwrite:

imgRGB = cat(3, imgR, imgG, imgB);  % Concatenate along the third dimension
imwrite(imgRGB, 'myImage.bmp');     % Output the image to a file

пример:

используя случайно сгенерированную матрицу 100 на 100 значения uint16 и применение вышеуказанных преобразований, вот результаты:

img = randi([0 65535], 100, 100, 'uint16');
% Perform the above conversions to get imgRGB
subplot(1, 2, 1);
imshow(img);
title('Random uint16 image');
subplot(1, 2, 2);
imshow(imgRGB);
title('Corresponding RGB image');

alt text


RGB565 означает 5 бит красный, 6 бит зеленый и 5 бит синий. Для rgb24 состоит из 8 бит красный, зеленый и 8 бит 8 бит синий.

используя bitget и bitset, вы можете конвертировать свои данные.

http://www.mathworks.de/access/helpdesk/help/techdoc/ref/bitget.html