转: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 = [yuv420out reshape(yuv420sampY',1,[])];    %Y 注意要转置

yuv420out = [yuv420out reshape(yuv420sampV',1,[])];    %V

yuv420out = [yuv420out reshape(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

MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式相关推荐

  1. MATLAB读取一张RGB图片转成YUV格式

    https://www.cnblogs.com/hythink/p/5421720.html https://blog.csdn.net/scottly1/article/details/421926 ...

  2. jpg怎么合成一份_如何将多张JPG图片合并成一个GIF?

    原标题:如何将多张JPG图片合并成一个GIF? 今天是广东入秋成功的某一天,虽然天气变冷了,但外面的紫外线还是毒辣得很,所以大家还是在室内跟小编一起研究教程方案吧! 今天要给大家介绍的是将多张静图合并 ...

  3. 如何免费将多张JPG图片转成PDF格式操作方法分享

    PDF文件是我们工作中经常接触的一种文件格式,在日常的工作以及生活当中,我们经常需要将JPG图片转换成PDF,那么如何免费将多张JPG图片转成PDF格式呢?今天小编就给大家分享具体的操作方法. 首先, ...

  4. 怎样将多张jpg图片转成PDF文件来查看

    如何把JPG转换成PDF文档?众所周知,电脑上大部分的PDF格式的文档都不具备编辑功能,只能通过手写将PDF内容录入到Word或是Excel中,但是遇到将图片转换成PDF,我们该怎么办呢?下面告诉大家 ...

  5. matlab读取一个文件的图片大小,Matlab读取文件夹中子文件夹中的图片并修改尺寸...

    今天被师兄问到如何利用matlab批处理图片,觉得很简单嘛 就让他去百度 结果只百度到处理文件夹中图片的程序 好吧 这里放上如何处理文件夹中子文件夹的图片 现状:在一个名为casia的文件夹中,里面有 ...

  6. linux将gif合并成视频,如何将动图转化为视频?多张GIF图片合并成视频的方法

    我们都知道GIF动态图片是不能狗发送到朋友圈的,因为发送到朋友圈之后就变成静图了,静态图片并不能把GIF动图的精髓表现出来,那么有喜欢的动图,想要发送到朋友圈的时候该怎么办?怎么样才能将GIF图片发到 ...

  7. opencv python 多张jpg图片转成avi视频

    在进行微表情识别研究时,使用到了山东大学发布的MMEW微表情数据集,这个数据集提供的数据是图片的形式.数据集在采集的时候使用的帧率是90帧,而使用图片进行连续查看的时候,帧率大概能达到10几帧,看到的 ...

  8. Python如何把一张RGB模式转换成黑白模式

    1.首先先导入pillow库 from PIL import Image import matplotlib.pyplot as plt 如果没有安装pillow库或者matpotlib库 请在com ...

  9. c语言读取一张hdr图片,在Photoshop中调出人物照片高质量的HDR效果

    本篇教程是向脚本之家的朋友介绍利用在Photoshop中调出人物照片高质量的HDR效果方法,教程调出来的效果很不错,作者也把制作过程介绍的非常详细,个人觉得很不错,推荐到脚本之家,感兴趣的朋友可以跟着 ...

最新文章

  1. python中module_Python中的模块(Module)
  2. 无限乱斗机器人ap出装_另类出装畅玩无限乱斗!AP小丑成致胜黑科技
  3. SO_REUSEADDR
  4. Java—servlet简单使用
  5. feign请求的封装
  6. 【李宏毅机器学习】Semi-supervised Learning 半监督学习(p24) 学习笔记
  7. bin文件查看器app_鸿蒙系统编译第一个APP:hello
  8. 趣谈网络协议学习笔记[计算机网络]
  9. 复制高亮代码到印象笔记
  10. php中怎么缩放图片,php中图片的缩放比例-php教程
  11. 为antd tree组件 在onSelect时获取额外数据
  12. 1MB是多少字节 ?是多少位?
  13. SpringMVC 学谈 (第三章)
  14. 软件开发人员如何自我学习?
  15. 第三方服务(文件,图片存储)
  16. 第三届“SLAM技术及应用”暑期学校日程安排
  17. DAY2_L2正则化
  18. BUUCTF笔记之N1BOOK
  19. php实现验证码正确输入_PHP实现验证码
  20. 出牌,用程序判断手中的牌是否能够压过对方出牌

热门文章

  1. 一文玩转tensorrt onnx+tensorrtx
  2. 前后端分离后各自职责
  3. Python爬虫学习教程:天猫商品数据爬虫
  4. cocos creator实例--Cocos Creator 3D开发 投篮 小游戏
  5. matlab画玫瑰花曲线,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...
  6. VCU控制策略之车辆传感器
  7. 《大数据时代的统计学思维》读后感
  8. matplotlib-locator_params函数各个参数的意义?如何调整python可视化图表中坐标轴刻度的显示?
  9. 并发计算中的串行思考
  10. 天龙服务器端修改,天龙一键端怎么架云服务器