Строки с 20 по 39 в yuv2bmp.m читаются
[Y,U,V]=yuvread(filename,start_frame,num_frame);%4:2:0%%%%%%%%%%%%%%%%
[My Ny iL]=size(Y);
[Mu Nu iu]=size(U);
[Mv Nv iv]=size(V);
for f=1:num_frame
UU(:,:,f)= imresize(U(:,:,f),[My Ny],'nearest');
VV(:,:,f)= imresize(V(:,:,f),[My Ny],'nearest');
image(:,:,1) = Y(:,:,f)+1.402*(VV(:,:,f)-128);
image(:,:,2) = Y(:,:,f)-0.34414*(UU(:,:,f)-128)-0.71414*(VV(:,:,f)-128);
image(:,:,3) = Y(:,:,f)+1.772*(UU(:,:,f)-128);
fname=sprintf('%s%d%s',filename(1:length(filename)-4),f,'.bmp');
imwrite(uint8(image),fname,'bmp');
end
Похоже, это тратит совсем немного памяти. К сожалению, у меня нет примеров изображений yuv, но попробуйте изменить эту часть кода следующим образом и проверить, дает ли он по-прежнему правильные результаты:
for f=1:num_frame
% read each image of the sequence separately
[Y,U,V]=yuvread(filename,start_frame+f-1,1);%4:2:0%%%%%%%%%%%%%%%%
% in the following three lines, I have replaced UU with U and VV with V, and I've
% removed all the (:,:,f)
image(:,:,1) = Y+1.402*(V-128);
image(:,:,2) = Y-0.34414*(U-128)-0.71414*(V-128);
image(:,:,3) = Y+1.772*(U-128);
fname=sprintf('%s%d%s',filename(1:length(filename)-4),f,'.bmp');
imwrite(uint8(image),fname,'bmp');
end
Кроме того, в строках с 52 по 54 yuvread.m вы можете заменить «double» на «single». Это сокращает использование вашей памяти еще на 50%, и это не должно иметь никакого значения для вывода, так как, в конце концов, вы все равно преобразуетесь в uint8.