フーリエ変換を使って画像を(好きな大きさに)拡大したいのですが
うまく拡大できません(>_<。。。
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;
}
}
ツイート | ![]() |