Tôi nhận được ma trận RGB từ bộ vi xử lý xuất ra hình ảnh ở định dạng RGB565. Tôi muốn đọc điều này vào MATLAB, chuyển đổi nó sang định dạng RGB24 và xuất hình ảnh. Làm thế nào để tôi làm điều này?Làm cách nào để chuyển đổi giữa các định dạng hình ảnh RGB565 và RGB24 trong MATLAB?
Trả lời
Trước tiên, bạn cần phải đọc dữ liệu từ tập tin văn bản vào một ma trận trong MATLAB. Vì tôi không biết định dạng tệp văn bản của bạn là gì, tôi chỉ có thể gợi ý rằng bạn có thể cần sử dụng hàm fscanf
để đọc tất cả các giá trị của bạn (có thể là loại uint16
), sau đó bạn có thể phải định lại lại các giá trị vào ma trận hình ảnh N-by-M bằng cách sử dụng hàm reshape
.
Giả sử bạn đã thực hiện tất cả điều đó và giờ đây bạn có ma trận N-by-M img
của số nguyên 16 bit chưa ký. Trước tiên, bạn có thể sử dụng chức năng bitand
để trích xuất các bit cho các thành phần màu đỏ, xanh lá cây, và màu xanh, có vị trí trong số nguyên 16-bit được minh họa ở đây:
Tiếp theo, bạn có thể sử dụng chức năng bitshift
và nhân với hệ số tỷ lệ để chia tỷ lệ các giá trị đỏ, xanh lá cây và xanh lam thành phạm vi từ 0 đến 255, sau đó chuyển đổi chúng thành số nguyên 8 bit không dấu bằng cách sử dụng hàm uint8
. Điều này sẽ cung cấp cho bạn ba thành phần màu ma trận cùng kích thước như 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
Bây giờ bạn có thể sử dụng chức năng cat
để đặt các thành phần ba màu vào một ma trận hình ảnh RGB N-by-M-by-3, sau đó lưu hình ảnh vào một tập tin bitmap RGB24 sử dụng chức năng imwrite
:
imgRGB = cat(3, imgR, imgG, imgB); % Concatenate along the third dimension
imwrite(imgRGB, 'myImage.bmp'); % Output the image to a file
VÍ DỤ:
sử dụng được tạo ngẫu nhiên 100-by-100 ma trận của uint16 giá trị và áp dụng các chuyển đổi ở trên, đây là kết quả:
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');
Câu trả lời hay nhất! Nó thực sự đã giúp! – NewImageUser
RGB565 có nghĩa là 5 bit đỏ, xanh lục 6 bit và xanh lam 5 bit. RGB24 được làm bằng màu đỏ 8 bit, xanh lá cây 8 bit và xanh lam 8 bit.
Sử dụng bitget và bitet bạn có thể chuyển đổi dữ liệu của mình.
http://www.mathworks.de/access/helpdesk/help/techdoc/ref/bitget.html
Vì vậy, một khi tôi đã chuyển đổi nó sang RGB24, làm thế nào tôi có thể làm cho MATLAB hiển thị nó như một hình ảnh? – NewImageUser
'imshow (rgbImage)' – Jonas
Các bạn đã cố gắng đọc hình ảnh RGB565 của bạn vào MATLAB sử dụng [imread] (http://www.mathworks.com/access/helpdesk /help/techdoc/ref/imread.html)? Thông tin nào được liệt kê cho 'X' và' map' khi bạn làm điều này ?: '[X, map] = imread ('your_file.bmp'); whos' – gnovice
không có tệp.bmp. Đây là các giá trị RGB thô đến từ một uP – NewImageUser
Được rồi, vậy làm cách nào bạn nhận được các giá trị này vào MATLAB? Nếu bạn đã quản lý để đặt chúng trong một biến, các biến đó là gì? Có phải uint16 không? – gnovice