Сжатие 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 обозначает определенный пиксель в блоке.