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. javascript函数的几种写法集合

    1.常规写法 function fnName(){ console.log("常规写法"); } 2.匿名函数,函数保存到变量里 var myfn = function(){ co ...

  2. monkey命令选项参考

    基本参数:     --help              打印帮助消息 -v  可以在命令行中出现多次,每次一个-V选项都会增加monkey向命令行打印输出的详细级别.默认的级别0只会打印启动信息. ...

  3. [Hadoop in Action] 第1章 Hadoop简介

    编写可扩展.分布式的数据密集型程序和基础知识 理解Hadoop和MapReduce 编写和运行一个基本的MapReduce程序   1.什么是Hadoop   Hadoop是一个开源的框架,可编写和运 ...

  4. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  5. iOS实现渐变色背景(两种方式实现)

    之前做过类似的功能,现在记录一下,来来来... 效果图: 说明=========================== 方法1: 说明:无返回值 用法:直接调用方法.原理是在view的layer层添加. ...

  6. 安装 log.io 实时监控 php_error 日志

    Log.io 实时监控 php_error.log 日志 开启 php_error 实时监控日志的第一步,要首先开启 php_error 的功能. vi php.ini 修改 PHP 配置文件,将 ; ...

  7. kettle中全局变量的设置

    设置全局变量. 找到.properties文件: 在文件中设置值: 在kettle中新建一个job(不用做任何设置): 转换中获取便元的设置: 重启kettle的执行结果:

  8. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  9. canvas贝塞尔曲线 - 1

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvEAAAIcCAIAAADwgGbqAAAgAElEQVR4nOy9a4wb55nn20kOZhq7o8

  10. Openjudge 1.13-23:区间内的真素数(每日一水)

    总时间限制:  1000ms 内存限制:  65536kB 描述 找出正整数 M 和 N 之间(N 不小于 M)的所有真素数.真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为 ...