كيف يمكنني التحويل بين تنسيقات الصور RGB565 و RGB24 في MATLAB؟
-
01-10-2019 - |
سؤال
أحصل على مصفوفة RGB من المعالج الدقيق الذي يخرج صورة بتنسيق RGB565. أريد قراءة هذا في MATLAB ، وتحويله إلى تنسيق RGB24 ، وإخراج الصورة. كيف أقوم بهذا العمل؟
المحلول
عليك أولاً قراءة بياناتك من الملف النصي إلى مصفوفة في Matlab. بما أنني لا أعرف التنسيق الذي يوجد فيه ملفك النصي ، لا يمكنني إلا أن أقترح أنك ستحتاج على الأرجح إلى استخدام الوظيفة fscanf
للقراءة في كل القيم الخاصة بك (ربما من النوع uint16
) ، على الأرجح سيتعين عليك إعادة تشكيل القيم في مصفوفة صورة n-by-m باستخدام الوظيفة reshape
.
لنفترض أنك فعلت كل ذلك ، ولديك الآن مصفوفة n-by-m img
من أعداد صحيحة 16 بت غير موقعة. أولاً ، يمكنك استخدام الوظيفة bitand
لاستخراج البتات للمكونات الحمراء والأخضر والأزرق ، والتي يتم توضيح مواقعها في عدد صحيح 16 بت هنا:
بعد ذلك ، يمكنك استخدام الوظيفة bitshift
والضرب بعامل المقياس لتوسيع نطاق القيم الحمراء والأخضر والأزرق إلى نطاق من 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-by-3-3 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