141
Hình 7.7 "CAMEL.IMG" ảnh đã được phóng to.
N2=N<<1;
/* Allocating memory for bit reversal LUT.*/
L=(unsigned int *)malloc(N2*sizeof(unsigned int));
/* Generate Look-up table for bit reversal.*/
bit_reversal(L,m,N);
/* Allocating memory for twiddle factors. n2=N- 1 */
wr=(float *)malloc(n2*sizeof(float));
wi=(float *)malloc(n2*sizeof(float));
/*Generating LUT for twiddle factors.*/
WTS(wr,wi,N,-1);
142
/* Taking 2-D FFT. */
FFT2D(fptri,fptro,wr,wi,L,N,m,-1);
clrscr() ;
printf(" Adding zeros to FFT of image. \n");
/* Adding zeros to double the size of the FFT.*/
N4=N2<<1 ;
buffi=(float *)malloc(N2*sizeof(float));
buffo=(float *)malloc(N4*sizeof(float));
fptri=fopen("FFT1.img","rb");
fptrt=fopen("temp.img","wb+");
fptro=fopen("TFFT2.jmg","wb+");
for(i=0; i<N4; i++)
buffo[i]=(float)0.0;
/* store O's in the first N/2 lines.*/
for(i=0; i<(N>>1); i++)
fwrite(buffo,N4,sizeof(float),fptrt);
/* Store O's in the first and last N/2 rows.*/
for(i=0; i<N; i++)
fread(buffi,N2,sizeof(float),fptri);
for(j=0;j<N;j++)
buffo[j]=(float)0.0;
for(j=0;j<N2;j++)
buffo[j+N]=buffi[j];
for(j=(N2+N);j<N4;j++)
buffo[j]=(float)0.0;
fwrite(buffo,N4,sizeof(float),fptrt);
for(i=0; i<N4; i++)
buffo[i]=(float)0.0;
for(i=0;i<(N>>1);i++)
fwrite(buffo,N4,sizeof(float),fptrt);
fclose(fptri);
rewind(fptrt);
/* Taking the inverse FFT.*/
printf("Taking the inverse FFT.\n");
m2=m+1 ;
/* Generating bit reversal I(JT.*/
bit_reversal(L,m2,N2);
WTS(wr,wi,N2,1);
FFT2D(fptrt,fptro,wr,wi,L,N2,m2,1);
clrscr() ;
143
printf("Last stage in forming enlarged
image.");
fptri=fopen("IFFT2.img","rb");
fptro=fopen(file_name,"wb");
buffr=(unsigned char
*)malloc(N2*sizeof(char));
max=0; min=1.0e7;
for(i=0;i<N2;i++)
{
fread(buffo,N4,sizeof(float),fptri);
for(j=0;j<N2;j++)
{
scale=buffo[j<<1];
if(scale>max) max=scale;
if(scale<min) min=scale;
}
}
scale=(float)255.0/(max-min);
rewind(fptri);
for(i=0;i<N2;i++)
{
fread(buffo,N4,sizeof(float),fptri);
for(j=0;j<N2;j++)
buffr[j]=(unsigned char)((buffo[j<<1]-
min)*scale);
fwrite(buffr,N2,sizeof(char),fptro);
}
fcloseall();
remove("FFT1.img");
remove("temp.img");
remove("IFFT2.img");
printf("\nDone.");
}
7.5.2 Nhân đôi độ phân giải trên nh dùng phép nội suy không
gian
Trong phương pháp y ảnh đầu tn được chứa lên mt mảng kích
thước 2N
2N với tất ccác hàng các cột được xoá về không. ảnh được
chiếu lần lượt với các phép nội suy. Hình 7.8 liệt kê các phn của các phép nội
suy ph biến nhất. Giải thuật nội suy vuông thao tác sao chép trong đó
những điểm ảnh về bn được sao chép vào những vị trí rỗng. ththu
được toán tử nội suy tam giác nhờ sự kết hợp hai toán tử nội suy vuông, vì vy
144
ta th thu được cùng kết qunếu ta áp dụng liên tiếp hai phép nội suy
vuông. Giải thuật chuyển đổi những sao chép bn theo bộ lc thông thấp
sang nh để được ảnh trơn hơn. Kết hợp thực hiện ba lần liên tc trên nh
với toán tử nội suy vuông tương đương với áp dụng toán tử nội suy Bell. Toán
tử nội suy bậc 3thể thu được nhờ kết hợp phép nội suy vng và Bell hoặc
kết hợp toán t nội suy vuông bốn lần. S dụng cùng khái niệm đó, chúng ta
thể ddàng có được nội suy cao hơn.
Hình 7.8 Các phép ni suy thông thường.
Những khái niệm trên thđược thực hiện trong phần mềm tương tự với
việc thực hiện lc FIR. Bđệm chuyển đổi nh kích thước N (2 đrộng
ca ảnh) được tận dụng, ở đó N = 2 cho toán t nội suy vuông, N = 3 cho toán
t nội suy tam giác, v.v... Một hàng của nh được chuyn thành hàng cui
cùng ca b đệm chuyn đổi nh u trữ tại các v trí khác với các vị trí
gia đặt bng không. Tương quan của phép nội suy với bộ đệm truyền tới ảnh
dịch chuyển hàng như trong phương pháp trong bộ lọc FIR, một hàng của
các gtr0 được chuyn đổi thành hàng cui cùng của bộ đệm chuyển đổi
ảnh. Những bước này được lặp đi lặp lại cho những phần còn lại của ảnh, bng
cách lựa chọn sự chuyn đổi một hàng tnh theo một hàng ca các giá trị 0.
Th tục thực hiện thuật toány đưc cho trong chương trình 7.3.
Chương trình 7.3 “ENLARGE.C”.
/* This program doubles the dimensions of an
image by interpolation. */
Hình vuông: 1 1
1 1
Tam giác: 1 2 1
2 4 2
1 2 1
Bell 1 3 3 1
3 9 9 3
3 9 9 3
1 3 3 1
Cubic B-Spline 1 4 6 4 1
4 16 24 16 4
6 24 36 24 6
4 16 24 16 4
1 4 6 4 1
145
#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int SQUARE[2][2]={ { 1, 1 },
{ 1, 1 }};
int TRIANGLE[3][3]= { { 1, 2, 1 },
{ 2, 4, 2 },
{ 1, 2, 1 } };
int BELL[4][4]={ { 1, 3, 3, 1 },
{ 3, 9, 9, 3},
{ 3, 9, 9, 3},
{ 1, 3, 3, 1} } ;
int CUBIC_B_SPLINE[5][5]={ { 1, 4, 6, 4, 1 },
{ 4, 16, 24, 16, 4 },
{ 6, 24, 36, 24, 6 },
{ 4, 16, 24, 16, 4 } };
void main()
{
char file_name[14],ch;
FILE *fptri,*fptro,*fptrt;
double nsq;
int image_length,image_width, N, N1,image_length2,
image_width2,i,j,ind,xt,yt;
unsigned int **a,n1,n2,k1,k2,sum,max,min,*bufft;
unsigned char **w,*buffi,*buffo,*temp;
float scale;
clrscr();
printf("Enter file name for input image -->");
scanf("%s",file_name);
fptri=fopen(file_name,"rb");
if(fptri==NULL)
{
printf("%s does not exist.",file_name);