Конвертировать YUV-последовательность в изображения BMP - PullRequest
2 голосов
/ 22 декабря 2009

У меня есть последовательности yuv, и я хочу преобразовать их в изображения bmp. Я хочу сохранить его в папке на моем компьютере.

Я использовал файл yuv2bmp m в по этой ссылке .

Хотя размер файла Yuv составляет всего 44 МБ, Matlab выдал ошибку памяти. Как я могу преодолеть эту проблему? Не могли бы вы помочь мне, пожалуйста?

С наилучшими пожеланиями ...

Ответы [ 4 ]

1 голос
/ 22 декабря 2009

Я никогда не работал с форматом YUV, но Википедия говорит:

Сегодня термин YUV обычно используется в компьютерной индустрии, чтобы описать форматы файлов, которые кодируются с использованием YCbCr.

Если вы на самом деле используете формат YCbCr, и у вас есть доступ к Toolbox для обработки изображений , вы можете использовать функцию YCBCR2RGB для преобразования цвета YCbCr значений в цветовое пространство RGB, затем сохраните полученное изображение RGB в виде растрового изображения, используя IMWRITE .

1 голос
/ 22 декабря 2009

Строки с 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.

1 голос
/ 22 декабря 2009

Поскольку на этот вопрос нет быстрого ответа, я привел здесь несколько ссылок, которые могут быть вам полезны. Но все это больше относится к реализации на C, а не к Matlab.

Преобразование между YUV и RGB

Пример кода в C

Тот, что в Delphi, довольно хорош . Этот веб-сайт действительно очень хороший веб-сайт для тех, кто любит работать с изображениями

И хорошая статья здесь

Надеюсь, это поможет вам.

0 голосов
/ 25 августа 2015

Вы можете использовать ffmpeg для простого преобразования между YUV и BMP.

  1. Скачать ffmpeg
  2. Перейти к команде propmt
  3. Выполните команду, подобную этой:

    ffmpeg.exe -s 1280x720 -i input.yuv output.bmp

    ffmpeg.exe -s 1280x720 -i input.bmp output.yuv

не забудьте изменить размер в команде.

...