curvelet变换是基于傅里叶变换和小波变换的一种改进,其特点是有高度的各向异性,具有良好表达图形沿边缘的信息的能力,对于恢复形状的沿边缘的主要结构和抑制周边噪声有其特有优势。
其过程为
这和传统的dft及小波变换的处理过程类似,把图表中的curvelet换成dft和wavelet就可以了。
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 变换通过对radon 域内的每一个投影轴作一维小波分析,并由局部脊波分析得到多尺度结构。设参量θ是常数,平移量1是变量,脊波系数r,(a,b,θ)为
然后对每个分块用式(1,2)进行脊波分析。上面每步均可逆,经过逆变换可得重建图像。
通过radon域的多角度投影,curvelet变换明显加强了目标边界。同时由于curvelet变换是多尺度脊波变换的子集,它可以用投影切片定理来实现:一幅n×n的图像可表达成2n条径向线的积分结果,对每条线的投影数据计算一维小波变换,就得到脊波系数。这样的curvelet变换冗余因子达到16j+1。由于经典算法中分块的径向抽样角度恒定,直角坐标与极坐标的转换将导致在同一块内数据的非均匀抽样,当块中心附近的抽样值满足奈奎斯特抽样定理要求时,在块的边界部分将出现欠抽样;而当块边界部分满足抽样定理要求时,块中心部分数据将会过抽样,而且块的尺寸越大,非均匀抽样的影响就越明显。因此,在原算法中尽管离散curvelet变换的实现较简单,但是为了无失真地重构图像,保证块边界周围的抽样值足够多,它在块的中心部分实施了过抽样,因此耗时和冗余度也相应增大。
下面是对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上的所有系数,
一般尺度越高,其对应的都是高频系数。
curvelet matlab示例代码理解
1. fdct_wrapping
function c = fdct_wrapping(x, is_real, finest, nbscales, nbangles_coarse)
% fdct_wrapping.m - fast discrete curvelet transform via wedge wrapping - version 1.0
%
% inputs
% x m-by-n matrix 输入为mxn的矩阵
%
% optional inputs
% is_real type of the transform 转化的类型
% 0: complex-valued curvelets 复数值的曲波变化
% 1: real-valued curvelets 实数值的曲波变化
% [default set to 0] 默认设置为0
% finest chooses one of two possibilities for the coefficients at the
% finest level: 选择一种表示方式计算最优级的系数
% 1: curvelets 曲波变化
% 2: wavelets 小波变化
% [default set to 2] 默认设置为2
% nbscales number of scales including the coarsest wavelet level
% 包含最粗小波级在内的伸缩数
% [default set to ceil(log2(min(m,n)) - 3)]
% nbangles_coarse
% number of angles at the 2nd coarsest level, minimum 8,
% 第二粗糙级的角度数,最小为8
% must be a multiple of 4. [default set to 16]
% 必须为4的倍数,默认为16
% outputs
% c cell array of curvelet coefficients.
% c{j}{l}(k1,k2) is the coefficient at
% - scale j: integer, from finest to coarsest scale,
% 从最佳尺度到最粗尺度
% - angle l: integer, starts at the top-left corner and
% increases clockwise,
% 从左上角开始顺时针增长
% - position k1,k2: both integers, size varies with j
% and l.
% if is_real is 1, there are two types of curvelets,
% ‘cosine’ and ‘sine’。 for a given scale j, the ‘cosine’
% coefficients are stored in the first two quadrants (low
% values of l), the ‘sine’ coefficients in the last two
% quadrants (high values of l)。
%
% see also ifdct_wrapping.m, fdct_wrapping_param.m
%
% by laurent demanet, 200412345678910111213141516171819202122232425262728293031323334353637383940414243
2. dct基本示例代码理解
% fdct_wrapping_demo_basic.m -- displays a curvelet both in the spatial and frequency domains.
m = 1024;
n = 1024;
x = zeros(m,n);
%forward curvelet transform
disp(‘take curvelet transform: fdct_wrapping’);
tic; c = fdct_wrapping(x,0,2,8,64); toc; %tic toc配合使用测量程序运行时间
%specify one curvelet
s = 7; %从1开始增大,空间域变细,频率域变粗
w = 10;%从1(左上角)开始增大,空间域顺时针旋转,与笛卡尔corona相对应
[a,b] = size(c{s}{w});%尺度为s,方向为w,的矩阵大小
a = ceil((a+1)/2);
b = ceil((b+1)/5);
c{s}{w}(a,b) = 1; %该尺度、方向中心位置元素设置为1
%adjoint curvelet transform
disp(‘take adjoint curvelet transform: ifdct_wrapping’);
tic; y = ifdct_wrapping(c,0); toc;%进行反曲波变化,得到空间域图像
%display the curvelet
f = ifftshift(fft2(fftshift(y)));
subplot(1,2,1); colormap gray; imagesc(real(y)); axis(‘image’); 。。。
title(‘a curvelet: spatial viewpoint’);
subplot(1,2,2); colormap gray; imagesc(abs(f)); axis(‘image’); 。。。
title(‘a curvelet: frequency viewpoint’);
%get parameters
[sx,sy,fx,fy,nx,ny] = fdct_wrapping_param(c);
华为投资8亿美元将在巴西建设5G设备工厂并设置研究机构
下半年最梦幻的四部手机:iphone8、三星note8、小米mix2和华为mate10,你打算入手哪一部?
Arm NN:在移动和嵌入式设备上无缝构建和运行机器学习应用程序
有毒气体报警器应该如何使用
AMD RX 6000系列显卡今天终于开始解禁上市
浅析curvelet变换原理与理解
低功耗MSP430数据采集系统的USB接口设计
中国信通院发布《中国无线经济发展研究报告(2022年)》
如何帮助提高CPU分支跳转的正确率
计算机寄存器和存储器
未来五年,整个ToB市场仍然将每年保持35%以上增长速度
颠覆5G技术的是一项怎样的技术
为什么pcb抄板饱受争议
SK海力士收购英特尔NAND闪存及存储业务
如何在dart实例化类class
区块链能解决农业领域的许多问题
射频前端模组化之路怎么走?
浅谈PCB设计需要考虑多个变量的性能问题
FPGA开发要掌握的六大基础知识(3)
在CES 2018上 Navya发布纯电动汽车并具备了高阶自动驾驶能力