如何在opencv中使用离散余弦变换(DCT)

时间:2019-04-21 23:40:05

标签: opencv image-processing dct

dct在opencv中转换不正确。

imf = np.float32(block)
dct = cv2.dct(imf)

           [[154,123,123,123,123,123,123,136],
           [192,180,136,154,154,154,136,110],
           [254,198,154,154,180,154,123,123],
           [239,180,136,180,180,166,123,123],
           [180,154,136,167,166,149,136,136],
           [128,136,123,136,154,180,198,154],
           [123,105,110,149,136,136,180,166],
           [110,136,123,123,123,136,154,136]] 

使用上面显示的代码进行转换时,此图像块

[162.3,40.6,20.0 ... [30.5,108.4 ...

这应该是结果,

[1186.3,40.6,20.0 ... [30.5,108.4 ....

但是我找到了这个结果。对于示例块,https://www.math.cuhk.edu.hk/~lmlui/dct.pdf

1 个答案:

答案 0 :(得分:1)

DCT运行正常。得到的结果和期望的结果之间的差异是因为给出的特定示例实际上是在 M 而不是原始图像 I 上进行DFT的。如本文所示,在这种情况下, M = I-128 。您的示例中的唯一区别是您没有减去该部分,因此值都更大。在余弦或傅立叶变换中,第一个系数(有时称为“ DC偏移”)具有较高的值,因为您的图像值更大。但这就是为什么所有其他系数都相同的原因。如果您拍摄一张图像,然后简单地从整个图像中平均添加一些图像或从中减去一些图像,则除了第一个图像外,变换的系数将相同。

根据DCT的标准定义:

DCT definition

在这里您可以看到,对于 k = 0的第一个系数,在余弦函数中,您仅得到0,而cos(0)=1。因此, X_0 <如图所示,/ em>只是所有 x_n 值的总和。通常,此值可以通过与 N 相关的标度来缩放,以使其类似于平均值。这样做时,它与 X_0 项有关,即“ DC偏移”,您将看到它被描述为“信号的平均值”,换句话说,就是信号的距离从0开始。这对于将余弦/傅立叶变换系数作为一个余弦/傅立叶变换系数非常有用,因为它可以完全描述一个信号。所有其他 other 系数都描述了频率内容,因此它们并没有说明这些值与0之间的距离,但是第一个系数,即DC偏移量确实告诉您偏移!