首页 > 生活

图像算法中的二维傅立叶变换(DCT)及蝶形算法(butterfly algorithm)

更新时间:2025-05-15 17:09:08 阅读: 评论:0

今天讲个比较基础的知识,图像算法中的二维傅立叶变换(DCT)及蝶形算法(butterfly algorithm)。

关于离散2维Fourier的基础知识这里就不讲了,需要的可以到这里看一下,

fouri小短裙er.eng.hmc.edu/e101/lectures/Image_Processing/node6.html

我们这里从其展开式开始,解释傅立叶变换在图像压缩(如JPEG)中的算法原理和方法。因为傅立叶变换在图像视频压缩中比重还是比较大的,而快速算法在现代计算机科学中又是重中之重。

注意,图像(也包括视频,因为视频是由一帧帧的图像组成)在处理中,并不是整体进行傅立叶变换,而往往会被分成小块处理,最多的情况是4X4的像素块,或8X8的像素块。分成这样小块处理的原因也是因为要达到计算量和质量的平衡。

下面我们以4x4的像素块为例,分析一下二维傅立叶变换(DCT)及蝶形算法(butterfly algorithm)的原理和过程,

考虑

\left\{ \begin{array}{lr} \frac{1}{2}Cos(0) = \frac{1}{2}\\ \\ \frac{1}{2}Cos(\frac{2\pi}{8}) = \frac{1}{2\sqrt{2}} \\ \\ \frac{1}{2}Cos(\frac{3\pi}{8}) = \frac{1}{2}Sin(\frac{\pi}{8})\\ \\ \frac{1}{2}Cos(\frac{5\pi}{8}) = -\frac{1}{2}Sin(\frac{\pi}{8})\\ \\ \frac{1}{2}Cos(\frac{7\pi}{8}) = -\frac{1}{2}Cos(\frac{\pi}{8}) \end{array} \right\}

我们可以得到这样一个4x4矩阵的DCT变换矩阵,

\left( \begin{array}{cccc} \frac{1}{2} & \frac{1}{2} & \frac{1}{2} & \frac{1}{2} \\ \\ \frac{1}{2} \cos \left(\frac{\pi }{8}\right) & \frac{1}{2} \sin \left(\frac{\pi }{8}\right) & -\frac{1}{2} \sin \left(\frac{\pi }{8}\right) & -\frac{1}{2} \cos \left(\frac{\pi }{8}\right) \\ \\ \frac{1}{2 \sqrt{2}} & -\frac{1}{2 \sqrt{2}} & -\frac{1}{2 \sqrt{2}} & \frac{1}{2 \sqrt{2}} \\ \\ \frac{1}{2} \sin \left(\frac{\pi }{8}\right) & -\frac{1}{2} \cos \left(\frac{\pi }{8}\right) & \frac{1}{2} \cos \left(\frac{\pi }{8}\right) & -\frac{1}{2} \sin \left(\frac{\pi }{8}\right) \\ \end{array} \right)

如果你从傅立叶的标准定义去推导的话,得到的就应该是这个结果。用mathematica的命令FourierDCTMatrix[4],得到的也是这个样子的表达式。然而大多数的文献不会写在这种形式,第一个系数往往会乘以一个参数 \frac{1}{\sqrt{2}} ,所以展开式也往往不会写成标准形式,而是会写成这样(请注意那个系数C),

F_{uv} = C \sum_{i=0}^{N-1}\sum_{j=0}^{N国际交换生-1} f_{ij} \cos \frac{(2i+1)u\pi}{2N} \cos \frac{(2j+1)v\pi}{2N}

C= \left\{ \begin{array}{lr} \frac{1}{2} \quad (x=0) \\ \\ 1 \quad (x \ne 0) \end{array} \right\}

更多的还会把所有的系数另外再乘以一个(这里我们不考虑) \frac{1}{\sqrt{2}} = \frac{2}{\sqrt{N}} \quad (N=4) 。这样做的目的是使得矩阵可以完全正交,即满足: \textbf{W}^T\textbf{W} = \textbf{W}\textbf{W}^T = \textbf{I} ,从而方便处理和减少计算量。不过这样做就不标准了,为有什么影响呢?我们看一下常数C的物理意义。

这个常数项直接决定直流系数的大小,比如说在图片的亮度处理中就是亮度的起始点,也就是对应亮度起伏为0的那个幅度。在图大抉择像处理中,这种起始点的变化或比例上的缩放是随处可见的,通常这种变化会在后面的量化中加以考虑(这里涉及的内容比较多,进一步的理解建议参考wiki百科,里面列出了不少相关参考资料:en.wikipedia/wiki/Discrete_cosine_transform ),而且,我们往往需要得到的是图像中的起伏和相对变化的情况,所以对处理的特征结果影响不大。

这样的话,我们就不用顾及形式,可以直接考虑一般情况下使用的DCT变换矩阵,这也是大多数资料里面列出的,对图像变换所采用的形式,

