フーリエ変換による画像拡大するには?


みさき  2006-01-12 03:16:07  No: 60243

フーリエ変換を使って画像を(好きな大きさに)拡大したいのですが
うまく拡大できません(>_<。。。
1次元の部分だけ高速フーリエ変換じゃなくて普通のフーリエ変換を
使って大きさを自由に変えれるようにしてるんですけど・・・

実行環境はLINUXです。

どなたか教えていただけないでしょうか。

#include  <math.h>
#include  <stdio.h>
#define  M   512
#define  N   512  
#define  pi  M_PI

#define   MAX  255
#define PI  4*atan(1.0)

int        tmp[M][M];
double    xx[M][M],yy[M][M],gg[M][M];
double      _cos[M], _sin[M];
double    ff[M][M];

main(){
  int  i, j, w;
  int  insize,outsize;
  double   wx[M][M],wy[M][M];
  double  max;  

  printf("input size?");
  scanf("%d",&insize);
  printf("output size?");
  scanf("%d",&outsize);
  
  int n2=insize/2, n3=insize*3/2, n4=outsize/2, n5=insize/4,n6=outsize/4;

/*gazou yomikomi*/
  read_file(insize);

  for(i=0;i<insize;i++){for(j=0;j<insize;j++){
      xx[i][j]=tmp[i][j]; yy[i][j]=0;
  }}

/*nijigen FFT*/
  fft2(xx,yy,insize);   printf("FFT done %c\n",'\7');
  

/*kakudai shori*/
  if(insize<outsize)
  {
    for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
        wx[i][j]=wy[i][j]=0;
    }}
  
    for(i=0;i<n2;i++){for(j=0;j<n2;j++){
                wx[i][j]      =xx[i][j];
            wy[i][j]      =yy[i][j];
                wx[i][n3+j]   =xx[i][n2+j];
          wy[i][n3+j]   =yy[i][n2+j];
                wx[n3+i][j]   =xx[n2+i][j];
          wy[n3+i][j]   =yy[n2+i][j];
                wx[n3+i][n3+j]=xx[n2+i][n2+j];
          wy[n3+i][n3+j]=yy[n2+i][n2+j];
          }}
    for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
        xx[i][j]=wx[i][j]; yy[i][j]=wy[i][j];
    }}
    
  }

/*shukushou shori */
  if(insize>outsize)
  {  
          for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
        wx[i][j]=wy[i][j]=0;
    }}
    
    for(i=0;i<n4;i++){for(j=0;j<n4;j++){
              wx[i][j]      =xx[i][j]; 
              wy[i][j]      =yy[i][j];
      
              wx[i][n4+j]   =xx[i][insize-n4+j];
              wy[i][n4+j]   =yy[i][insize-n4+j];
  
              wx[n4+i][j]   =xx[insize-n4+i][j];
           wy[n4+i][j]   =yy[insize-n4+i][j];

              wx[n4+i][n4+j]=xx[insize-n4+i][insize-n4+j];
              wy[n4+i][n4+j]=yy[insize-n4+i][insize-n4+j];
          }}
    
    for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
        xx[i][j]=wx[i][j]; yy[i][j]=wy[i][j];
    }}
  }

/*gyaku 2jigen FFT*/
  ifft2(xx,yy,outsize);  printf("ifft done %c\n",'\7');

  
  if(insize<outsize)
  {
          for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
          w=4*xx[i][j]+.3; if(w<0) w=0; if(w>255) w=255; tmp[i][j]=w;
          }}
  }

  if(insize>outsize)
  {
    for(i=0;i<outsize;i++){for(j=0;j<outsize;j++){
      tmp[i][j]=xx[i][j];
    }}
  }
  
/*save data*/
  save_file(outsize);  
}

/*gazou yomikomi*/
read_file(in){
  int  i, j,k;
  int     n1;
  int     mazu[in*in];
  
        FILE    *fpr;   
  char    flr[30];
        printf("read file ? "); scanf("%s",flr);
        fpr=fopen(flr,"r");

    k=0;

    for(i=0;i<in;i++){
      for(j=0;j<in;j++){
        fscanf(fpr,"%d",&n1);
                mazu[k]=n1;
        k++;
            }
    }
            
    k=0;
    for(i=0;i<in;i++){
      for(j=0;j<in;j++){
        tmp[i][j]=mazu[k];
        k++;
      }
    }      
        fclose(fpr);
}

disp_data(k){
        int     i, j;
        printf("\n");
        for(i=0;i<k;i++){
    for(j=0;j<k;j++){
                printf("%7d",(int)xx[i][j]);
      if(j==k-1){
        printf("\n");
        
      }
    }
  
        } printf("\n");
}

