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
MATLAB读取一张RGB图片转成YUV格式的更多相关文章
- 读取多张MNIST图片与利用BaseEstimator基类创建分类器
读取多张MNIST图片 在读取多张MNIST图片之前,我们先来看下读取单张图片如何实现 每张数字图片大小都为28 * 28的,需要将数据reshape成28 * 28的,采用最近邻插值,如下 def ...
- ABBYY如何把图片转换成pdf格式
在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...
- centos下 将(jgp、png)图片转换成webp格式
由于项目要求需要将jpg.png类型的图片 转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...
- data:image/png;base64 上传图像将图片转换成base64格式
大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJ ...
- 如何将.jpg图片 转换成.eps 格式图片
在使用latex写作论文的时候,需要插入一些图片,但是往往有些图片不是eps格式的.虽然网上有如何插入jpg格式的图片方法,但是经过我实验后发现都不太管用.最后找到一个比较靠谱的方法,使用latx本身 ...
- canvas将图片转成base64格式 以及 验证图片是否透明
logoImgUpload:function(file) { let self = this; self.formatUpload(file); let reader = new FileReader ...
- FFMpeg笔记(一) 使用FFmpeg将任意格式图片转换成任意格式图片
void SrcToDest(char* pSrc, char* pDest,unsigned int nSrcWidth, unsigned int nSrcHeight, AVPixelForma ...
- 如何将JPG格式的图片转换成PNG格式
study from : https://jingyan.baidu.com/article/6079ad0e63a4fc28ff86db37.html
- jpg、png格式的图片转换成webp后颜色失真的问题
今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg -q 85 -o 3.webp 发现图 ...
随机推荐
- JavaScript 函数
JavaScript 函数 介绍:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.嗯,就像Java中封装的方法一样. 将脚本编写为函数,就可以避免页面载入时执行该脚本. 函数包含着一些代码 ...
- Sublime Text 3 快捷键总结
以下是个人总结不完全的快捷键总汇,祝愿各位顺利解放自己的鼠标. 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同 ...
- Oracle学习笔记十四 内置程序包
扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...
- linux 下安装web开发环境
以下使用 linux centos系统 一.JDK的安装 1.下载jdk-8u111-linux-x64.tar.gz 2.解压该文件,将解压后的文件复制到 /usr/local/jdk1.7 目录下 ...
- POJ 2398 Toy Storage(计算几何)
题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数. 题解:通过斜率判断一个点是否在两条线段之间. /** 通过斜率比较点是否在两线段之 ...
- 三维网格精简算法(Quadric Error Metrics)附源码
在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如 ...
- [bzoj1007][HNOI2008][水平可见直线] (斜率不等式)
Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为 可见的,否则Li为被覆盖的. 例如,对于直线: L1:y ...
- 常用linux手头命令
过滤ip ifconfig eth0|grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}"|sed -n '1p' ifconfig|sed -n '2p' ...
- 关于Spring 国际化 No message found under code 的解决方案
用spring做国际化时经常会报: org.springframework.context.NoSuchMessageException: No message found under code 'u ...
- [LeetCode] Longest Repeating Character Replacement 最长重复字符置换
Given a string that consists of only uppercase English letters, you can replace any letter in the st ...