\left( \begin{array}{cccc} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & \fr小荷才露尖尖角ac{1}{\sqrt{2}} \\ \\ 室内消火栓 \frac{\cos \left(\frac{\pi }{8}\right)}{\sqrt{2}} & \frac{\sin \left(\frac{\pi }{8}\r农村小洋楼ight)}{\sqrt{2}} & -\frac{排卵时间\sin \left(\frac{\pi }{8}\right)}{\sqrt{2}} & -\fr杭州我爱我家ac{\cos \left(\frac{\pi }{8}\right)}{\sqrt{2}} \\ \\ \frac{1}{2} & -\frac{1}{2} & -\frac{1}{2} & \frac{1}{2} \\ \\ \frac{\sin \left(\frac{\pi }{8}\right)}{\sqrt{2}} & -\frac{\cos \le环境影响评价工程师报考条件ft(\frac{\pi }{8}\right)}{\sqrt{2}} & \frac{\cos \left(\frac{\pi }{8}\right)}{\sqrt{2}} & -\frac{\sin \left(\frac{\pi }{8}\right)}{\sqrt{2}} \\ \end{array} \right)

令 

\left\{ \begin{array}{lr} a = \frac{1}{\sqrt{2}}Cos(0) = \frac{1}{\sqrt{2}}\\ 陈克礼\\ b = \frac{1}{\sqrt{2}}Cos(\frac{\pi}{8})\\ \\ c = \frac{1}{\sqrt{2}}Cos(\frac{3\pi}{8}) = \frac{1}{\sqrt{2}}Sin(\frac{\pi}{8}) \end{array} \right\}

上面的矩阵就可以简化为下面这种形式,

\textbf{A} = \left( \begin{array}{cccc} a & a & a & a \\ \\ b & c & -c & -b \\ \\ a & -a & -a & a \\ \\ c & -b & b & -c \e汽车椅套nd{array} \right)

不难证明(参考[1]),对一个任一个4x4的矩阵X,我们可以把运算写成下面这样的形式,

\textbf{A}^T \textbf{X} \textbf{A}^T = \textbf{X} \bullet \left( \begin{array}{cccc} a^2 & \frac{ab}{2} & a^2 & \frac{ab}{2} \\ \\ \frac{ab}{2} & \frac{b^2}{4} & \frac{ab}{2} & \frac{b^2}{4} \\ \\ a^2 & \frac{ab}{2} & a^2 & \frac{a异国恋b}{2} \\ \\ \frac{ab}{2} & \frac{b^2}{4} & \frac{ab}{2} & \frac{b^2}{4} \end{array} \right) = \textbf{C}_f \textbf{X} \textbf{C}_f^T \bullet \textbf{E}_f

其中, \bullet 表示点乘,

\textbf{C}_f = \left( \begin{array}{cccc} 1&1&1&1 \\ \\ 2&1&-1&-2\\ \\ 1&-1&-1&1\\ \\ 1&-2&2&-1 \end{array} \right)

\textbf{E}_f = \left( \begin{array}{cccc} a^2 & \frac{ab}{2} & a^2 & \frac{ab}{2} \\ \\ \frac{ab}{2} & \frac{b^2}{4} & \frac{ab}{2} & \frac{b^2}{4} \\ \\ a^2 & \frac{ab}{2} & a^2 & \frac{ab}{2} \\ \\ \frac{ab}{2} & \frac{b^2}{4} & \frac{ab}{2} & \frac{b^2}{4} \end{array} \right)

可以看出,此时在编码的过程中只需要计算 \textbf{C}_f \textbf{X} \textbf{C}_f^T ,这些系数简单, \textbf{E}_f 也完全可以事计算好,这样一来,运算量就大大降低了,速度会很快,我相信现在的计算机直接处理应该是没有问题的。不过,通过适当的变换,我们还能得到更快的计算方式,这就是知名蝶形算法(butterfly algorithm)。

因为矩阵全部扩展开来会比较大,我们先考虑其中一列,

\left( \begin{array}{cccc} 1&1&1&1 \\ \\ 2&1&-1&-2\\ \\ 1&针刺伤-1&-1&1\\ \\ 1&-2&2&-1 \end{array} \right) \left( \begin{array}{cccc} x_{01} \\ \\ x_{11} \\ \\ x_{21} \\ \\ x_{31} \end{array} \right) = \left( \begin{array}{cccc} (x_{01}+x_{31})+ (x_{11}+x_{21}) \\ \\ 2(x_{01}-x_{31}) + (x_{11}-x_{21}) \\ \\ (x_{01}+x_{31}) - (x_{11}+x_{21})\\ \\ (x_{01}-x_{31}) - 2 (x_{11}-x_{21}) \end{array} \right)

不难发现,其右边小括号内的每一组合项都出现了2次,我把这4个组合项列在下面

