VC++实现对退化图像的恢复
2008-11-14 19:34:54 来源:WEB开发网由于恢复过程需要在频域进行,因此需要通过二维傅立叶变换将图像由空域变换到频域。二维的傅立叶变换较一维傅立叶变换要复杂的多,一般采取连续2次运用一维离散快速傅立叶变换的方法来实现,即先沿f(x,y)的每一个x对y求变换再乘以N得到F(x,v),完成第一步变换。然后再将得到的F(x,v)沿f(x,v)的每一个v对x求变换即可得到f(x,y)的最终变换F(u,v),这两步的数学表达式如下:
F(x,v)=N*[(1/N)* f(x,y)exp[-j2πvy/N]] (v=0,1,……,N-1)
F(u,v)=(1/N)* F(x,v)exp[-j2πux/N] (u,v=0,1,……,N-1)
类似也可以得出二维离散傅立叶变换逆变换用一维变换计算的表达式:
F(x,v)= F(u,v)exp[j2πux/N] (x,y=0,1,……,N-1)
f(x,y)=(1/N)* F(x,v)exp[j2πvy/N]] (y=0,1,……,N-1)
在分布进行一维傅立叶变换时,多采用"蝴蝶图"的快速算法(详见信号处理方面资料),其核心算法如下:
int N=(int)pow(2,M); file://N:序列长度(2的整数次幂)
ReverseOrder(A,N); file://对空间序列进行倒序
for(int i=1;i<=M;i++){
int b=(int)pow(2,(i-1));
for(int j=0;j<=(b-1);j++) {
float p=(float)(pow(2,(M-i))*j*2.0*PI/(float)N);
for(int k=j;k<=(N-1);){
float tr=(float)(A[k+b].Re*cos(p)+A[k+b].Im*sin(p)); file://计算复数运算A*U
float ti=(float)(A[k+b].Im*cos(p)-A[k+b].Re*sin(p));
A[k+b].Re=A[k].Re-tr; file://复数运算A-tr
A[k+b].Im=A[k].Im-ti;
A[k].Re+=tr; file://复数运算A+tr
A[k].Im+=ti;
k+=b*2;
}
}
}
更多精彩
赞助商链接