对图像进行离散余弦变换(DCT)处理(图像变换)的源代码#defineEXTRA_NAME"***@dcttransform."#include""#definePoint(x,y)lpPoints[(x)+(y)*nWidth]PLEX*PLEX*FD,intpower){ intcount; inti,j,k,bfsize,p; doubleangle; COMPLEX*W,*X1,*X2,*X; count=1<<power; W=(COMPLEX*)malloc(PLEX)*count/2); X1=(COMPLEX*)malloc(PLEX)*count); X2=(COMPLEX*)malloc(PLEX)*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,PLEX)*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&(1<<i))p+=1<<(power-i-1); } FD[j]=X1[p]; } free(W); free(X1); free(X2);}voidDCT_Pre(double*f,double*F,intpower){ inti,count; COMPLEX*X; doubles; count=1<<power; X=(COMPLEX*)malloc(PLEX)*count*2); memset(X,0,PLEX)*count*2); for(i=0;i<count;i++) { X[i].re=f[i]; } FFT(X,X,power+1); s=1/sqrt(count); F[0]=X[0].re*s; s*=sqrt(2); for(i=1;i<count;i++) { F[i]=(X[i].re*cos(i*pi/(count*2))+X[i].im*sin(i*pi/(count*2)))*s; } free(X);}voidDct(){ intw=1,h=1,wp=0,hp=0; while(w*2<=nWidth) { w*=2; wp++; } while(h*2<=nHeight) { h*=2; hp++; } intx,y; BYTE*lpPoints=newBYTE[nWidth*nHeight]; GetPoints(lpPoints); double*f=n
图像的离散余弦变换代码 来自淘豆网m.daumloan.com转载请标明出处.