本文章分为两小篇,该篇主要分享如何利用
Matlab生成我们所需要的YUV422格式数据
下一篇为利用数据导入
DSP并进行查看。
下面为
Matlab程序:
clear all;
close all;
clc;
img=imread('1280_720.jpg');
%img=mat2gray(img); %任意区间映射到[0,1];
[m n dim]=size(img);
%figure,imshow(img),title('原始图像');
%%图像的RGB
img=double(img);
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
%%RGB2YCbCr
Y=zeros(m,n); %亮度
Cb=zeros(m,n); %彩度
Cr=zeros(m,n); %浓度
matrix=[0.299 0.587 0.114;
-0.1687 -0.3313 0.5;
0.5 -0.4187 -0.0813];
for i=1:m
for j=1:n
tmp=matrix*[R(i,j) G(i,j) B(i,j)]';
Y(i,j)=uint8(tmp(1));
Cb(i,j)=uint8(tmp(2)+128);
Cr(i,j)=uint8(tmp(3)+128);
end
end
%%YCbCr2RGB
matrix=inv(matrix);
for i=1:m
for j=1:n
tmp=matrix*[Y(i,j) Cb(i,j)-128 Cr(i,j)-128]';
R(i,j)=tmp(1);
G(i,j)=tmp(2);
B(i,j)=tmp(3);
end
end
%%如果正反变换都没错的话,那么图像是不变的
img(:,:,1)=R;
img(:,:,2)=G;
img(:,:,3)=B;
%figure,imshow(uint8(img)),title('原始图像验证');
I1 = zeros(m,2*n);
for i=1:m
for j=1:n
I1(i,2*j-1) = Y(i,j);
end
end
for i=1:m
for j=1:2:n
I1(i,2*j) = Cb(i,j);
end
end
for i=1:m
for j=1:2:n
I1(i,2+2*j) = Cr(i,j);
end
end
%{%}
% imview(I1,map);
fid=fopen('.1280_720_new.dat','wt'); %打开一个文件写入数据
% fid=fopen('f:mp2.dat','w');
fprintf(fid,'1651 9 806BD000 0 %x c
',m*n*2);
%N=0;
for i=1:m
for j=1:2*n
%N=N+1;
index = floor((j-1)/2);
chang_col = - j + 3 + index*4;
if I1(i,chang_col) < 16
fprintf(fid,'0x0%x
',I1(i,chang_col));
else
fprintf(fid,'0x%x
',I1(i,chang_col));
end
% if rem(N,1)==0;
% fprintf(fid,'
');
% end
end
end
fclose(fid);
上述
matlab中修改参数:
img=imread('1280_720.jpg');
此为图片名称,与.m文件处同一路径
fid=fopen('.1280_720_new.dat','wt');
生成文件名称
下面为生成的
1280_720_new.dat起始部分截图:
第一行为DSP
导入需要信息,我也是通过memory 导出数据得出。
806BD000
为导入起始地址 0为偏移 1c2000导入总数且为16进制, c为c语言格式;
该处无需深究
上图中的index
与chang_col是为了修改YUV格式顺序(DSP识别YUV格式顺序有关)
未修改前为
V0
Y1
U0
Y0
0x806BD003
0x806BD002
0x806BD001
0x806BD000
修改后
Y1
V0
Y0
U0
0x806BD003
0x806BD002
0x806BD001
0x806BD000