rgb转yuv422 matlab,MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式
转:https://www.cnblogs.com/hythink/p/5421720.html
1.读入照片
控制输出的标志定义
1
2
3
4
5
6
7
8
9
10
11
clc;close all;clear
YES = 1; NO = 0;
%YES表示输出该文件,请用户配置
yuv444_out_txt = 1;
yuv444_out_yuv = 0;
yuv422_out_txt = 0;
yuv422_out_yuv = 0;
yuv420_out_txt = 0;
yuv420_out_yuv = 1;
1
2
3
4
5
6
7
filename ='Koala.jpg';
filestr = filename(1:findstr(filename,'.jpg')-1);
filepath = ['.\' filestr 'out\']
mkdir(filepath);
filestr = [filepath filestr];
RGBimg =imread(filename);
figure;imshow(RGBimg);
1)读入的照片由filename 配置,这里照片必须放在该目录下。如:filename = 'Koala.jpg'
2)filename找到字符串的起始位置。findstr('Koala.jpg','.jpg') = 6,所以就可以取到去掉后缀名的文件名
3)得到一个 .\文件名out\的目录
4)创建该目录
5)filestr = 目录+文件名,用于后面的数据输出,方便输出到 .\文件名out\目录下。这里 filestr = '.\Koalaout\Koala'
2. 调用matlab函数将rgb转换成yuv
1
2
YUVimg = rgb2ycbcr(RGBimg);%%% rgb -> yuv
figure;imshow((YUVimg));
3.分别取出YUV
Y,U,V数据保留矩阵存储方式,方便后面的4:2:2,4:2:0采样,更加直观
1
2
3
4
5
6
7
8
9
10
11
12
[imgHeight imgWidth imgDim] =size(YUVimg);%%
len = imgHeight*imgWidth*imgDim;
yuvimout =zeros(1,len);
Y = YUVimg(:,:,1);% Y 矩阵
U = YUVimg(:,:,2);% U 矩阵
V = YUVimg(:,:,3);% V 矩阵
Yvec =reshape(YUVimg(:,:,1)',1,[]);% 矩阵整理成行向量
Uvec =reshape(YUVimg(:,:,2)',1,[]);
Vvec =reshape(YUVimg(:,:,3)',1,[]);
yuvimout(1:3:len) = Yvec;
yuvimout(2:3:len) = Uvec;
yuvimout(3:3:len) = Vvec;
注意:reshape矩阵时,需要对结果做转置,保证是按行来将矩阵整理成行向量的
4.输出YUV444的数据到文件
1
2
3
4
5
6
7
8
9
10
11
12
%%
% 输出图像的yuv数据到 .txt
%
if yuv444_out_txt == YES
filename = [filestr'_444.txt'];
fid=fopen(filename,'w');
fprintf(fid,'%02x\n',yuvimout);
fclose(fid);
disp('yuv444_out_txt YES');
else
disp('yuv444_out_txt NO');
end
在本例中:filename = [filestr '_444.txt'] = '.\Koalaout\Koala_444.txt'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%%
% 输出图像的yuv数据到 .yuv
% 四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
%
% 存放的码流:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
%
% 映射的像素: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
if yuv444_out_yuv == YES
filename = [filestr'_444.yuv'];
fid=fopen(filename,'wb');
fwrite(fid,yuvimout,'uint8');
fclose(fid);
disp('yuv444_out_yuv YES');
else
disp('yuv444_out_yuv NO');
end
5.将 YUV4:4:4 转成 YUYV 4:2:2 packed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%%
% YUV4:4:4 -->> YUYV 4:2:2
% 四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
%
% 存放的码流:[Y0 U0] [Y1 V1] [Y2 U2] [Y3 V3]
%
% 映射的像素: [Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
%%%
len = imgHeight*imgWidth+imgHeight*imgWidth/2+imgHeight*imgWidth/2;
yuv422out =zeros(1,len);
yuv422sampY = Y;
yuv422sampU = U(:,1:2:size(U,2));
yuv422sampV = V(:,2:2:size(V,2));
yuv422out(1:2:len) =reshape(yuv422sampY',1,[]);%%% 注意要转置
yuv422out(2:4:len) =reshape(yuv422sampU',1,[]);
yuv422out(4:4:len) =reshape(yuv422sampV',1,[]);
说明:
1)4:2:2模式是保留所有的Y,U,V是每间隔1列抽取抽样一个点,如代码中所示。
2)YUYV 4:2:2 packed 即像素值是 YU/YV 交替存储的模式。存放的码流:[Y0 U0] [Y1 V1] [Y2 U2] [Y3 V3]
输出数据到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%%
% 输出图像的yuv422数据到 .txt
%
if yuv422_out_txt == YES
filename = [filestr'_422.txt'];
fid=fopen(filename,'w');
fprintf(fid,'%02x\n',yuv422out);
fclose(fid);
disp('yuv422_out_txt YES');
else
disp('yuv422_out_txt NO');
end
% output yuyv422 to .yuv file
if yuv422_out_yuv == YES
filename = [filestr'_422yuyv.yuv'];
fid=fopen(filename,'wb');
fwrite(fid,yuv422out,'uint8');
fclose(fid);
disp('yuv422_out_yuv YES');
else
disp('yuv422_out_yuv NO');
end
6. 将 YUV4:4:4 转成 YV12 4:2:0 planar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%%
% YUV4:4:4 -->> YUYV 4:2:0
% output yuyv422 to .yuv file
% 第一行四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
% 第二行四个像素为:[Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7]
% 4:2:0 采样
% 第一行采样像素为:[Y0 U0 ] [Y1 ] [Y2 U2 ] [Y3 ]
% 第二行采样像素为:[Y4 V4] [Y5 ] [Y6 V6] [Y7 ]
% 420yv12 planar 的存储码流: [Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7] [V4 V6] [U0 U2]
% 映射的像素: [Y0 U0 V4] [Y1 U0 V4] [Y2 U2 V6] [Y3 U2 V6]
% [Y4 U0 V4] [Y5 U0 V4] [Y6 U2 V6] [Y7 U2 V6]
%%%
len = imgHeight*imgWidth+imgHeight*imgWidth/4+imgHeight*imgWidth/4;
yuv420out = [];
yuv420sampY = Y;
yuv420sampU = U(1:2:size(U,1),1:2:size(U,2));
yuv420sampV = V(2:2:size(V,1),1:2:size(V,2));
%%%yuv420out = [y v u] % yuv420 yv12 format
yuv420out = [yuv420outreshape(yuv420sampY',1,[])];%Y 注意要转置
yuv420out = [yuv420outreshape(yuv420sampV',1,[])];%V
yuv420out = [yuv420outreshape(yuv420sampU',1,[])];%U
说明:
1)yuv420sampU = U(1:2:size(U,1),1:2:size(U,2)); 从图片的第一行开始 每间隔1行 和 每间隔1列 采样一个U
2)yuv420sampV = V(2:2:size(V,1),1:2:size(V,2)); 从图片的第二行开始 每间隔1行 和 每间隔1列 采样一个V
数据数据到文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%%
% 输出图像的yuv422数据到 .txt
%
if yuv420_out_txt == YES
filename = [filestr'_420.txt'];
fid=fopen(filename,'w');
fprintf(fid,'%02x\n',yuv420out);
fclose(fid);
disp('yuv420_out_txt YES');
else
disp('yuv420_out_txt NO');
end
% output yuyv420 to .yuv file
if yuv420_out_yuv == YES
filename = [filestr'_420yv12.yuv'];
fid=fopen(filename,'wb');
fwrite(fid,yuv420out,'uint8');
fclose(fid);
disp('yuv420_out_yuv YES');
else
disp('yuv420_out_yuv NO');
end
观察命令输出,并等待关闭
1
2
3
4
disp('---program run susseed---');
disp('---press any key to close all figure---');
system('pause');
close all;
打开输出的yuv文件查看图片
参考
1
http://www.cnblogs.com/xkfz007/archive/2012/07/31/2616806.html
1
http://www.xuebuyuan.com/1541892.html
1
http://www.fourcc.org/yuv.php
代码链接:
1
http://pan.baidu.com/s/1pLMRcmB
rgb转yuv422 matlab,MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式相关推荐
- jpg怎么合成一份_如何将多张JPG图片合并成一个GIF?
原标题:如何将多张JPG图片合并成一个GIF? 今天是广东入秋成功的某一天,虽然天气变冷了,但外面的紫外线还是毒辣得很,所以大家还是在室内跟小编一起研究教程方案吧! 今天要给大家介绍的是将多张静图合并 ...
- 如何免费将多张JPG图片转成PDF格式操作方法分享
PDF文件是我们工作中经常接触的一种文件格式,在日常的工作以及生活当中,我们经常需要将JPG图片转换成PDF,那么如何免费将多张JPG图片转成PDF格式呢?今天小编就给大家分享具体的操作方法. 首先, ...
- MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式
转:https://www.cnblogs.com/hythink/p/5421720.html 1.读入照片 控制输出的标志定义 1 2 3 4 5 6 7 8 9 10 11 clc;close ...
- MATLAB读取一张RGB图片转成YUV格式
https://www.cnblogs.com/hythink/p/5421720.html https://blog.csdn.net/scottly1/article/details/421926 ...
- c语言读取一张hdr图片,在Photoshop中调出人物照片高质量的HDR效果
本篇教程是向脚本之家的朋友介绍利用在Photoshop中调出人物照片高质量的HDR效果方法,教程调出来的效果很不错,作者也把制作过程介绍的非常详细,个人觉得很不错,推荐到脚本之家,感兴趣的朋友可以跟着 ...
- linux将gif合并成视频,如何将动图转化为视频?多张GIF图片合并成视频的方法
我们都知道GIF动态图片是不能狗发送到朋友圈的,因为发送到朋友圈之后就变成静图了,静态图片并不能把GIF动图的精髓表现出来,那么有喜欢的动图,想要发送到朋友圈的时候该怎么办?怎么样才能将GIF图片发到 ...
- opencv python 多张jpg图片转成avi视频
在进行微表情识别研究时,使用到了山东大学发布的MMEW微表情数据集,这个数据集提供的数据是图片的形式.数据集在采集的时候使用的帧率是90帧,而使用图片进行连续查看的时候,帧率大概能达到10几帧,看到的 ...
- 怎样将多张jpg图片转成PDF文件来查看
如何把JPG转换成PDF文档?众所周知,电脑上大部分的PDF格式的文档都不具备编辑功能,只能通过手写将PDF内容录入到Word或是Excel中,但是遇到将图片转换成PDF,我们该怎么办呢?下面告诉大家 ...
- 使用C++实现多张BMP图片转换为YUV动画----附加淡入淡出转场(逐渐变明变暗),及垂直滑像转场(逐行渐变)
使用C++实现多张BMP图片转换为YUV动画----附加淡入淡出转场(逐渐变明变暗),及垂直滑像转场(逐行渐变) 一.BMP图像简介 1.BMP图像是什么? 2.BMP图像文件结构 1)图象文件头 2 ...
- c语言.jpg图片转成数组_多张jpg图片合成pdf文件
唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...
最新文章
- 全基因组关联分析中上位性检测算法的研究
- YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.r
- springboot:记录jdbc
- mysql update中使用subquery
- 支持XML的公司和它们的开发工具有哪些?
- js 清除html页面,如何清除使用JavaScript输入的HTML文件?
- 中英文对照 —— 航空航天航海、交通运输工具
- HDU 2824 The Euler function 欧拉函数
- html木马制作教程,利用Internet Explorer Object Data漏洞制做全新网页木马
- 51单片机复习:红外通信
- Android 系统的分区和文件系统(一)--Android分区的大概框架
- 5.视频监控 - 摄像头接口
- 第七周OJ—百位数的分解
- linux-rootfs根文件系统构建
- windows server 2008R2服务端上安装流媒体服务器
- 微服务-微服务为什么要用到 API 网关
- BFS - Dungeon Master
- mysql server怎么安装教程_Mysql Server安装教程
- 利用javascript获取图片的top N主色值
- iOS开发Storyboard中UITableView顶部默认空白 - 芒果iOS
热门文章
- EasyDarwin的交叉编译
- MAT jvm 分析工具,mac,windows版本 下载地址
- Linux Ubuntu 安装Tomcat 7,亲测有效
- 绿联串口线linux驱动下载,绿联usb转串口驱动
- Linux查看增量文件,Linux 利用 rsync 命令提取增量文件
- MySQL通过Binlog恢复数据
- 排名前5的iOS测试自动化框架
- python实现bt下载器_使用Python实现BT种子和磁力链接的相互转换
- 计算机考研具体学科准备
- android activity singletask,Android Activity启动模式之singleTask实例详解