/*save*/
save_file(k){
        FILE    *fpw;
        char    flw[30];
  char    szfname[]="aaa.txt";
  int     i,j;  
  int     max=0;

  fpw=fopen(szfname,"w");
  if(fpw==NULL){
    printf("オープン失敗");
    return;
  }
    
  for(i=0;i<k;i++){
    for(j=0;j<k;j++){
      if(tmp[i][j]>max)  max=tmp[i][j];
    }
  }
  fprintf(fpw,"P2\n");
  fprintf(fpw,"%3d %3d\n",k,k);
  fprintf(fpw,"%d\n",max);
  
  for(i=0;i<k;i++){
    for(j=0;j<k;j++){
      fprintf(fpw,"%8d",tmp[i][j]);
    }fprintf(fpw,"\n");
  }
        fclose(fpw);
}

/*2jigen FFT*/
/******************************************************************
     2-dimensional FFT (p.154, Agui, C-gengo niyoru gazou syori)
 ******************************************************************/
fft2( xx, yy, size )      /* flag: 1 FFT  */ 
double   xx[M][M],yy[M][M];                  /*      -1 IFFT */ 
int    size;
{
  double  x[M],g[M],y[M];
  int  i,j;
  
  for( i = 0; i < size; i++ ){
    for( j = 0; j < size; j++ ){
      x[j] = xx[j][i]; y[j] = yy[j][i];
      g[j] = xx[j][i]; 
    }

/*1jigen huurie henkan*/
    dft1(g,x,y,size);

    for( j = 0; j < size; j++ ){
      xx[j][i] = x[j]; yy[j][i] = y[j];
    }
  }

  for( i = 0; i < size; i++ ){
    for( j = 0; j < size; j++ ){
      x[j] = xx[i][j]; y[j] = yy[i][j];
      g[j]=xx[i][j];
    }
/*1jigen huurie henkan*/    
    dft1(g,x,y,size);
    
    for( j = 0; j < size; j++ ){
      xx[i][j] = x[j]; yy[i][j] = y[j];
    }
  }
}

/*1jigen huurie henkan*/
dft1( gg, xx, yy, size )
double  gg[],xx[],yy[];
int  size;
{
  double tmp_x[M],tmp_y[M];
  int i,j;
  for (i=0; i<size; i++) {

    tmp_x[i] = xx[i];

    tmp_y[i] = yy[i];

  }

  

  for (i=0; i<size; i++) {

    xx[i] = 0;

    yy[i] = 0;

    for (j=0; j<size; j++) {

      xx[i] += tmp_x[j]*cos(2*PI*i*j/size) + tmp_y[j]*sin(2*PI*i*j/size);

      yy[i] += -tmp_x[j]*sin(2*PI*i*j/size) + tmp_y[j]*cos(2*PI*i*j/size);
      

    }
    

  }
}

/*gyaku 2jigen FFT*/
ifft2( xx, yy, size )      /* flag: 1 FFT  */ 
double   xx[M][M],yy[M][M];                  /*      -1 IFFT */ 
int    size;
{
  double  x[M],g[M],y[M];
  int  i,j;
  mk_table(size);
  for( i = 0; i < size; i++ ){
    for( j = 0; j < size; j++ ){
      x[j] = xx[j][i]; y[j] = yy[j][i];
      
    }

/*gyaku 1jigen huurie henkan*/
    idft1(x,y,size,-1);

    for( j = 0; j < size; j++ ){
      xx[j][i] = x[j]; yy[j][i] = y[j];
    }
  }
  for( i = 0; i < size; i++ ){
    for( j = 0; j < size; j++ ){
      x[j] = xx[i][j]; y[j] = yy[i][j];
      
    }

/*gyaku 1jigen huurie henkan*/
    idft1( x, y, size ,-1);

    for( j = 0; j < size; j++ ){
      xx[i][j] = x[j]; yy[i][j] = y[j];
    }
  }
}

/*gyaku 1jigen huurie henkan*/
idft1(xx,yy,size)
double   xx[], yy[];
int     size;
{
  int i,j;
  double tmp_x[M],tmp_y[M];
  
  for (i=0; i<size; i++) {

    tmp_x[i] = xx[i];

    tmp_y[i] = yy[i];
  }

  

  for (i=0; i<size; i++) {

    xx[i] = 0;

    yy[i] = 0;

    for (j=0; j<size; j++) {

      xx[i] +=  tmp_x[j]*cos(2*PI*i*j/size) - tmp_x[j]*sin(2*PI*i*j/size);

      yy[i] +=  tmp_y[j]*sin(2*PI*i*j/size) + tmp_y[j]*cos(2*PI*i*j/size);

    }

    xx[i] /= size;

    yy[i] /= size;
  }
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加