【发布时间】:2016-04-25 17:46:31
【问题描述】:
我正在尝试使用 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)) 之后,与原始 a 矩阵相比,结果按常数因子缩放。
我想问是否有办法实现一组 2D dct/idct,这样在 idct(dct(a)) 操作之后我可以获得与输入相同的输出。
【问题讨论】:
-
一些琐事。你可以做
def dct2(a): dct(dct(a, axis=0), axis=1),而不是每次都转置你的数组。还有dct(..., type=3) == idct(...)。