在scipy为什么不idct(dct(a))等于a?

时间:2016-01-20 02:37:38

标签: python scipy dct

我正在尝试使用python实现JPEG压缩。当我尝试对tiff图像应用DCT,量化,IDCT过程时,我发现了一些奇怪的scipy.fftpack.dct / idct。

由于scipy包中只有1D dct / idct,我这样做是为了2D dct

import numpy as np
from scipy.fftpack import dct, idct

def dct2(block):
    return dct(dct(block.T).T)

def idct2(block):
    return idct(idct(block.T).T)

我使用简单的3x3矩阵测试了2D dct / idct。我希望在这个测试用例中得到一个True矩阵。

a = np.random.randint(0,255,9).reshape(3,3)
print a == idct2(dct2(a))

然而事实证明,在idct2(dct2(a))之后,结果通过与原始矩阵相比的常数因子进行缩放。

我想问一下是否有办法实现一组2D dct / idct,这样在idct(dct(a))操作之后我可以获得与输入相同的输出。

1 个答案:

答案 0 :(得分:9)

您需要为orthodct2设置缩放至idct2

def dct2 (block):
  return dct(dct(block.T, norm = 'ortho').T, norm = 'ortho')

另外,您不能指望这些值完全相同,但在某些误差范围内几乎相同:

np.allclose (a, idct2(dct2(a)))