在 scipy 中,为什么 idct(dct(a)) 不等于 a?
In scipy why doesn't idct(dct(a)) equal to a?
我正在尝试使用 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 矩阵相比按常数因子缩放。
我想问问有没有办法实现一组2Ddct/idct这样在idct(dct(a))操作后我可以获得与输入相同的输出
您需要将 dct2
和 idct2
的缩放比例设置为 ortho
:
def dct2 (block):
return dct(dct(block.T, norm = 'ortho').T, norm = 'ortho')
此外,您不能期望值完全相同,但在一定误差范围内几乎相同:
np.allclose (a, idct2(dct2(a)))
我正在尝试使用 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 矩阵相比按常数因子缩放。
我想问问有没有办法实现一组2Ddct/idct这样在idct(dct(a))操作后我可以获得与输入相同的输出
您需要将 dct2
和 idct2
的缩放比例设置为 ortho
:
def dct2 (block):
return dct(dct(block.T, norm = 'ortho').T, norm = 'ortho')
此外,您不能期望值完全相同,但在一定误差范围内几乎相同:
np.allclose (a, idct2(dct2(a)))