Макроблоки , создающие сжатие MPEG-1
-
13-09-2019 - |
Вопрос
Я застрял с основной проблемой в моем сжатии 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 относится к определенному пикселю внутри блока.