Преобразование последовательности yuv в изображения bmp

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

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

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

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


person yalcin    schedule 22.12.2009    source источник
comment
Трудно объяснить ошибку памяти, которую вы получаете, без дополнительных подробностей. Некоторый пример кода и образец изображения/файла помогут. Первое, что я хотел бы проверить, это сколько других вещей у вас было в вашей рабочей области (т.е. другие большие матрицы, занимающие всю вашу память).   -  person gnovice    schedule 22.12.2009
comment
Вы не показали никакого кода, и ссылка, которую вы предоставили, не показала никакого кода. @gnovice, вероятно, был прав - вероятно, информации недостаточно, чтобы помочь вам.   -  person jww    schedule 26.04.2014


Ответы (4)


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

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

Некоторые примеры кода на C

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

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

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

person Andres    schedule 22.12.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 вы можете заменить «двойной» на «одиночный». Это сокращает использование памяти еще на 50%, и это не должно иметь никакого значения для вывода, поскольку в конце концов вы все равно выполняете повторное преобразование как uint8.

person Jonas    schedule 22.12.2009

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

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

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

person gnovice    schedule 22.12.2009

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

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

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

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

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

person Hamed    schedule 25.08.2015