RGB565转RGB888原理 (MATLAB代码)

项目里用了OV2640摄像头,传感器采集了数据后是以RGB565的形式存在的,后面还要对其做数据处理才能还原原彩色图像,那么什么是RGB565,什么是RGB888呢?来看图。

 这下明白了吗?就是拆开原来的16位数据,分成3个通道的8位数据,可见RGB565转RGB888不会有数据损失,而RGB888转RGB565会丢失色彩信息。我的ppt里右边核心代码是C++的,完整C++带函数的代码去这儿看

https://blog.csdn.net/macunshi/article/details/85724223

下面给出一段完整的MATLAB代码。

这里我还提供一张RGB565存储方式的二进制数据文件,用MATLAB代码把它解析成RGB888就可以看了,需要跑代码的到这儿去下载RGB565的二进制文件样例。

注意:

代码里我们是以16位一个数读数据的,如果是8位一个读数据,就需要把相邻的两个数进行交换然后在做RGB565转RGB888,因为图片二进制数据是嵌入式平台采集的,这里存在一个大小端的问题,ARM用的大端,Intel x86用的小端,存储方式正好相反。

代码如下:

clc  
clear all;
close all;
%以16位形式打开RGB565二进制文件,博文里有样例文件下载链接
 [FileName,PathName] = uigetfile('*','All Image Files','Select the image');  

 fidin=fopen([PathName FileName],'rb');
while ~feof(fidin)
     [RGB565_16,cnt]=fread(fidin,inf,'uint16');
end

fclose(fidin);

%提取每一个像素的16位数据
A=zeros(1200,1600);
for i=1:1200
    for j=1:1600
        A(i,j)=RGB565_16((i-1)*1600+j);
    end
end

imgR = bitshift(bitand(A,63488),-8); %十进制 63488 为二进制 11111000 00000000
imgG = bitshift(bitand(A,2016),-3);  %十进制 2016  为二进制 00000111 11100000   
imgB = bitshift(bitand(A,31),3);     %十进制 31    为二进制 00000000 00011111     
im888 = uint8(cat(3,imgR,imgG,imgB)); %组合RGB数据,然后把16位强制转化为8位
imshow(im888);

完了跑出来的照片是一张草地里由下向上拍的鱼眼照片,是这个样子的:

 

 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值