gpt4 book ai didi

c++ - C++中DFT的实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:15 24 4
gpt4 key购买 nike

我想以 C++ 语言实现 DFT ,以处理图像

在学习理论的过程中,我知道可以将2D DFT分为和1D DFT 两个部分。首先,我为每一行执行一维DFT,然后为每一列执行一维DFT。当然,我应该对复数进行运算。
这里会出现一些问题,因为我不确定在哪里使用实数,在复数的虚数部分在哪里。我在某处发现应该将输入图像像素的值视为实部,并将虚部设置为0。
我做了一个实现,但是我想结果图像不正确。

如果有人可以帮助我,我将不胜感激。
为了读取和保存图像,我使用CImg库。

void DFT (CImg<unsigned char> image)
{
int w=512;
int h=512;
int rgb=3;
complex <double> ***obrazek=new complex <double>**[w];
for (int b=0;b<w;b++) //making 3-dimensional table to store DFT values
{
obrazek[b]=new complex <double>*[h];
for (int a=0;a<h;a++)
{
obrazek[b][a]=new complex <double>[rgb];
}
}

CImg<unsigned char> kopia(image.width(),image.height(),1,3,0);

complex<double> sum=0;
complex<double> sum2=0;
double pi = 3.14;

for (int i=0; i<512; i++){
for (int j=0; j<512; j++){
for (int c=0; c<3; c++){
complex<double> cplx(image(i,j,c), 0);
obrazek[i][j][c]=cplx;
}}}

for (int c=0; c<3; c++) //for rows
{
for (int y=0; y<512; y++)
{
sum=0;
for (int x=0; x<512; x++)
{
sum+=(obrazek[x][y][c].real())*cos((2*pi*x*y)/512)-(obrazek[x][y][c].imag())*sin((2*pi*x*y)/512);
obrazek[x][y][c]=sum;
}
}
}

for (int c=0; c<3; c++) //for columns
{
for (int y=0; y<512; y++)//r
{
sum2=0;
for (int x=0; x<512; x++)
{
sum2+=(obrazek[y][x][c].real())*cos((2*pi*x*y)/512)-(obrazek[y][x][c].imag())*sin((2*pi*x*y)/512);
obrazek[y][x][c]=sum2;
}
}
}

for (int i=0; i<512; i++){
for (int j=0; j<512; j++){
for (int c=0; c<3; c++){
kopia(i,j,c)=obrazek[i][j][c].real();
}}}

CImgDisplay image_disp(kopia,"dft");

while (!image_disp.is_closed() )
{

image_disp.wait();

}
saving(kopia);
}

最佳答案

看一下这个页面。这可能会有所帮助:
http://paulbourke.net/miscellaneous/dft/

有一个DFT的实现(大约40行)。

关于c++ - C++中DFT的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8794283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com