Вопрос

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

Это было полезно?

Решение

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

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

    Вы можете использовать КОШКА функция для складывания матриц одинакового размера вдоль заданного измерения.Например, если у вас есть ваши 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 относится к определенному пикселю внутри блока.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top