Tải bản đầy đủ (.doc) (16 trang)

Xử lý ảnh - Chương 10

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 (977.77 KB, 16 trang )

Chơng
8
Thiết kế các bộ lọc FIR 2-D
dùng FFT và các hàm cửa sổ
8.1 Chỉ dẫn
Các bộ lọc có điểm gẫy, hay còn gọi là các bộ lọc có dải chuyển tiếp dốc tạo nên các nhiễu
gợn lên phổ biên độ cả ở dải thông lẫn dải chắn khi thiết kế với các phơng pháp mô tả ở các
chơng trớc. Chúng đợc gọi là các dao động Gibbs làm ảnh hởng đến chất lợng của ảnh lọc.
Vì vậy cần phải có một biện pháp làm giảm bớt và trơn tru các dao động này. Một biện
pháp tỏ ra có hiệu quả là áp dụng các hàm cửa sổ. Hàm thu đợc khi nhân với đáp ứng xung
bộ lọc với hàm này làm trơn các dao động Gibb. Chúng ta sẽ áp dụng các hàm này và so
sánh phổ biên độ có dùng và không dùng hàm cửa sổ. Để tận dụng các thủ tục 2-D FFT
trong chơng 6, chúng ta sẽ sử dụng chúng trong việc thiết kế bộ lọc FIR. Chúng ta cần chú
ý rằng cách tiếp cận FFT nhanh hơn rất nhiều so với tích phân hai lớp ở chơng 2. Để cung
cấp thêm một số kiến thức hoàn thiện cho công việc, chúng ta sẽ xem xét lĩnh vực về độ
phân giải của ảnh. Lĩnh vực này đ có một số phát triển đã ợc biết dới với cái tên truyền hình
độ phân giải cao (IDTV hoặc EDTV). Các hệ truyền hình này cho ngời xem một số dòng
gấp đôi truyền hình thông thờng, và nh vậy là cho một hình ảnh đẹp hơn. Từ chơng 14 đến
chơng 16 đề cập đến tín hiệu truyền hình và truyền hình độ phân giải cao cho xử lý ảnh
hai chiều.
8.2 Thiết kế bộ lọc FIR dùng FFT
Một bộ lọc FIR có thể thiết kế theo các bớc sau đây :
1. Mô tả phổ biên độ và phổ pha H(m,n) bằng một mảng có kích thớc M
ì
M mà điểm tần
số zero (0,0) nằm tại điểm







2
,
2
MM
. M phải là bội số của 2.
2. Rút ra IFFT của H(m,n)(-1)
m+n
. Kết quả là đáp ứng xung h(m,n)(-1)
m+n

có trung tâm
nằm tại






2
,
2
MM
.
3. Để bộ lọc có bậc N
ì
N, N lẻ, hệ số bộ lọc (giá trị của h(m,n)) chứa trong một cửa sổ kéo
dài từ











