VC++实现对退化图像的恢复
2008-11-14 19:34:54 来源:WEB开发网傅立叶逆变换的同傅立叶变换比较相似,只是在计算exp[j2πvy/N]时同正变换有符号的区别,以及在计算完成后逆变换需要将值除以N,因此不难写出一维傅立叶逆变换的实现代码。在进行二维傅立叶变换将图像由空域变换到频域之前,首先需要通过补0的手段将点数非2的整数次幂的非正方型网格采样构造为一个长宽均为2的整数次幂的正方型网格:
int WM=(int)(log(W)/log(2)+1.0f); file://计算图像宽应为2的多少次幂
int HM=(int)(log(H)/log(2)+1.0f); file://计算图像高应为2的多少次幂
WM=HM=max(WM,HM); file://取二者大值
int WN=(int)pow(2,WM); file://构造网格宽度
int HN=(int)pow(2,HM); file://构造网格高度
for{int i=0;i;for(int j=0;j if(i U[i*WN*3+j].Re=D[i*W*3+j]; file://D为图像序列
U[i*WN*3+j].Im=0.0f;
}else file://缺位补0
U[i*WN*3+j].Re=U[i*WN*3+j].Im=0.0f;
}
}
预处理完毕后,可对构造网格的每一列分别进行一维快速傅立叶变换,并将结果存放在原位置,结果乘以N,完成第一步的转换,求得F(x,v):
for(i=0;i for(int j=0;j UH[j].Re=U[j*WN*3+i].Re;
UH[j].Im=U[j*WN*3+i].Im;
}
DFT_FFT(UH,HM); file://对UH进行快速离散傅立叶变换
for(j=0;j U[j*WN*3+i].Re=HN*UH[j].Re; file://N=HN
U[j*WN*3+i].Im=HN*UH[j].Im;
}
}
随即对构造网格的每一行进行傅立叶变换,得到最终的变换结果F(u,v):
for(i=0;i for(int k=0;k<3;k++){ file://对24位位图的R、G、B三分量均各自进行变换
for(int j=0;j UW[j].Re=U[i*WN*3+j*3+k].Re;
UW[j].Im=U[i*WN*3+j*3+k].Im;
}
DFT_FFT(UW,WM); file://对UW序列进行快速离散傅立叶变换
for(j=0;j U[i*WN*3+j*3+k].Re=UW[j].Re;
U[i*WN*3+j*3+k].Im=UW[j].Im;
}
}
}
更多精彩
赞助商链接