为什么matlab和libjpeg的DCT系数有差异

为什么matlab和libjpeg的DCT系数有差异,matlab,jpeg,libjpeg,dct,Matlab,Jpeg,Libjpeg,Dct,我需要处理JPEG图像的DCT系数,所以我使用libjpeg和matlab获得了这些值。问题是我得到了不同的价值观 我正在制作以下图像: libjpeg 我使用jpeg_read_系数获得虚拟数组,然后对其进行迭代并打印DCT值,对于第一个数组和第一个DCT块,我得到以下值: 9 8 10 6 3 1 0-6 0 1 0 0 0 0 6-1-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 这是文

我需要处理JPEG图像的DCT系数,所以我使用libjpeg和matlab获得了这些值。问题是我得到了不同的价值观

我正在制作以下图像:

libjpeg

我使用jpeg_read_系数获得虚拟数组,然后对其进行迭代并打印DCT值,对于第一个数组和第一个DCT块,我得到以下值:

9 8 10 6 3 1 0-6 0 1 0 0 0 0 6-1-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.525115.170418.483514.75008.046510.49331.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,而在原始图像中为8。我不知道我做错了什么,欢迎提出任何意见和建议

DCT是在YCbCr颜色空间上进行的,而不是您所怀疑的RGB颜色空间。您还需要意识到,与亮度相比,色度分量可能有4:2:0的子采样。我真的不知道libjpeg正在做什么来给你一个更权威的答案,但这是我现在可以建议的。这是一个好主意,我会尝试去看看!谢谢,JPEG以之字形顺序存储这些值,您上面的JPEG值看起来像是被量化了。@user3344003-很好!我忘了。请告诉我你有代码来迭代read_系数返回的系数值,我在网上找到的任何例子都不能正确地解释边缘情况和不同的样本因子,我拼命想确保我已经对返回的系数数组中的每一个值都进行了迭代,但是没有办法确保你已经进行了迭代,因为任何数组都没有大小,我也找不到libjpeg是否在任何数组的末尾填充了一堆垃圾