2012-02-01 6 views
1

Во-первых, я признаю, что это вопрос домашней работы. Однако, похоже, я застрял. Мне нужно получить все квантованные коэффициенты из jpeg-изображения, используя Phil Sallee's JPEG Toolbox (ссылка указана в нижней части таблицы под заголовком «обновление») (я буду строить гистограмму, но эту часть я могу обработать, как только я смогу добраться до данные, которые мне нужны). У меня есть изображение в формате JPEG, что составляет около 5 МБ в размере и получить обратно эти данные, когда я запускаю его с помощью кода Sallee в:Как найти квантованные коэффициенты из MATLAB с использованием кода Салли?

image_width: 3000 
    image_height: 4000 
    image_components: 3 
    image_color_space: 2 
    jpeg_components: 3 
    jpeg_color_space: 3 
    comments: {} 
    coef_arrays: {[4000x3000 double] [2000x3000 double] [2000x3000 double]} 
    quant_tables: {[8x8 double] [8x8 double]} 
    ac_huff_tables: [1x2 struct] 
    dc_huff_tables: [1x2 struct] 
    optimize_coding: 0 
    comp_info: [1x3 struct] 
    progressive_mode: 0 

Как получить квантованные коэффициенты из этого образа? Сначала я пытался что-то вроде этого просто выплюнуть коэффициенты, чтобы я мог видеть то, что я имел дело с:

pic = jpeg_read(image) 
img_coef = pic.quant_tables{pic.comp_info(1).quant_tbl_no} 
img_coef = pic.quant_tables{pic.comp_info(2).quant_tbl_no} 

img_coef запускается дважды, потому что есть два элемента данных quant_tables пункт выше. Однако это кажется очень низким коэффициентом для такого большого изображения. Может ли кто-нибудь более осведомленный, чем я, в этом отношении указать мне в правильном направлении? Где/как я могу вытащить квантованные коэффициенты из jpeg-изображения?

ответ

0

Это откроет файл, вытащит яркость, массивы Cr и Cb и два массива квантования. Затем он квантует яркость, Cr и Cb в свои собственные переменные.

im = jpeg_read(image); 
% Pull image information - Lum, Cb, Cr 
lum = im.coef_arrays{im.comp_info(1).component_id}; 
cb = im.coef_arrays{im.comp_info(2).component_id}; 
cr = im.coef_arrays{im.comp_info(3).component_id}; 
% Pull quantization arrays 
lqtable = im.quant_tables{im.comp_info(1).quant_tbl_no}; 
cqtable = im.quant_tables{im.comp_info(2).quant_tbl_no}; 
% Quantize above two sets of information 
lqcof = quantize(lum,lum_qtable); 
bqcof = quantize(cb,cho_qtable); 
rqcof = quantize(cr,cho_qtable); 
0

похоже, что у вас есть необходимая информация. Из данных, которые вы предоставили, похоже, что набор инструментов JPEG декодирует коэффициенты и загружает их в «coef_arrays». Ваше изображение имеет горизонтальную подвыборку; это обозначается матрицами цветовых коэффициентов, составляющими половину ширины яркости. 3 массива представляют (Y, Cr, Cb). Существует 2 таблицы квантования, потому что одна для Y-компонента, а другая для компонентов Cr и Cb. Чтобы де-квантовать коэффициенты, вам нужно будет умножить правильный элемент массива quant_tables [] с каждым коэффициентом. Например, элемент [8, 10] вашего массива коэффициентов должен быть умножен на элемент [0,2] вашей квантовой таблицы. Массив квантования 8x8 повторно используется для каждого набора коэффициентов 8x8. Обычно они находятся в порядке zig-zag, но, похоже, ваш инструментарий выложил его как полный образ.