Comment puis-je convertir entre les formats d'image et RGB565 RGB24 dans Matlab?
-
01-10-2019 - |
Question
Je reçois une matrice RVB à partir d'un microprocesseur qui délivre une image au format RGB565. Je veux lire ceci dans Matlab, le convertir au format RGB24, et la sortie de l'image. Comment puis-je faire?
La solution
Vous devez d'abord lire vos données à partir du fichier texte dans une matrice dans Matlab. Comme je ne sais pas ce que le format de votre fichier texte est, je ne peux que suggérer que vous aurez probablement besoin d'utiliser la fonction fscanf
à lire dans toutes vos valeurs (probablement de type uint16
), alors vous aurez probablement à remodeler les valeurs dans une matrice d'image N par M en utilisant la fonction reshape
.
Supposons que vous avez fait tout cela, et vous avez maintenant une matrice N par M img
d'entiers non signés 16 bits. Tout d'abord, vous pouvez utiliser la fonction bitand
pour extraire les bits pour la rouge, vert, bleu et des composants, dont les positions dans le nombre entier sont illustrés ici sur 16 bits:
Ensuite, vous pouvez utiliser la fonction bitshift
et la multiplication par un facteur d'échelle à l'échelle les valeurs de rouge, vert et bleu à une gamme de 0 à 255, puis de les convertir en huit bits non signé entier en utilisant la fonction uint8
. Cela vous donnera trois composants de couleur matrices la même taille que 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
Vous pouvez maintenant utiliser la fonction cat
pour mettre les trois des composantes de couleur en un N par M par 3 matrice d'image RGB, puis enregistrer l'image dans un fichier bitmap d'RGB24 en utilisant la fonction imwrite
:
imgRGB = cat(3, imgR, imgG, imgB); % Concatenate along the third dimension
imwrite(imgRGB, 'myImage.bmp'); % Output the image to a file
Exemple:
En utilisant une matrice de 100 par 100 aléatoire des valeurs de uint16 et d'appliquer les conversions ci-dessus, voici les résultats:
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');
Autres conseils
RGB565 moyens de 5 bits rouge, vert 6 bits et 5 bleu de bit. RGB24 est en 8 bits rouge, vert 8 bits et 8 bits bleu.
Utilisation bitget et BITSET vous pouvez convertir vos données.
http://www.mathworks.de/access /helpdesk/help/techdoc/ref/bitget.html