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

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
时间: 2024-10-01 04:23:43

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

java利用ffmpeg把图片转成yuv格式

安装ffmpeg: 安装目录:/usr/share/ffmpeg 创建ffmpeg目录,解压ffmpeg-3.4.1.tar.bz2 tar -xjvf ffmpeg-3.4.1.tar.bz2 下载yasm-1.3.0.tar.gz 解压 tar -xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0/ ./configure make make install 编译参数都是默认的,直接安装到系统中即可,安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装:

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

读取多张MNIST图片 在读取多张MNIST图片之前,我们先来看下读取单张图片如何实现 每张数字图片大小都为28 * 28的,需要将数据reshape成28 * 28的,采用最近邻插值,如下 def plot_digit(data): img = data.reshape(28,28) plt.imshow(img,cmap=matplotlib.cm.binary,interpolation='nearest') plt.axis('off') import matplotlib.pyplot

mac下如何将图片转换成PDF格式?

图片的格式有很多中,PDF也是经常使用的一种,那么如何将图片转换成PDF格式?除了可以通过软件进行转换格式之外,通过电脑的基本操作也是可以实现的!小编总结了具体的操作步骤,简单的计步就可以将您手中的图片转换成PDF格式,下面就和小编一起来看看具体是如何操作的吧! 将图片转换成PDF格式步骤: 第一步:选中你所有需要的图片 第二步:在编辑选项里面选择"全选" 第三步:选择"打印" 第四步:选择"储存为PDF

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

在使用latex写作论文的时候,需要插入一些图片,但是往往有些图片不是eps格式的.虽然网上有如何插入jpg格式的图片方法,但是经过我实验后发现都不太管用.最后找到一个比较靠谱的方法,使用latx本身的图片转换功能.具体方法如下: 可以从MiKTex的目录下找到bmeps的应用文件.在我的电脑里路径是D:\ProText\MiKTeX\texmf\miktex\bin,是latex自己的bitmap to eps converter. 在DOS下,进入.jpg图片所在目录, 用语句bmeps 1

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

由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透明图层的图片,但是尺寸和内存确跟转换成功的文件一般无二. 初想,可以找个办法判断一下图片是否无效的,网上找各种办法,结果无果.虽然失败了但是还是上一下代码,期待大神能协助完善方法. function imgToWebp($file=''){ if(is_file($file)){ $img = ge

如何把图片转换成pdf格式的图片

现如今很多办公人员喜欢将图片转换成PDF格式的图片,因为PDF格式通常要比postscript文件小,可以单独处理每页适合,还可以将文字.字型.格式.颜色封装在一个文件内,并且可以包含超文本链接,声音和动态影像信息等,安全可靠性非常高.同时普通读者也是需要将图片转换成PDF格式的,对于他们而言,用PDF制作成的文件阅读起来具有纸质书的质感和阅读效果,那我们如何转换呢,今天就来介绍一下.步骤一:打开浏览器,进入百度首页,搜索迅捷PDF在线转换器.步骤二:进入转换器界面后,在导航栏上方选择文档转换,

怎样将PNG格式的图片转成PDF格式

都知道我们经常在网上看到的图片虽然有的看起来是一样,但是右击查看图片的属性都是不一样的.在这里小编问大家一个问题,你们知道如何将一般图片的格式转换=成PDF格式吗?就拿PNG转PDF格式来说,可能大部分人都不知道如何进行解决的.那下面不妨看看小编是如何操作的!1:在电脑桌面新建一个文件夹取名为PNG图片,然后将所要转换成PDF格式的PNG图片添加进去.2:然后可以借助到第三方工具:PDF转换工具来完成图片转换成PDF格式的操作.进入到如图所示软件的界面,选择到[图片转换PDF]这个栏目,栏目中就

Xcode9学习笔记51 - 将一张普通的图片转换成灰度图片CGColorSpaceCreateDeviceGray

override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let image = UIImage(named: "img01")//从项目资源中读取一张图片 let grayedImage = self.grayImage(image: image!)//调用灰度图转换方法,将图片转换成灰度图 let

iOS给一张矩形图片剪切成圆形图片

随着APP发展,个人账户的注册和登陆,都有头像的设置,圆形头像也越来越多,此方法正是对剪切圆头像的封装. //****************************************************************************************************************// //******************************************************************************