问题描述
我是用java进行fft变换。参考了一些资料,实现了二维的fft。比如说输入二维矩阵输出的结果和和参考的结果一样。。但是我有个问题不明白,假如是一一幅图像作为二维矩阵进行fft变换,变换前的矩阵是每个像素的灰度值么?变换以后的复数矩阵怎么把它显示成该图像的频谱呢?贴出核心代码大家给个说明吧谢谢就是resPixArray返回的复数数组怎么把它显示成输入图像的频谱???//一维FFT变换publicvoidFFT(){//doublea=Math.log10(complex.length-1)/Math.log10(2);//doubleb=Math.pow(2,(int)a+1);intN=complex.length;Complexexp[]=newComplex[N];Complextemp=newComplex();intM=(int)(Math.log10(N)/Math.log10(2));intB=0,P=0;for(inti=0;i<N;i++){exp[i]=newComplex(Math.cos(i*2.0*Math.PI/N),-Math.sin(i*2.0*Math.PI/N));}changeOrder(N);for(intL=1;L<=M;L++){B=(int)Math.pow(2,(L-1));for(intj=0;j<=B-1;j++){P=j*(int)Math.pow(2,(M-L));for(intk=j;k<=N-1;k+=(int)Math.pow(2,L)){temp=temp.mul(complex[k+B],exp[P]);complex[k+B]=temp.sub(complex[k],temp);complex[k]=temp.add(complex[k],temp);}}}}//二维FFT快速傅立叶变换publicComplex[][]FFT2(int[]currPixArray){Complex[][]resPixArray=newComplex[height][width];intN=Math.max(width,height);complex=newComplex[N];for(inti=0;i<N;i++)complex[i]=newComplex();for(inti=0;i<height;i++){for(intj=0;j<width;j++){currPixArray[i*width+j]=currPixArray[i*width+j]&0xff;//System.out.println(currPixArray[i*width+j]);resPixArray[i][j]=newComplex(currPixArray[i*width+j],0);}}for(inti=0;i<height;i++){for(intj=0;j<width;j++){complex[j]=resPixArray[i][j];}FFT();for(intj=0;j<width;j++){resPixArray[i][j]=complex[j];}}for(inti=0;i<width;i++){for(intj=0;j<height;j++){complex[j]=resPixArray[j][i];}FFT();for(intj=0;j<height;j++){resPixArray[j][i]=complex[j];}}returnresPixArray;}privatevoidchangeOrder(intN){intweight=N/2;intj=weight,k=weight;for(inti=1;i<N/2;i++){swap(i,j);k=weight;while(j>=k){j=j-k;k=(int)(k/2+0.5);}j=j+k;}}privatevoidswap(inti,intj){Complextemp=newComplex();temp=complex[i];complex[i]=complex[j];complex[j]=temp;}
解决方案
解决方案二:
1。把结果的实部和虚部分别做成矩阵来试试。2.可能要进行归一化,要不制作图像的过程会出错
解决方案三:
恩可是是要归一化吧。。求教具体怎么个做法呢??
解决方案四:
1.变换前的矩阵就是图像的灰度值2.运算FFT后,返回两个矩阵,分别代表结果中的实数与虚数。这些东东在图像书上都有啊!为了显示输出的效果,需要将图像归一化,就是将图像的值区间约束到0-1之间(对于算计机图像处理来说,是约束到0-255之间)。FFT输出的对比度太强,可能导致显示出来的图就是中间一个亮点,没什么意义,所以会需要进行降对比度处理,书上一般是使用一个对数函数来进行,进行对数操作以后,再归一化显示,效果就出来了