图像变换DFT
一.原理
数值图像处理的方法主要有两类:空间域处理法及频域法,频域法首先是要将图像变换到频域,然后在进行处理。傅里叶变换是一种常见的正交变换,为了在数字图像处理中应用傅里叶变换,引入了离散傅里叶变换(DFT)的概念,对图像的傅里叶变换将图像从图像空间变换到频率空间,从而可利用傅里叶频谱特性进行图像处理。
1F(u,v)Nf(x,y)exp[j2(uxvy)/N]x0y0N1N1
我把那exp[j2(uxvy)/N]用complexdouble(cos,sin)来表示。
二.代码
VOID DFT(complex { LONG count;//傅里叶变化点数 int i,j,k1,k2;//循环变量 double angle;//角度 count=r;//计算傅里叶变换点数 complex W =new complex X1=new complex X2=new complex // X3=new complex for (i=0;i angle=-(i+j)*PI*2/count; W[i*j]=complex } //将时域点写入X memcpy(X1,TD,sizeof(complex for (k1=0;k1 for (k2=0;k2 X2[k2]=X1[k2]*W[k2+count*k1]; } complex k3=X2[0]; for (k2=1;k2 k3=k3+X2[k2]; } FD[k1]=k3; } delete W; delete X1; delete X2; } void CImageProcessingDoc::OnImageDft() { m_pDibInit->Save(\"r_temp1.bmp\"); // TODO: Add your command handler code here int i,j; //循环变量 int m_Width, m_Height, m_SaveWidth; unsigned char* lpSrc; m_Width = m_pDibInit->GetWidth(); m_Height = m_pDibInit->GetHeight(); m_SaveWidth = m_pDibInit->GetSaveWidth(); complex complex for(j=0;j for(i=0;i lpSrc=(unsigned char*)m_pDibInit->m_pDibBits[j*m_SaveWidth + i]; TD[i+j*m_Width]=complex } for(i=0;i DFT(&TD[m_pDibInit->m_pDibBits[j*m_SaveWidth + i]],&FD[m_pDibInit->m_pDibBits[j*m_SaveWidth + i]],m_Width); } } //将高频变到中间 if (set_dft) { for (i=0;i for (j=0;j m_pDibInit->m_pDibBits[j*m_SaveWidth+i] = copydata[(m_Height/2-j)*m_Width+(m_Width/2-i)]; } } for (i=m_Width/2;i for (j=m_Height/2;j m_pDibInit->m_pDibBits[j*m_SaveWidth+i] = copydata[(m_Height-j+m_Height/2)*m_Width+(m_Width-i+m_Width/2)]; } } for (i=0;i for (j=m_Height/2;j m_pDibInit->m_pDibBits[j*m_SaveWidth+i] = copydata[(m_Height-j+m_Height/2)*m_Width+(m_Width/2-i)]; } } for (i=m_Width/2;i for (j=0;j m_pDibInit->m_pDibBits[j*m_SaveWidth+i] = copydata[(m_Height/2-j)*m_Width+(m_Width-i+m_Width/2)]; } } } else { for (j=0;j } m_pDibInit->Save(\"r_temp2.bmp\"); UpdateAllViews(NULL); } 三.结果于分析 图1 图2 图3 图4 图1和图3是原图,图2和图4是对图1图2进行DFT变换。 实验中,我对图4像不断的进行DFT变换会,如下图: 当进行到第10次时候发现: 这时候已经看你不出有什么变换,说明,DDT变换用的是图像的相关性。当对白噪声进行DFT变换时,得到的还是白噪声。 因篇幅问题不能全部显示,请点此查看更多更全内容