Сжатие MPEG-1 - создание макроблоков

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

2 ответа

Решение

Похоже, вы пытаетесь найти лучший способ собрать ваши различные матрицы 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
    

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

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

Другие вопросы по тегам