您的当前位置:首页DFT

DFT

2021-06-03 来源:六九路网


图像变换DFT

一.原理

数值图像处理的方法主要有两类:空间域处理法及频域法,频域法首先是要将图像变换到频域,然后在进行处理。傅里叶变换是一种常见的正交变换,为了在数字图像处理中应用傅里叶变换,引入了离散傅里叶变换(DFT)的概念,对图像的傅里叶变换将图像从图像空间变换到频率空间,从而可利用傅里叶频谱特性进行图像处理。

1F(u,v)Nf(x,y)exp[j2(uxvy)/N]x0y0N1N1

我把那exp[j2(uxvy)/N]用complexdouble(cos,sin)来表示。

二.代码

VOID DFT(complex *TD,complex *FD,int r)

{

LONG count;//傅里叶变化点数

int i,j,k1,k2;//循环变量

double angle;//角度

count=r;//计算傅里叶变换点数

complex *W,*X1,*X2;

W =new complex[count*count];

X1=new complex[count];

X2=new complex[count];

// X3=new complex[count];

for (i=0;ifor(j=0;j{

angle=-(i+j)*PI*2/count;

W[i*j]=complex(cos(angle),sin(angle));

}

//将时域点写入X

memcpy(X1,TD,sizeof(complex)*count);

for (k1=0;k1{

for (k2=0;k2{

X2[k2]=X1[k2]*W[k2+count*k1];

}

complex k3=0;

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*TD=new complex[m_Width*m_Height];

complex*FD=new complex[m_Width*m_Height];

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(*(lpSrc),0);

}

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;jfor(i=0;im_pDibInit->m_pDibBits[j*m_SaveWidth+i] = copydata[j*m_Width+i];

}

m_pDibInit->Save(\"r_temp2.bmp\");

UpdateAllViews(NULL);

}

三.结果于分析

图1 图2

图3 图4

图1和图3是原图,图2和图4是对图1图2进行DFT变换。

实验中,我对图4像不断的进行DFT变换会,如下图:

当进行到第10次时候发现:

这时候已经看你不出有什么变换,说明,DDT变换用的是图像的相关性。当对白噪声进行DFT变换时,得到的还是白噪声。

因篇幅问题不能全部显示,请点此查看更多更全内容