2021年5月17日 / 58次阅读 / 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
前一篇:妙用python函数的默认可变参数
后一篇:HEVC中的Z-Scan
©Copyright 麦新杰 Since 2019 Python笔记