Как я могу найти квантованные коэффициенты из MATLAB, используя код Салли? - PullRequest
1 голос
/ 01 февраля 2012

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

  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?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Откроется файл, вытащены массивы яркости, 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 голосов
/ 01 февраля 2012

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

...