4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
char * CChgDlg::Fourier(char *lpDIBBits, int lWidth..._CSDN论坛
来自 : CSDN技术社区 发布时间:2021-03-25
staticCOMPLEXAdd(COMPLEXc1,COMPLEXc2);
staticCOMPLEXSub(COMPLEXc1,COMPLEXc2);
staticCOMPLEXMul(COMPLEXc1,COMPLEXc2);
voidstaticFFT(COMPLEX*TD,COMPLEX*FD,intpower);
COMPLEXc1;
COMPLEXc2;
};
COMPLEXCFFT::Add(COMPLEXc1,COMPLEXc2)
{
COMPLEXc;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
returnc;
}
COMPLEXCFFT::Sub(COMPLEXc1,COMPLEXc2)
{
COMPLEXc;
c.re=c1.re-c2.re;
c.im=c1.im-c2.im;
returnc;
}
COMPLEXCFFT::Mul(COMPLEXc1,COMPLEXc2)
{
COMPLEXc;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.im*c2.re+c1.re*c2.im;
returnc;
}
voidCFFT::FFT(COMPLEX*TD,COMPLEX*FD,intpower)
{
intcount;
inti,j,k,bfsize,p;
doubleangle;
COMPLEX*W,*X1,*X2,*X;
count=1 power;
W=(COMPLEX*)malloc(sizeof(COMPLEX)*count/2);
X1=(COMPLEX*)malloc(sizeof(COMPLEX)*count);
X2=(COMPLEX*)malloc(sizeof(COMPLEX)*count);
for(i=0;i count/2;i++)
{
angle=-i*PI*2/count;
W[i].re=cos(angle);
W[i].im=sin(angle);
}
memcpy(X1,TD,sizeof(COMPLEX)*count);
for(k=0;k power;k++)
{
for(j=0;j 1 k;j++)
{
bfsize=1 (power-k);
for(i=0;i bfsize/2;i++)
{
p=j*bfsize;
X2[i+p]=Add(X1[i+p],X1[i+p+bfsize/2]);
X2[i+p+bfsize/2]=Mul(Sub(X1[i+p],X1[i+p+bfsize/2]),W[i*(1 k)]);
}
}
X=X1;
X1=X2;
X2=X;
}
for(j=0;j count;j++)
{
p=0;
for(i=0;i power;i++)
{
if(j (i i))p+=1 (power-1-i);
}

FD[j]=X1[p];

}
free(W);
free(X1);
free(X2);
}
这个是傅立叶的算法,但是在用这个进行图象处理的时候就有问题了!
char*CChgDlg::Fourier(char*lpDIBBits,intlWidth,intlHeight)
{

char*lpSrc;
//指向源图像的指针
double dTemp=0.00000;
int i;
int j;
//进行付立叶变换的宽度和高度(2的整数次方)
int w;
int h;
int wp;
int hp;
//图像每行的字节数
longlLineBytes;
//计算图像每行的字节数
lLineBytes=lWidth*3;
//赋初值
w=1;
h=1;
wp=0;
hp=0;
//计算进行付立叶变换的宽度和高度(2的整数次方)
while(w*2 =lWidth)
{
w*=2;
wp++;
}

while(h*2 =lHeight)
{
h*=2;
hp++;
}
//分配内存
COMPLEX*TD=newCOMPLEX[w*h];
COMPLEX*FD=newCOMPLEX[w*h];
//行
for(i=0;i h;i++)
{
//列
for(j=0;j w;j++)
{
//指向DIB第i行,第j个象素的指针
lpSrc=lpDIBBits+lLineBytes*(lHeight-1-i)+j;

//给时域赋值
// TD[j+w*i]=complex double (*(lpSrc),0);
TD[i+w*j].re=*(lpSrc);
TD[j+w*j].im=0;
}
}

for(i=0;i h;i++)
{
//对y方向进行快速付立叶变换
CFFT::FFT( TD[w*i], FD[w*i],wp);
}

//保存变换结果
for(i=0;i h;i++)
{
for(j=0;j w;j++)
{
TD[i+h*j]=FD[j+w*i];
}
}

for(i=0;i w;i++)
{
//对x方向进行快速付立叶变换
CFFT::FFT( TD[i*h], FD[i*h],hp);
}

//行
for(i=0;i h;i++)
{
//列
for(j=0;j w;j++)
{
//计算频谱
dTemp=sqrt(FD[j*h+i].re*FD[j*h+i].re+
FD[j*h+i].im*FD[j*h+i].im)/100;

//判断是否超过255
if(dTemp 255)
//对于超过的,直接设置为255
dTemp=255;


//指向DIB第(i h/2?i+h/2:i-h/2)行,第(j w/2?j+w/2:j-w/2)个象素的指针
//此处不直接取i和j,是为了将变换后的原点移到中心
// lpSrc=lpDIBBits+lLineBytes*(lHeight-1-i)+j;
lpSrc=lpDIBBits+lLineBytes*(lHeight-1-(i h/2?i+h/2:i-h/2))+(j w/2?j+w/2:j-w/2);

//更新源图像
*(lpSrc)=(BYTE)(dTemp);
*(lpDIBBits)=*(lpSrc);

}
}

//删除临时变量
deleteTD;
deleteFD;
//返回
returnlpDIBBits;
}
哪位高手看看,是怎么回事啊!我实在是不明白啊!

本文链接: http://ibintl.immuno-online.com/view-738611.html

发布于 : 2021-03-25 阅读(0)