Сжатие MPEG-1 - создание макроблоков - PullRequest
0 голосов
/ 05 декабря 2009

Я застрял с основной проблемой в моем сжатии MPEG-1. Я должен производить макроблоки в изображении. Макроблок состоит из 16 x 16 пикселей - где 4 x 8x8 - это яркость, 1 x 8x8 - это Cb и 1 x 8x8 Cr. В MATLAB я хочу создать матрицу клеток, содержащую это. Есть предложения?

Ответы [ 2 ]

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

Звучит так, будто вы пытаетесь найти лучший способ собрать различные матрицы 8 на 8 в одну переменную. Есть несколько способов сделать это (с первым вариантом, который я выбрал бы для вашего случая):

  • Объединение данных в трехмерную матрицу:

    Вы можете использовать функцию CAT для укладки матриц одинакового размера по заданному измерению. Например, если у вас есть ваши матрицы яркости 4 8 на 8 в переменных L1, L2, L3 и L4, следующий код объединит их в 8 на 8 на 4 матрица:

    luminance = cat(3,L1,L2,L3,L4);
    

    Вы также можете добавить дополнительные матрицы Cb и Cr для создания матрицы 8 на 8 на 6 :

    macroBlock = cat(3,L1,L2,L3,L4,Cb,Cr);
    %# OR...
    macroBlock = cat(3,luminance,Cb,Cr);  %# Using luminance variable from above
    

    Вы можете затем индексировать macroBlock следующим образом, чтобы получить доступ к любым 8 на 8 матрицам, которые вам нужны:

    L2 = macroBlock(:,:,2);  %# Get the second luminance matrix
    Cb = macroBlock(:,:,5);  %# Get the Cb matrix
    
  • Хранение данных в массиве ячеек:

    Поскольку все ваши матрицы имеют одинаковый размер, описанный выше вариант конкатенации, вероятно, является лучшим. Однако другой вариант (который особенно полезен, если вы хотите хранить данные различного размера, типа или размера) - это использовать массивы ячеек . Далее создается массив ячеек 1 на 6 , содержащий вышеуказанные матрицы:

    macroBlock = {L1 L2 L3 L4 Cb Cr};
    

    Затем вы можете индексировать macroBlock следующим образом, чтобы получить доступ к любой матрице 8 на 8 , которая вам нужна:

    L2 = macroBlock{2};  %# Get the second luminance matrix
    Cb = macroBlock{5};  %# Get the Cb matrix
    
  • Хранение данных в структуре:

    Другой вариант - использовать структуру для хранения матриц 8 на 8 . Преимущество структуры заключается в том, что вы можете получить доступ к данным по имени поля , а не запоминать значение индекса. Вот как вы бы инициализировали структуру:

    macroBlock = struct('L1',L1,'L2',L2,'L3',L3,'L4',L4,'Cb',Cb,'Cr',Cr);
    %# OR...
    macroBlock = struct();
    macroBlock.L1 = L1;
    macroBlock.L2 = L2;
    macroBlock.L3 = L3;
    macroBlock.L4 = L4;
    macroBlock.Cb = Cb;
    macroBlock.Cr = Cr;
    

    Два приведенных выше синтаксиса создают структуру с именами полей 'L1', 'L2', 'L3', 'L4', 'Cb' и 'Cr'. Затем вы можете индексировать macroBlock следующим образом, чтобы получить доступ к любым 8 на 8 матрицам, которые вам нужны:

    L2 = macroBlock.L2;  %# Get the second luminance matrix
    Cb = macroBlock.Cb;  %# Get the Cb matrix
    
0 голосов
/ 29 декабря 2009

Я не получил то, что вам нужно. Код, который делит изображение на эти блоки?

То, что вы должны создать, - это матрица I (i, j, m, n), где m, n обозначает n-й и m-й блоки 8X8 изображения, а i, j обозначает определенный пиксель в пределах блок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...