2010-08-26 15 views
6

Ricevo una matrice RGB da un microprocessore che emette un'immagine in formato RGB565. Voglio leggerlo in MATLAB, convertirlo in formato RGB24 e stampare l'immagine. Come faccio a fare questo?Come posso convertire tra i formati di immagine RGB565 e RGB24 in MATLAB?

+0

Hai provato a leggere l'immagine RGB565 in MATLAB utilizzando [imread] (http://www.mathworks.com/access/helpdesk /help/techdoc/ref/imread.html)? Quali informazioni sono elencate per 'X' e' map' quando fai questo ?: '[X, map] = imread ('your_file.bmp'); whos' – gnovice

+0

non c'è file.bmp. Si tratta di valori RGB non elaborati provenienti da uP – NewImageUser

+0

Ok, quindi come si acquisiscono questi valori in MATLAB? Se sei già riuscito a inserirli in una variabile, che cos'è quel tipo di variabili? E uint16? – gnovice

risposta

8

Prima devi leggere i dati dal file di testo in una matrice in MATLAB. Dato che non conosco il formato del tuo file di testo, posso solo suggerire che probabilmente dovrai usare la funzione fscanf per leggere tutti i tuoi valori (probabilmente di tipo uint16), quindi probabilmente dovrai rimodellare la valori in una matrice di immagini N-by-M utilizzando la funzione reshape.

Supponiamo che tu abbia fatto tutto questo e ora hai una matrice N-by-M img di numeri interi a 16 bit senza segno. In primo luogo, è possibile utilizzare la funzione bitand per estrarre i bit per i componenti di rosso, verde e blu, le cui posizioni nel intero di 16 bit sono illustrati qui:

alt text

Successivamente, è possibile utilizzare la funzione bitshift e moltiplicazione per fattore di scala per ridimensionare i valori rosso, verde e blu su un intervallo compreso tra 0 e 255, quindi convertirli in un numero intero a 8 bit senza segno utilizzando la funzione uint8. Questo darà tre componenti di colore matrici delle stesse dimensioni 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 

Ora è possibile utilizzare la funzione cat di mettere i tre componenti di colore in un RGB matrice immagine N-per-M-by-3, poi salvare l'immagine in un file bitmap RGB24 utilizzando la funzione imwrite:

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

ESEMPIO:

utilizzando una generata in modo casuale 100-by-100 matrice di uint16 valori e applicare le conversioni di cui sopra, ecco i risultati:

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

+0

Wow, ottima risposta! Mi ha davvero aiutato! – NewImageUser