\begin{array}{cccc} (x_{01}+x_{31})\\ (x_{婚戒价格01}-x_{31})\\ (x_{11}+x_{21})\\ (x_{11}-x_{21}) \end{array}

根据上面这个原理得来的结果,就是蝶形算法。其中心思想就是,把那些能组合起来的结果尽量先组合起来,得到一个组合值,当后面出现这样的同样组合时,就不必再去计算这个组合值了;从而避免了同样组合的重复计算。

下面我们解释一下常见到的4x4的蝶形算法图,令

\textbf{X} = \left( \begin{array}{cccc} \text{x0} & \text{x1} & \text{x2} & \text{x3} \\ \text{x4} & \text{x5} & \text{x6} & \text{x7} \\ \text{x8} & \text{x9} & \text{x10} & \text{x11} \什么叫公关\ \text{x12} & \text{x13} & \text{x14} & \text{x15} \\ \end{array} \right)

这次把 \textbf{C}_f \textbf{X} \textbf{C}_f^去皱纹的最好方法T 全部展开,得到下面的形式,注意一行就是一个4x4矩阵中的元素,

第1行:

{{x0+x1+x10+x11+x12+x13+x14+x15+x2+x3+x4+x5+x6+x7+x8+x9,

x1-x10+x13-x14-x2+x5-x6-2 (x11+x15+x3+x7)妙心+2 (x0+x12+x4+x8)+x9,

x0-x1-x10+x11+x12-x13-x14+x15-x2+x3+x4-x5-x6+x7+x8-x9,

x0-x11+x12-x15-x3+x4+2 (x10+x14+x2+x6)-x7+x8-2 (x1+x13+x5+x9)},

第2行:

{2 x0+2 x1-x10-x11-2 x12-2 x13-2 x14-2 x15+2 x2+2 x3+x4+x5+x6+x7-x8-x9,

2 x1+x10-2 x13+2 x14-2 x2+x5-x6-2 (-x11-2 x15+2 x3+x7)+2 (2 x0-2 x12+x4-x8)-x9,

2 x0-2 x1+x10-x11-2 x12+2 x13+2 x14-2 x15-2 x2+2 x3+x4-x5-x余额宝有风险吗6+x7-x8+x9,

2 x0+x11-2 x12+2 x15-2 x3+x4+2 (-x10-2 x14+2 x2+x6)-x7-x8-2 (2 x1-2 x13+x5-x9)},

第3行:

{x0+x1-x10-x11+x12+范伟金马奖x13+x14+x15+x2+x3-x4-x5-x6-x7-x8-x9,

x1+x10+x13-x14-x2-x5+x6-2 (-x11+x15+x3-x7)+2 (x0+x12-x4-x8)-x9,

x0-x1+x10-x11+x12-x13-x14+x15-x2+x3-x4+x5+x6-x7-x8+x9,

x0+x11+x12-x15-x3-x4+2 (-x10+x14+x2-x6)+x7-x8-2 (x1+x13-x5-x9)},

第4行:

{x0+x1+2 x10+2 x11-x12-x13-x14-x15+x2+x3-2 x4-2 x5-2 x6-2 x7+2 x8+2 x9,

x1-2 x10-x13+x14-x2-2 x5+2 x6-2 (2 x11-x15+x3-2 x7)+2 (x0-x12-2 x4+2 x8)+2 x9,

x0-x1-2 x10+2 x11-x12+x13+x14-x15-x2+x3-2 x4+2 x5+2 x6-2 x7+2 x8-2 x9,

x0-2 x11-x12+x15-x3-2 x4+2 (2 x10-x14+x2-2 x6)+2 x7+2 x8-2 (x1-x13-2 x5+2 x9)}}

对应的蝶形算法的图形是这样的:

怎么看图?

比如说对X(0),有4条路径指向X(0), 也就是图中标注红色的(1),(2),(3),(4),

路径(1) +路径 (2) => [(x0+x8)+(x4+x12)]

同理,路径(3) => [(x2+x10) + (x6+x14)]

算法同上,可得路径(4) => {[(x1+x9)+(x5+x13)]+[(x3+x11)+(x7+x15)]}

那么这4条路径的和,就是最终的X(0)=路径(1) +路径 (2) +路径(3)+路径(4)。

从图中不难看出,后面的计算可以直接采用前面计评价诸葛亮算的结果,一级一级地形成组合值的依赖关系,从而大大减少运算量。

参考资料

[1] Optimization of 4x4 Integer DCT in H.264/AVC Encoder ,Charles S. Lubobya1, Mqele M. Dlodlo1, Gerhard De. Jager1 and Keith L.Ferguson2

本文发布于:2023-05-25 17:52:05,感谢您对本站的认可!

本文链接:http://www.ranqi119.com/ge/85/128287.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:傅立叶   算法   蝶形   图像   DCT
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26|友情:优美诗词|电脑我帮您|扬州装修|369文学|学编程|软件玩家|水木编程|编程频道