【问题标题】:how use Discrete cosine transform(DCT) in opencv如何在opencv中使用离散余弦变换(DCT)
【发布时间】:2019-04-22 08:26:59
【问题描述】:

dct 在 opencv 中不能正确转换。

imf = np.float32(块)
dct = cv2.dct(imf)

           [[154,123,123,123,123,123,123,136],
           [192,180,136,154,154,154,136,110],
           [254,198,154,154,180,154,123,123],
           [239,180,136,180,180,166,123,123],
           [180,154,136,167,166,149,136,136],
           [128,136,123,136,154,180,198,154],
           [123,105,110,149,136,136,180,166],
           [110,136,123,123,123,136,154,136]] 

这块图像,当用上面显示的代码转换时

[162.3 ,40.6, 20.0... [30.5 ,108.4...

这应该是结果,

[1186.3, 40.6, 20.0... [30.5, 108.4 ....

但我找到了这个结果。对于示例块,https://www.math.cuhk.edu.hk/~lmlui/dct.pdf

【问题讨论】:

    标签: opencv image-processing dct


    【解决方案1】:

    DCT 工作正常。你得到的和你期望的之间的区别在于,给出的特定示例实际上是在 M 上而不是在原始图像 I 上进行 DFT。在这种情况下,如论文所示,M = I - 128。您的示例中唯一的区别是您没有减去该部分,因此值都更大。在余弦或傅立叶变换中,第一个系数(有时称为“DC 偏移”)具有更高的值,因为您的图像值更大。但这就是为什么所有其他系数都相同的原因。如果你拍摄一张图像,你只是简单地从整个图像中添加一些或减去一些,变换的系数将是相同的,除了第一个。

    来自DCT的标准定义:

    您可以在此处看到,对于 k = 0 的第一个系数,在余弦函数内,您只得到 0,并且 cos(0) = 1。因此,X_0 只是所有 x_n 值的总和。一般来说,这个值可能会被与 N 相关的东西缩放,因此它类似于 平均值。这样做时,它与 X_0 术语有关,即“直流偏移”,您将看到它被描述为“信号的平均值”,或者换句话说,信号的距离从 0 开始。将其作为余弦/傅里叶变换系数之一非常有用,因为它可以完全描述信号;所有其他系数都描述了频率内容,因此它们没有说明值与 0 的距离,但第一个系数,即 DC 偏移,确实告诉您偏移!

    【讨论】:

    • 好的,谢谢,但是有什么理由吗?或者为什么要减去 128?
    猜你喜欢
    • 1970-01-01
    • 2015-06-06
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多