2016-01-20 107 views
2

我想用python实现JPEG压缩。当我尝试应用DCT,量化,IDCT过程中的tiff图像时,我发现scipy.fftpack.dct/idct有些奇怪。在scipy为什么不idct(dct(a))等于一个?

由于存在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) 

我测试使用一个简单的3×3矩阵的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))操作后,我可以得到与输入相同的输出。

+0

[Scipy的fftpack dct和idct]的可能重复(http://stackoverflow.com/questions/14325795/scipys-fftpack-dct-and-idct) – Reti43

+0

一些琐事。而不是每次调换数组,您可以执行'def dct2(a):dct(dct(a,axis = 0),axis = 1)'。和'dct(...,type = 3)== idct(...)'。 – Reti43

回答

3

您需要缩放两个dct2idct2设置为ortho

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

也,你不能指望值是完全一样的,但一些误差范围内几乎相同:

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