1.读入照片

控制输出的标志定义

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;
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

YUVimg = rgb2ycbcr(RGBimg);     %%% rgb -> yuv
figure;imshow((YUVimg));

3.分别取出YUV

  Y,U,V数据保留矩阵存储方式,方便后面的4:2:2,4:2:0采样,更加直观

[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的数据到文件

%%
% 输出图像的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'

%%
% 输出图像的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

%%
% 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]

输出数据到文件

%%
% 输出图像的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

%%
% 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

数据数据到文件

%%
% 输出图像的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

观察命令输出,并等待关闭

disp('---program run susseed---');
disp('---press any key to close all figure---');
system('pause');
close all;

打开输出的yuv文件查看图片

参考

http://www.cnblogs.com/xkfz007/archive/2012/07/31/2616806.html
http://www.xuebuyuan.com/1541892.html
http://www.fourcc.org/yuv.php

代码链接:

http://pan.baidu.com/s/1pLMRcmB

MATLAB读取一张RGB图片转成YUV格式的更多相关文章

  1. 读取多张MNIST图片与利用BaseEstimator基类创建分类器

    读取多张MNIST图片 在读取多张MNIST图片之前,我们先来看下读取单张图片如何实现 每张数字图片大小都为28 * 28的,需要将数据reshape成28 * 28的,采用最近邻插值,如下 def ...

  2. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  3. centos下 将(jgp、png)图片转换成webp格式

    由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...

  4. data:image/png;base64 上传图像将图片转换成base64格式

    大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJ ...

  5. 如何将.jpg图片 转换成.eps 格式图片

    在使用latex写作论文的时候,需要插入一些图片,但是往往有些图片不是eps格式的.虽然网上有如何插入jpg格式的图片方法,但是经过我实验后发现都不太管用.最后找到一个比较靠谱的方法,使用latx本身 ...

  6. canvas将图片转成base64格式 以及 验证图片是否透明

    logoImgUpload:function(file) { let self = this; self.formatUpload(file); let reader = new FileReader ...

  7. FFMpeg笔记(一) 使用FFmpeg将任意格式图片转换成任意格式图片

    void SrcToDest(char* pSrc, char* pDest,unsigned int nSrcWidth, unsigned int nSrcHeight, AVPixelForma ...

  8. 如何将JPG格式的图片转换成PNG格式

    study from : https://jingyan.baidu.com/article/6079ad0e63a4fc28ff86db37.html

  9. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

随机推荐

  1. 浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法

    在我们使用scvmm2012的时候,经常会看到群集状态变成了这样 点开看属性后,我们发现是这样 . 发现了吗?Over-committed,如果翻译过来就是资源过载,或者说资源过量使用了,那么这个状态 ...

  2. [数据分析]excel带名称的四象限散点图制作

    本文前言:方法来至Excel图表之道这本数,偶然看到,好久没出数据分析的文章了,也难怪最近几个月都忙作网页,数据分析自己也就用excell和sql 正文: 带象限的散点图效果如下: 看到图片,这里制作 ...

  3. Java使用MyEclipse构建webService简单案例

     什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含.自描述.模块化的应用,可以发布.定位.通过web ...

  4. dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析

    建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...

  5. openssl+前端jsrsa签名+后端nodejs验签

    内容如标题所示,总体分为三个部分: 一.win10下安装openssl,然后通过openssl工具生成RSA的公钥和私钥 (1)win10下安装openssl需要的工具有:VS2013,Perl,na ...

  6. oracle数据泵导入

    假设将dmp放到/data目录下,首先在数据库中创建directory目录SQL> create directory exp as '/data/'在操作系统命令执行导入命令.impdp sys ...

  7. PHP-GTK 扩展(用PHP编写桌面应用程序)

    PHP能做什么? PHP-GTK (构建桌面应用程序在PHP中使用PHP-GTK) 普及一下知识php如何做桌面客户端 [PHP技术]PHP开发Windows桌面应用程序实例 实战PHP/GTK 哪位 ...

  8. XMind共享未保存的思维导图的教程

    我们在XMind 6对导图进行局域网共享时,一般都是对XMind文件先进行保存再共享,那样是忘记保存呢,该如何共享.局域网共享功能是XMind 6特有的功能之一,自是较为完善,性能强大的功能,当然有办 ...

  9. BZOJ 4205: 卡牌配对

    4205: 卡牌配对 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 76[Submit][Status][Discuss] ...

  10. HTML隐藏的方法

    display:none; 表单 type="hidden" 宽高设为0 height:0;width:0; 祖先元素隐藏或在页面外 margin Visibility:hidde ...