Curvelet变换是最近图像处理较新的一种多尺度几何变换算法。其发展历程在短短十年间:
1999年,Candès和Donoho在Ridgelet变换的基础上提出了连续曲波(Curvelet)变换——第一代Curvelet变换中的Curvelet99。
2002年,Strack、Candès和Donoho提出了第一代Curvelet变换中的Curvelet02。
2002年,Candès等人提出了第二代Curvelet变换。
2005年,Candès提出了两种基于第二代Curvelet变换理论的快速离散实现方法:
1)非均匀空间抽样的二维FFT算法(Unequally-Spaced Fast Fourier Transform,USFFT);
2)Wrap算法(Wrapping-Based Transform)
与小波变换类似,Curvelet变换同样有其对应公式。Curvelet系数可由下式得到,即信号与小波函数内积:
这里j表示尺度,l表示方向,k表示位移。变换的推导以及原理是个十分复杂的过程,这需要有相当强的数学功底。
下面是对Curvelet变换的理解:
在时间域:Curvelet变换可以看做是一个椭圆以内积形式依次覆盖整个矩阵(指要变换的矩阵),这个图在很多地方都出现过。就我个人的理解详细解释下。
这里的椭圆就是Curvelet变换的窗口,相当于小波变换的基函数。其长轴与短轴关系为平方关系,其窗口大小视尺度j而定。与二维小波变换最大的优势在于Curvelet变换具有方向性。就是在尺度j下,椭圆做完整个矩阵的内积后(即依次覆盖完整个矩阵),可得到一组系数。然后将椭圆进行旋转适当的角度a再与矩阵做内积得到a角度的Curvelet系数。这样将椭圆进行多次旋转,每旋转一个角度就能得到尺度j一个方向的系数矩阵。在尺度j下做L次旋转,那么尺度j下就产生L个角度的系数矩阵。做完尺度j了接下来做尺度j+1下所有角度,方法同上。
如一幅图像上有一段弧,椭圆长轴沿着弧方向做覆盖内积得到的系数就大。这样就适合做图像边缘检测。
对于Curvelet变换的Matlab程序包curvlab可在网上下载。Curvlab包里有Curvelet的快速离散算法的Matlab程序和C++程序。
将其添加在Matlab里面:File -> set path
Add Folder 添加好curvlab里相关*. M文件的路径。
这时在Matlab里面使用Curvelet的快速变换及反变换函数:
fdct_usfft()
ifdct_usfft()
fdct_wrapping()
ifdct_wrapping()
在Matlab中Curvelet变换后返回的是一个cell矩阵。这个矩阵装着各个尺度、各个方向的系数值。
C= fdct_usfft(***);
C{j}表示一个cell矩阵,装着尺度j上所有方向的系数。
C{j}{l}就表示是一个二维矩阵,表示尺度j,方向l上的所有系数,
一般尺度越高,其对应的都是高频系数。