Tải bản đầy đủ (.pdf) (10 trang)

Các thuộc tính của ảnh số part 2 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (528.62 KB, 10 trang )

135

Hình 7.3 Phổ tần số của trạng thái liên tục và trạng thái đã lấy mẫu của
một tín hiệu.
Nếu
T
T
- )(
1
)(




jX
T
eX
a
Tj
(7.11)






k
kTj
a
Tj
ekTxeX )()(



Kết hợp biểu thức (7.10) và (7.11)





T
T
tj
a
dejX
T
tx



)(
2
)(
Vì vậy
















deekTx
T
tx
tj
T
T
k
Tkj
aa



)(
2
)(
Thay đổi thứ tự tính tổng và tích phân,

















k
T
T
kTtj
aa
de
T
kTxtx
/
/
)(
2
)()(




Tính giá trị của tích phân chúng ta đợc








k
aa
kTt
T
kTt
T
kTxtx
)(
)(sin
)()(


(7.12)
Biểu thức (7.12) là phép nội suy cho phép khôi phục các tín hiệu liên tục
theo thời gian x
a
(t) từ các mẫu của nó.

Trờng hợp 2-D: Các định lý lấy mẫu 2-D giả thiết rằng hàm giới hạn
băng f
a
(x,y) có thể khôi phục một cách hoàn toàn từ các mẫu mà thoả
mãn

T
W
H

H

1
2

T
W
V
V

1
2
(7.13)
ở đây W
H
và W
V
biểu diễn giải thông theo hezt của tín hiệu 2-D theo
chiều dọc và theo chiều ngang. Nếu biểu thức (7.13) đợc thoả mãn, và
136
f
a
(k
1
T
V
,k
2
T
H

) biểu diễn tín hiệu lấy mẫu 2-D, thì f
a
(x,y) có thể khôi phục
từ f
a
(k
1
T
V
,k
2
T
H
) dùng biểu thức nội suy:







)(
)(


(7.14)



Chứng minh của các biểu thức (7.13) và (7.14) tơng tự nh trờng

hợp 1-D và đợc để lại nh một bài tập. Một chú ý là phổ tần số của một
tín hiệu lấy mẫu 2-D tuần hoàn trong miền tần số, nh trong hình 7.4. Tín
hiệu tơng tự có thể đợc khôi phục bằng cách tách ra một chu kỳ từ phổ
tín hiệu mẫu.
7.4 Định lý lấy mẫu áp dụng lên các ảnh
Một ảnh đợc tạo nên bằng cách chiếu một cảnh 3-D lên mặt phẳng 2-
D. Phép chiếu này biểu diễn một phép biến đổi từ nhiều vào một. Có
nghĩa là một điểm ảnh không tơng ứng duy nhất với một điểm trong
cảnh 3-D. Điều này đợc minh hoạ qua hình 7.5. Giả sử rằng ảnh này
chứa N điểm ảnh theo hớng x. Sau đó cho các vật thể S
1
và S
2
trong hình
7.5 chúng ta có

x
N
1
10

mét (7.15)

N
x
3
2
mét (7.16)
Định lý lấy mẫu đòi hỏi:


1
1
2
1
W
x

)(
)(sin
2
2
H
H
H
H
Tky
T
Tky
T




137
(7.17)























Hình 7.4 Phổ tần số của một tín hiệu lấy mẫu 2-D.

2
2
2
1
W
x
(7.18)
ở đây, W
1
là tần số cao nhất theo hớng x cho ảnh đợc tạo bởi một mình
vật thể S

1
, và W
2
là tần số cao nhất theo hớng x cho ảnh đợc tạo bởi
một mình vật thể S
2
. Bởi vì chúng ta chỉ có một ảnh bao gồm S
1
và S
2
nên
W
1
= W
2
và N đợc xác định theo
x
N W
2
2
3 1
2
(7.19)
Vì thế N = 6W
2
(7.20)
1

2


H
T

H
T


V
T

V
T


H
W
V
W
138
Hình 7.5 ánh xạ một cảnh 3-D lên mặt phẳng ảnh 2-D.
Thay N trong biểu thức (7.15) chúng ta đợc

112
1
2
1
6
10
6
10

WWW
x
Vì thế, giả thiết lấy mẫu không thoả mãn cho vật thể S
1
, và ở đây các
thông tin của miền này trên ảnh không thể khôi phục qua phép nội suy.
Nói một cách khác, các vật thể gần camera có khả năng tốt hơn khi lấy
mẫu, trong khi các vật thể xa camera thì dễ dàng khi khôi phục mẫu.
7.5 Nhân đôi độ phân giải trên ảnh
Kết quả của định lý lấy mẫu có thể dùng để tăng độ phân giải trên ảnh.
Dù sao chăng nữa, dựa vào kết quả đã đạt đợc chúng ta có thể kết luận
rằng nói chung thì không thể tăng độ phân giải của ảnh lên đợc. Trong
các ảnh, các vật thể đáng quan tâm thông thờng đợc che hết bề mặt của
ảnh. Vì thế, nếu các đối tợng trong nền không đợc cho độ phân giải d
thừa, các vật thể cận cảnh thông thờng có đủ mẫu để cho phép dùng các
định lý lấy mẫu.
139
7.5.1 Nhân đôi độ phân giải dùng sự thể hiện tần số của lý thuyết lấy
mẫu
Chúng ta đã chú ý ở trong chơng 6 rằng phổ tần số của một ảnh giảm
nhanh cùng với sự tăng của tần số. Chúng ta có thể dùng nhận xét này và
định lý lấy mẫu Whittaker-Shannon để tăng độ phân giải. Giải thuật này
theo các bớc sau:
1. Rút ra FFT của ảnh có kích thớc N N, cụ thể
I k k FFT i n n
n n
( , ) { ( , )( ) }
1 2 1 2
1
1 2




phổ tần số sẽ phải có gốc toạ độ ở trung tâm của mảng FFT.
2. Thêm các điểm 0 vào FFT nh giới thiệu trong hình 7.6 để tăng kích
thớc của nó lên 2N 2N.
3. Rút ra biến đổi ngợc FFT của biến đổi tần số mở rộng. Kết quả thu
đợc là ảnh gốc với độ phân giải tăng gấp đôi. Cần chú ý là các vật
thể không lấy đủ mẫu trong ảnh gốc thì không cung cấp một sự phát
triển trong độ phân giải.

Để thực hiện các phơng pháp trên chúng ta sẽ bắt đầu với ảnh kích
thớc 128 128 điểm và 256 mức xám trong hình 7.7a. ảnh đã có sẵn
trên đĩa với file có tên là CAMEL.IMG. Thực hiện thuật toán trên đợc
cho trong Chơng trình 7.2. Kết quả áp dụng trên ảnh đợc cho trong
hình 7.7b. Rõ ràng là rất khó khăn để nhận ra ngời cỡi trên lạc đà, nếu
ảnh gốc mặt ngời đó cha đợc lấy đủ mẫu.

Chơng trình 7.2 ENLQFFT.C nhân đôi độ phân giải của một
ảnh qua FFT.

/*This program utilizes 2-D FFT to double the size of an image.*/

#define pi 3.141592654

#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <stdlib.h>
#include <io.h>

#include <string.h>
#include <ctype.h>
#include <conio.h>

void bit_reversal(unsigned int *, int , int);
140
void WTS(float *, float *, int, int);
void FFT(float *xr , float *xi, float *, float *, int , int) ;
void transpose(FILE *, int, int);
void FFT2D(FILE *, FILE *, float *, float *, unsigned int *,
int,int,int);

void main()
{
int N,m,i,j,N2,N4,m2,n2,ind;
unsigned int *L;
float *wr,*wi;
FILE *fptri,*fptro,*fptrt;
double nsq;
float *buffo,*buffi;
unsigned char file_name[14],ch,*buffr;
float max,min,scale;

clrscr();
printf("Enter file name for image to be enlarged -> ");
scanf("%s", file_name);
fptri=fopen(file_name,"rb");
if(fptri==NULL)
{
printf("\n File does not exist.");

exit(1);
}
nsq=filelength(fileno(fptri));
N=(int)sqrt(nsq);
m=(int)(log10((double)N)/log10((double)2));
fptro=fopen("FFT1.img","wb+");

/* file for storing FFT of image.*/
again :
gotoxy(1,2);
printf ( " ");
gotoxy(1,2);
printf("Enter file-name for enlarged image -> ");
scanf("%s",file_name);
if(((stricmp("FFT1.img",file_name))==0)||
((stricmp("temp.img",file_name))==0)||
((stricmp("IFFT2.img",file_name))==0))
{
141
printf("This is a reserved file name. Use some other name.");





















Hình 7.6 Thêm các số 0 vào FFT thu đợc ảnh có tần số mở rộng.
goto again;
}
gotoxy(1,2);
printf ( " ");
ind=access(file_name,0);
while(!ind)
{
gotoxy(1,3);
printf("File exists. Wish to overwrite? (y or n) >");
while(((ch=tolower(getch()))!='y')&&(ch!='n'));
putch(ch);
switch(ch)
{
case 'y' :
ind=1 ;
break ;




FFT của ảnh


N

N
2


1


2
2
T
T




T



0s


0s



0s


0s

2
N

2
N

142
case 'n' :
gotoxy(1,3);
printf(" ");
gotoxy(1,2);
printf (" ");
gotoxy(1,2);
printf("Enter file name >");
scanf("%s",file_name);
ind=access(file_name,0);
}
}


H×nh 7.7 "CAMEL.IMG" vµ ¶nh ®· ®îc phãng to.

N2=N<<1;

143

/* 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);

/* 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;
144
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() ;
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");

×