image and video processing听课笔记(二)

来源:互联网 发布:数据降维 量子多体 编辑:程序博客网 时间:2024/05/21 10:42

上一节学习了图像压缩的Huffman编码原理,本节主要理解DCT转换在JPEG的使用原理。

                                                                 

根据JPEG流程图,首先构造分割图像的子块,每个子块是nxn的二维数组。注意:JPEG不辨识颜色,但是算法可以将RGB三个通道分离之后分别进行分块。这样做是很好的,可是三个通道往往具有很多相关性,所以JPEG采用了YCbCr来代替RGB。

                                       

假设n=8,此时需要转换的就是分离为Y,Cb,Cr三通道的许多8*8的子块。

MSE(Root Mean Square Error)这是衡量压缩算法好坏(误差)的一种标准:原始图像和解压图像的均方误差统计。

                         

如何选择一个能尽量减少图像信息冗余度,而且解压后与原始图像误差小的压缩算法呢?课程简单介绍了KLT(Karhunen-Loevetransform),这是一种数据变换与分析的方式,将多维数据转换成低维,并且保留主要的信息。通常用于数据压缩和PCA,想知道为什么KLT可以,请参考链接。

而一副图像可以有很高的分辨率,体积可以很大,将全幅像素做KLT变换太低效了,所以才分成了n*n(课件假设n=8)的block做KLT转换。假设原始图像被分割成n*n的blocks,用f(x,y)来代表,转换后仍然是n*n的,用T(u,v)来代表,那么转换和逆转换系数用r(x,y,u,v),s(x,y,u,v)来表示,整个运算过程如下:

                         

DCT和KLT变换类似,都是时(空)域到频域的转换,只是DCT变换不会出现复数,且r=s。它的正规化公式如下

                    DCT

r和s是和图像相关的basic function,课程举例n=4的情况,固定u和v可以得到16个basic functions,相当于对原始的n*n的block进行频域分解,左上角为低频部分,右下角为高频部分,做DCT就是为了保留多数低频部分,忽略适当高频(可以通过量化过程实现通低频滤高频,量化表的选择根据压缩比例来确定),通过这些basic的线性组合转换后,得到n*n的数据块仍然可以表示原始图像。

                                   

取n=8,用DCT转换,保留前12.5%的转换系数得到如下结果,左边是逆转换后的结果图,右边是与原始图的误差。

                              

课程还解释了为什么要用DCT,而没有使用Fourier。主要有两个原因:1、某些特殊情况下(比如图像符合markov链假设时)DCT实际上做的就是Fourier的工作;2、Fourier和DCT对信号都有周期性假设,如下图所示,第一行是Fourier的,第二行是DCT的,可以看出,DCT对两个block交接的边界有更合理的假设(是连续的)。

                         

那么在做DCT之前应该如何选择block的大小呢?这可能需要根据图像分辨率大小来确定,抽象的来说需要做一个折中。

如下图,从左到右分别选择n=2,4,8的block

                       

得到的逆转换后图像越来越清晰,因为所用的信息越来越多。那是不是n越大越好,甚至用上图像的全部像素?并不是。。如果n取太大,会降低计算效率,而且也可能违反Markov的相关性假设。

关于压缩图像的理论学习(推荐参考这篇博客,继续学习)就至此啦,又要开始码代码了呢再见



0 0
原创粉丝点击