我需要操纵JPEG图像的DCT系数,所以我使用 libjpeg 和 matlab 获得了值。问题是我得到了不同的价值观。
我正在处理以下图片:
的libjpeg
我使用jpeg_read_coefficients
来获取虚拟数组,然后迭代它并打印DCT值,对于第一个数组和第一个dct块,我得到了以下值:
9 8 10 6 3 1 1 0 -6 0 1 0 0 0 0 0 6 -1 -1 0 0 0 0 0 5 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这是如文档中所述的直线顺序的系数。
Matlab的
为了获得系数,我读取了图像并在其第一个8X8块上运行dct2
函数:
A = imread('test2.jpg');
dct2(A(1:8,1:8,1));
并提出以下值(对于RGB颜色空间):
404.7500 -2.5251 15.1704 18.4835 14.7500 8.0465 10.4933 1.6169 -50.4069 0.4634 3.2328 -0.3498 -0.6745 0.9465 0.4599 0.5694 16.0546 -1.7709 -3.3624 -0.0164 0.2310 -0.9791 -0.1250 -1.0587 14.7190 0.9301 -0.0935 0.2866 -0.5779 -0.2573 1.2260 0.1872 15.5000 0.4715 -1.2505 -0.9827 -0.0000 0.1208 0.2474 1.4739 9.4079 0.5931 -0.3263 0.0659 0.4536 0.2866 -0.3059 0.3997 10.6682 0.2906 0.1250 -0.6038 -0.0957 -0.0583 -0.8876 -1.2576 0.7863 -0.1074 -0.7177 -0.4161 0.9382 -0.6301 -0.7815 0.4634
YCbCr色彩空间的那些值:
1.0e + 03 *( 1.0305 0.0142 0.0168 0.0151 0.0130 0.0071 0.0085 0.0003 -0.0100 0.0002 0.0029 -0.0001 -0.0002 0.0006 -0.0004 -0.0005 0.0151 -0.0024 -0.0025 -0.0000 0 -0.0002 -0.0005 -0.0000 0.0132 -0.0000 -0.0004 -0.0007 -0.0008 -0.0008 -0.0001 0.0011 0.0140 -0.0004 0.0003 -0.0010 0.0005 -0.0002 0.0001 -0.0004 0.0086 0.0001 -0.0000 0.0002 0.0004 0.0004 -0.0003 0.0001 0.0078 -0.0002 -0.0005 -0.0000 0 -0.0003 -0.0000 -0.0005 0.0003 -0.0000 -0.0003 0.0003 0.0012 -0.0003 -0.0002 -0.0005)
我的猜测,因为我无法用libjpeg文档批准它,因为系数是针对YCbCr空间的。 据我所知,libjpeg中的值是在量化误差之后,第一个DC分量是由差值解码所以让我们看看第二个分量,它的量化常数是2(从原始数据中用十六进制转储检索)所以区别最多可以是2。
Matlab计算中第二个系数的计算DCT值为14.2,而原始图像中的计算DCT值为8.我无法弄清楚我做错了什么,欢迎任何想法和建议。