首先,我承认这是一个家庭作业问题。但是,我好像被卡住了。我需要使用Phil Sallee's JPEG Toolbox从jpeg图像中获取所有量化系数(表格底部列出的链接在"更新"标题下)(我将构建直方图,但是一旦我能得到我需要的数据,我就可以处理这部分。我有一个大约5 MB的JPEG图像,当我通过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图像中提取量化系数?
答案 0 :(得分:0)
您似乎拥有所需的信息。根据您提供的数据,看起来JPEG工具包会对系数进行解码并将其加载到“coef_arrays”中。你的图像有水平子采样;这由颜色系数阵列表示为亮度宽度的一半。 3个阵列代表(Y,Cr,Cb)。有2个量化表,因为一个用于Y分量,另一个用于Cr和Cb分量。为了对系数进行去量化,您需要将quant_tables []数组的正确元素与每个系数相乘。例如,系数数组的元素[8,10]应乘以quant_table的元素[0,2]。 8x8量化阵列在每个8x8系数集中重复使用。通常这些都是Z字形顺序,但看起来你的工具包已经像一个完整的图像那样铺设了它。
答案 1 :(得分: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);