我使用此站点的等式实现了2D DFT和IDFT http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm 我认为这些都是正确的并且很好地解释了。 实现看起来像这样:
for(int i=0;i<inImage.width;i++)
{
for(int j=0;j<inImage.height;j++)
{
float ak=0;
float bk=0;
for(int ii=0;ii<inImage.width;ii++)
{
for(int jj=0;jj<inImage.height;jj++)
{
float x=-2.0*PI*i*ii/(float)inImage.width;
float y=-2.0*PI*j*jj/(float)inImage.height;
// ak+=inImage.pixels[i][j]*(cos(x)*cos(y)-sin(x)*sin(y));
// bk+=inImage.pixels[i][j]*(sin(x)*cos(y)+sin(y)*cos(x));
ak+=inImage.pixels[i][j]*cos(x+y);
bk+=inImage.pixels[i][j]*1.0*sin(x+y);
}
}
DFTImageRE.pixels[i][j]=ak;
DFTImageIM.pixels[i][j]=bk;
}
}
频域(sqrt(ak * ak + bk * bk))看起来并不像它应该的那样,并且图像重建(忽略虚部)不会在原始图像附近做任何事情。 [0] [0]处的多个像素具有极高的值,并且没有像素范围从0到255作为原始像素。我做错了什么?
额外信息:
由于
答案 0 :(得分:1)
我找到了解决问题的方法。这只是索引问题。总和使用ii和jj来找到傅立叶变换
for(int i=0;i<inImage.width;i++)
{
for(int j=0;j<inImage.height;j++)
{
float ak=0;
float bk=0;
for(int ii=0;ii<inImage.width;ii++)
{
for(int jj=0;jj<inImage.height;jj++)
{
float x=-2.0*PI*i*ii/(float)inImage.width;
float y=-2.0*PI*j*jj/(float)inImage.height;
ak+=inImage.pixels[ii][jj]*cos(x+y);
bk+=inImage.pixels[ii][jj]*1.0*sin(x+y);
}
}
DFTImageRE.pixels[i][j]=ak;
DFTImageIM.pixels[i][j]=bk;
}
}