2
1
2
,
2
)1(
2
NMNM
đến







+

+
2
1
2

,
2
)1(
2
NMNM
.
4. Các bớc trên có liên quan đến việc sử dụng hàm cửa sổ hình chữ nhật mà nó có thể đợc
mô tả nh sau:
146
w(m,n) = 1 với
M N
m
M N
2
1
2 2
1
2








+























+














M N
n
M N
2
1
2 2
1
2
(8.1)
= 0 với các trờng hợp còn lại.
Các hệ số của bộ lọc cho bởi
h(m,n)w(m,n)
Hình 8.1 chỉ ra phổ biên độ của bộ lọc 5 ì 5 đợc thiết kế sử dụng cửa sổ hình chữ nhật
và tận dụng các đặc điểm:






<+=
=
lại. còn hợp trường cáccho
với
c
1
8,0 0

),(
2
2
2
1
21
srad
H



Những dao động trong giải thông rất đáng đợc chú ý. Các dao động do sự hội tụ chậm
của các hệ số trong chuỗi Fourier cho sự chuyển đổi đột ngột về đặc tính tần số -biên độ.
Nhắc lại rằng đáp ứng tần số đợc coi nh tuần hoàn và IFFT về cơ bản cùng dẫn đến hệ số
Fourier của hàm tuần hoàn. Đây cũng là đáp ứng xung hay hệ số của bộ lọc FIR.
8.3 Hàm cửa sổ
Các hàm cửa sổ để làm giảm bớt các dao động Gibbs đợc rút ra từ thiết kế của bộ lọc
FIR 1-D. Các hàm cửa sổ hay đợc đợc sử dụng nhất sẽ không liệt kê theo bảng dới đây
cùng sự mở rộng của chúng sang trờng hợp 2-D.
Cửa sổ Hann và Hamming. Cửa sổ Hann và Hamming cho bởi

( )






+
=

0
1
2
cos1
)(
N
n
nW
H



(8.2)
Có hai lựa chọn khác nhau của . Trong cửa sổ Hann = 0.5 và trong cửa sổ Hamming
= 0. 54. Bậc của bộ lọc đợc cho là N.
Cửa sổ Blackmann. Cửa sổ Blackmann cho bởi :

1
4
cos08,0
0
1
2
cos5,042,0)(

+









+=
N
n
N
n
nW
B

(8.3)
Các thành phần cosin thêm vào dẫn đến sự suy giảm biên độ của các dao động Gibbs.
Cửa sổ Kaiser. Cửa sổ Kaiser cho bởi
147
với |n|

N 1
2
với các trờng hợp còn lại.
với |n|

N 1
2
với các trờng hợp còn lại
với |n|

N 1
2

với các trờng hợp còn lại






=
0
)(
)(
)(
0
0


I
I
nW
K
(8.4)
Hình 8.1 Đáp ứng tần số của bộ lọc FIR với
c
= 0.8.
ở đây là tham số độc lập và


=








1
2
1
2
n
N

I
0
(x) là hàm Bessel bậc 0 loại 1. Nó có thể ớc lợng đến độ chính xác bất kỳ bởi dùng một
d y hội tụ ã
I
0
(x) = 1 +
1
2
1
2
k
x
k
k
!















=


Hàm cửa sổ 2-D cơ bản dựa trên các hàm cửa sổ 1-D cung cấp ở trên. Sự mở rộng của
bất kỳ hàm cửa sổ 1-D nào ở trên sang 2-D đợc tiến hành bằng cách thay thế n bằng

n n
1
2
2
2
2
+
(8.5)
Chia cho
2
để đảm bảo rằng giá trị của n không vợt quá (N - 1)/2, giá trị lớn nhất
trong trờng hợp 1-D.

Hàm cửa sổ 2-D đợc sinh ra từ hàm cửa sổ 1-D qua các biểu thức:
w(n
1
,n
2
) = w(n
1
)w(n
2
) (8.6)
ứng dụng của hàm cửa sổ trên đợc rút ra đơn giản bằng thay thế đáp ứng xung h(n
1
,n
2
)
bằng h(n
1
,n
2
)w(n
1
,n
2
). Chơng trình sau cho phép bạn thiết kế bất kỳ bộ lọc cửa sổ chữ nhật
148
hay bất kỳ cửa sổ nào đợc mô tả trong phần trớc bằng cách dùng biểu thức (8.5) để mở rộng
từ 1-D sang 2-D. Bộ lọc trong chơng trình này đợc thiết kế dùng FFT 2-D, loại cửa sổ đợc
chọn bởi ngời dùng.
Chơng trình 8.1 "FIRD.C" Thiết kế các bộ lọc dùng FFT và các hàm cửa sổ.
/* Program for designing FIR filter using FFT on prescribed

frequency specifications.Option for selecting a Window function is
provided.
For the magnitude-frequency specifications you can either supply
your own data or select from a menu of standard functions.
If you supply your own data the first two values should be the
dimensions of the 2-D array e.g. 32 32.
These dimensions should be equal to some power of 2. The data that
follows is the magnitude specifications in "%f " format stored in a
row by row fashion with no return code after every row.*/
#define pi 3.141592654
#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <ctype.h>
#include <conio.h>
#include <string.h>
void bit_reversal(unsigned int *, int , int);
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 M,M1,m,n2,i,j,ii,jj,k;
int Nt,n,M2,M3,N,N1,ind,yt;
unsigned int *L;

float *wr,*wi,Do,winc,Do1,Do2;
float win,T,alpha,beta,sum1,sum2;
float nsq,nsqrt;
FILE *fptri,*fptro,*fptr;
float *buffi,*buffo,R2,H;
float xrm,xim,xrn,xin,zrt,zit,mag,theta;
float *w,**h,r1,im;
unsigned char file_name[14], ch,ch1,choice,file_name1[14];
clrscr() ;
printf("Freq. response can be calculated using standard \n");
printf(" functions which you can select from a menu if your\n");
printf(" reply to the following question is negative.\n");
printf("Is freq. response provided in a file? (y or n)-->");
while(((ch1=getch())!='y')&&(ch1!='n'));
putch(ch1);
149
switch(ch1)
{
case 'n':
printf("\n Enter # of points to be generated (e.g. 32x32)-->");
scanf("%dx%d",&M1,&M1);
break ;
case 'y':
printf("\nEnter name of file storing magnitude response-->");
scanf("%s",file_name1);
fptr=fopen(file_name1,"r");
fscanf(fptr,"%d %d 11,01,&Mi");
}
M=M1>>1 ;
yt=wherey();

again1 :
gotoxy(1,yt);
printf( " ");
gotoxy(1,yt);
printf("Enter file name for storing impulse response--->");
scanf("%s",file_name);
if(((stricmp("FFT.DAT",file_name))==0)||
((stricmp("TEMP.DAT",file_name))==0)||
((stricmp("IFFT.DAT",file_name))==0))
printf("This is a reserved file name. Use some other name.");
goto again1;
gotoxy(1,yt);
printf ( " ");
ind=access(file_name,0);
while(!ind)
{
gotoxy(1,yt+1);
printf ( " ");
gotoxy(1,yt+1);
printf("File exists. Wish to overwrite? (y or n)-->");
while(((ch=tolower(getch()))!='y')&&(ch1='n'));
putch(ch);
switch(ch)
{
case 'y' :
ind=1 ;
break;
case 'n' :
gotoxy(1,yt+1);
printf(" ");

gotoxy(1,yt);
printf("Enter file name -->");
scanf("file_name");
ind=access(file_name,0);
}
}
fptri=fopen("FFT.DAT","wb+");
fptro=fopen("IFFT.DAT","wb+");
buffi=(float *)malloc((M1<<1)*sizeof(float));
switch(ch1)
{
150
case 'n': /*Generating data for IFFT.*/
printf("\nEnter choice (1,2 etc.):\n");
printf(" 1. Low-pass.\n");
printf(" 2. High-pass.\n");
printf(" 3. Band-pass.\n");
printf(" 4. Band-reject.->");
while(((ch=getche())!='1')&&(ch!='2')&&(ch!='3')&&(ch!='4'));
switch(ch)
{
case '1' :
case '2' :
printf("\nEnter cut-off freq. in rad./sec.(cut-off <= n.)->");
scanf("%f",&Do);
Do=(Do/pi)*(float)M;
Do*=Do;
printf("Enter choice:\n");
printf(" 1. Abrupt transition.\n");
printf(" 2. Butterworth.\n");

printf(" Enter 1 or 2 --- >");
while(((choice=getche())!='1')&&(choice!='2'));
printf("\n");
break;
case '3':
case '4':
printf
("\nEnter lower cut-off freq. in rad./sec. (cut-off <=n.");
scanf("%f",&Do1);
Do1=(Do/pi)*(float)M;
Do1*=Do1;
printf
("\nEnter upper cut-off freq. in rad./sec.cut-off<= n.)->");
scanf("%f",&Do2);
Do2=(Do/pi)*(float)M;
Do2*=Do2;
}
for(i=0;i<M1;i++)
{
ii=(i-M)*(i-M);
for(j=0;j<M1;j++)
{
R2=(float)((j-M)*(j-M)+ii);
switch(ch)
{
case '1': /* low-pass. */
if(choice=='1')
{
if(R2<Do) H=(float)1.0;
else H=(float)0.0;

}
if(choice=='2')
H=0.414*Do/(R2+0.414*Do);
break;
case '2': /* high-pass. */
if(choice=='1')
{
151

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×