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

StackOverflow https://stackoverflow.com/questions/3578265

Вопрос

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

Это было полезно?

Решение

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

Давайте предположим, что вы сделали все это, и теперь у вас есть матрица N-BY-M-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 Чтобы поставить три цветных компонента в матрицу изображения N-BY-M-BY-3 RGB, а затем сохраните изображение в файл растровых изображений RGB24 с помощью функции imwrite:

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

ПРИМЕР:

Используя случайно генерируемую 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top