关于DCT的直观理解

2021年5月17日 / 14次阅读 / Last Modified 2021年5月17日
图像处理

大学时没有学过信号与系统,现在理解DCT有点困难。之前总结了一篇视频压缩基本概念,里面关于DCT的python计算是错的,在这篇进行修正!

DCT矩阵是正交的,DCT和IDCT是可逆的:

>>> a
array([[ 0.5  ,  0.5  ,  0.5  ,  0.5  ],
       [ 0.653,  0.271, -0.271, -0.653],
       [ 0.5  , -0.5  , -0.5  ,  0.5  ],
       [ 0.271, -0.653,  0.653, -0.271]])
>>> np.round(a @ a.T)
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0., -0.],
       [ 0.,  0.,  1.,  0.],
       [ 0., -0.,  0.,  1.]])
>>> x
array([[ 5, 11,  8, 10],
       [ 9,  8,  4, 12],
       [ 1, 10, 11,  4],
       [19,  6, 15,  7]])
>>> y = a @ x @ a.T
>>> y
array([[35.      , -0.08    , -1.5     ,  1.115   ],
       [-3.296   , -4.758192,  0.449   , -9.010094],
       [ 5.5     ,  3.025   ,  2.      ,  4.7     ],
       [-4.047   , -3.011894, -9.382   , -1.240008]])
>>> x2 = a.T @ y @ a
>>> x2
array([[ 5.00284962, 10.99880027,  8.00149973,  9.99880038],
       [ 8.99925   ,  7.99970011,  4.00164989, 11.99835   ],
       [ 1.00165   ,  9.99984989, 10.99880011,  4.00075   ],
       [18.99610038,  6.00209973, 14.99760027,  7.00224962]])
>>> np.round(x2)
array([[ 5., 11.,  8., 10.],
       [ 9.,  8.,  4., 12.],
       [ 1., 10., 11.,  4.],
       [19.,  6., 15.,  7.]])

Nice.....

在H.264之前,video coding标准没有规定具体的IDCT算法,只是要求了一个精度统计测试,这带来了可能 drift(mismatch between the decoded data in the encoder and decoder)。消除 drift 的方法就是要统一算法。DCT的计算有无理数,浮点数,有精度上的问题,同时浮点数计算对某些硬件会带来复杂性,因此H.264开始,提出了 integer transforms,用整数的加减和位移,来代替浮点数计算,降低复杂度。(论文:Low Complexity Transform and Quantization in H.264/AVC)

-- EOF --

本文链接:https://www.pynote.net/archives/3672

留言区

您的电子邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top