将yuv序列转换为bmp图像

时间:2009-12-22 10:04:51

标签: matlab image-processing yuv

我有yuv序列,我想将它们转换为bmp图像。我想将它保存到计算机上的文件夹中。

我在this link中使用了yuv2bmp m文件。

虽然Yuv文件只有44MB,但Matlab却抛出了内存错误。 我怎样才能克服这个问题?你能帮帮我吗?

最诚挚的问候......

3 个答案:

答案 0 :(得分:1)

由于这个问题没有快速回答,我在这里提供了一些可能对您有所帮助的链接。但是所有这些都更多地指的是C语言中的实现,而不是Matlab。

Converting Between YUV and RGB

Some sample code in C

That one in Delphi is pretty good。对于那些喜欢处理图像处理的人来说,这个网站确实是一个非常好的网站

And a nice article here

希望它可以帮到你。

答案 1 :(得分:1)

我从未使用过YUV格式,但Wikipedia说:

  

今天,通常使用术语YUV   在计算机行业中描述   使用编码的文件格式   的YCbCr。

如果您实际 使用YCbCr格式,并且您可以访问Image Processing Toolbox,则可以使用函数YCBCR2RGB将YCbCr颜色值转换为RGB颜色空间,然后使用IMWRITE将生成的RGB图像保存为位图。

答案 2 :(得分:1)

yuv2bmp.m中的第20至39行读

    [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

此外,在yuvread.m的第52行到第54行中,您可以将'double'替换为'single'。这样可以减少50%的内存使用量,并且不应该对输出产生任何影响,因为无论如何你最终都会重新转换为uint8。