2010-08-26 18 views
6

Ich bekomme eine RGB-Matrix von einem Mikroprozessor, der ein Bild im RGB565-Format ausgibt. Ich möchte das in MATLAB lesen, in das RGB24-Format konvertieren und das Bild ausgeben. Wie mache ich das?Wie kann ich zwischen RGB565 und RGB24 Bildformaten in MATLAB konvertieren?

+0

Haben Sie versucht, Ihre RGB565 Bild in MATLAB Lesen mit [imread] (http://www.mathworks.com/access/helpdesk /help/techdoc/ref/imread.html)? Welche Informationen werden für 'X' und' map' angezeigt, wenn Sie dies tun? '[X, map] = imread ('your_file.bmp'); whos' – gnovice

+0

gibt es keine file.bmp. Dies sind die RGB-Rohwerte, die von einem uP kommen – NewImageUser

+0

Okay, wie erhalten Sie diese Werte in MATLAB? Wenn Sie es bereits geschafft haben, sie in eine Variable zu schreiben, was ist dieser Variablentyp? Ist es Uint16? – gnovice

Antwort

8

Sie müssen zuerst Ihre Daten aus der Textdatei in eine Matrix in MATLAB lesen. Da ich nicht weiß, in welchem ​​Format sich Ihre Textdatei befindet, kann ich nur vorschlagen, dass Sie wahrscheinlich die Funktion fscanf verwenden müssen, um alle Ihre Werte einzulesen (wahrscheinlich vom Typ uint16), dann müssen Sie wahrscheinlich die Werte in eine N-mal-M-Bildmatrix unter Verwendung der Funktion reshape.

Nehmen wir an, Sie haben das alles getan, und Sie haben jetzt eine N-by-M-Matrix img von vorzeichenlosen 16-Bit-Ganzzahlen. Erstens können Sie die Funktion bitand verwenden, um die Bits für die roten, grünen und blauen Komponenten zu extrahieren, deren Positionen in der 16-Bit-Integer sind hier dargestellt:

alt text

Als nächstes können Sie die Funktion nutzen bitshift und Multiplikation mit einem Skalierungsfaktor, um die Werte für Rot, Grün und Blau auf einen Bereich von 0 bis 255 zu skalieren, dann wandeln Sie sie unter Verwendung der Funktion uint8 in eine vorzeichenlose 8-Bit-Ganzzahl um. Dies gibt Ihnen drei Farbkomponenten-Matrizen, die die gleiche Größe wie 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 

Jetzt können Sie die Funktion cat verwenden, um die drei Farbkomponenten in eine N-von-M-by-3 RGB-Bildmatrix zu setzen, dann speichert das Bild in eine RGB24 Bitmap-Datei mit der Funktion imwrite:

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

BEISPIEL:

Verwendung eines zufällig 100-by-100-Matrix von uint16 erzeugten hier Werte und die obigen Umwandlungen Anwendung, die Ergebnisse sind:

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 große Antwort! Es hat wirklich geholfen! – NewImageUser