使用matlab提取YUV檔案各分量並存入txt檔案
阿新 • • 發佈:2021-02-03
工具:
MATLAB
思路:
1.YUV檔案為視訊序列檔案,可以理解為很多幀影象,每一幅影象按照YUV分量進行儲存畫素,因此需要分別將每一幀的Y分量U分量V分量提取出來,將其存成十進位制的txt格式。
2.使用MATLAB首先提取出YUV檔案的每一幀的三個分量
參考連結:
連結: https://blog.csdn.net/sinat_33718563/article/details/79248012?utm_medium=distribute.pc_relevant.none-task-blog-title-10&spm=1001.2101.3001.4242.
最終儲存的txt資料以每行8個畫素的格式進行儲存。(這個是根據學長提供的YUV分量的txt檔案的格式來提取的)。(還有另外的一個格式,直接提取成一列的格式。)
程式碼設計(只儲存前5幀資料)
%% 讀取4:2:0格式YUV的Y、U和V分量,然後將三個分量分別儲存為.txt格式
clear
clc
%% Read yuv from file
row=250; % 行
col=320; % 列
fnum=300; % 幀數
yuvseq = 'foreman_320_256_300_kj.yuv'; % 輸入yuv序列名稱,要把YUV檔案放在統一路徑下。
len=length(yuvseq);
yuvName=yuvseq(1:len-4);
fid = fopen(yuvseq, 'r');
rec_Y=zeros (col,row,fnum);%三維0矩陣
rec_U=zeros(col/2,row/2,fnum);
rec_V=zeros(col/2,row/2,fnum);
for f=1:fnum%一幀一幀的存入各分量
[rec_Y(:,:,f),count] = fread(fid,[col,row],'uchar');%8位,無符號字元型
[rec_U(:,:,f),count1]=fread(fid,[col/2,row/2],'uchar');
[rec_V(:,:,f),count2]=fread(fid,[col/2,row/2],'uchar');
end
filename_Y= sprintf('%s%s',yuvName,'_Y.txt'); %% 生成.txt名稱
outfid_Y=fopen(filename_Y,'wb');
filename_U=sprintf('%s%s',yuvName,'_U.txt');
outfid_U=fopen(filename_U,'wb');
filename_V=sprintf('%s%s',yuvName,'_V.txt');
outfid_V=fopen(filename_V,'wb');
%存V分量
i=1;
for f=1:5
pic_V=uint8(rec_V(:,:,f)'); %% '代表轉置操作
for j=1:(row/2)%行
for k=1:(col/2)%列
if(i<8)
fprintf(outfid_V,'%d\t',pic_V(j,k));
else
fprintf(outfid_V,'%d\n',pic_V(j,k));
i=0;
end
i=i+1;
end
end
end
%存Y分量txt資料
i=1;
for f=1:5
pic_Y=uint8(rec_Y(:,:,f)'); %% '代表轉置操作
for j=1:row%行
for k=1:col%列
if(i<8)
fprintf(outfid_Y,'%d\t',pic_Y(j,k));
else
fprintf(outfid_Y,'%d\n',pic_Y(j,k));
i=0;
end
i=i+1;
end
end%% 將每個矩陣顯示為圖片
end
%存U分量
i=1;
for f=1:5
pic_U=uint8(rec_U(:,:,f)'); %% '代表轉置操作
for j=1:(row/2)%行
for k=1:(col/2)%列
if(i<8)
fprintf(outfid_U,'%d\t',pic_U(j,k));
else
fprintf(outfid_U,'%d\n',pic_U(j,k));
i=0;
end
i=i+1;
end
end
end
%%
fclose(fid);
fclose(outfid_Y);
fclose(outfid_U);
fclose(outfid_V);
儲存格式
如果要更換格式,只需要修改for迴圈對應的引數即可。