我正在尝试使用python实现JPEG压缩。当我尝试将DCT、量子化、IDCT处理应用于tiff图像时,我发现了一些奇怪的东西,比如spy.fftpac.dct/idct。
由于在for包中只有一维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。我本来希望用这个测试用例得到一个真实的矩阵。
a = np.random.randint(0,255,9).reshape(3,3)
print a == idct2(dct2(a))
然而,结果表明,在idct2(dct2(a))之后,与原始的a矩阵相比,用常数因子对结果进行了缩放。
我想问一下,是否有一种方法来实现一组2D dct/idct,这样在idct(dct(a))操作之后,我就可以得到与输入相同的输出。
发布于 2016-02-15 21:18:53
您需要将dct2
和idct2
的缩放设置为idct2
def dct2 (block):
return dct(dct(block.T, norm = 'ortho').T, norm = 'ortho')
此外,不能期望值完全相同,但在一定的误差范围内几乎相同:
np.allclose (a, idct2(dct2(a)))
https://stackoverflow.com/questions/34890585
复制相似问题