Я получаю матрицу RGB от микропроцессора, который выводит изображение в формате RGB565. Я хочу прочитать это в MATLAB, преобразовать его в формат RGB24 и вывести изображение. Как мне это сделать?
Сначала необходимо прочитать данные из текстового файла в матрицу в MATLAB. Поскольку я не знаю, в каком формате находится ваш текстовый файл, я могу только предположить, что вам, вероятно, потребуется использовать функцию fscanf
для чтения всех ваших значений (вероятно, типа uint16
), то вам, вероятно, придется преобразовать значения в матрицу изображения размером N на M, используя функцию reshape
.
Предположим, что вы все это сделали, и теперь у вас есть матрица N на M img
16-битных целых чисел без знака.Во-первых, вы можете использовать функцию bitand
, чтобы извлечь биты для красного, зеленого и синего компонентов, позиции которых в 16-битном целом показаны здесь:
Далее вы можете использовать функцию битовый сдвиг
и умножение на масштабный коэффициент, чтобы масштабировать значения красного, зеленого и синего цветов в диапазоне от 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- на 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 на 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');
RGB565 означает 5-битный красный, 6-битный зеленый и 5-битный синий. RGB24 состоит из 8-битного красного, 8-битного зеленого и 8-битного синего цветов.
Используя bitget и bitset, вы можете преобразовать свои данные.
http://www.mathworks.de/access/helpdesk/help/techdoc/ref/bitget.html