【问题标题】:In scipy why doesn't idct(dct(a)) equal to a?在 scipy 中,为什么 idct(dct(a)) 不等于 a?
【发布时间】: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(...)

标签: python scipy dct


【解决方案1】:

您需要将dct2dct2idct2 的缩放设置为ortho

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

此外,您不能期望这些值完全相同,但在一定的误差范围内几乎相同:

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

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2021-09-10
    相关资源
    最近更新 更多