掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フーリエ変換による画像拡大するには? (ID:60243)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
フーリエ変換を使って画像を(好きな大きさに)拡大したいのですが うまく拡大できません(>_<。。。 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; } }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.