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

Giáo trình xử lý ảnh y tế Tập 1a P15 pptx

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 (342.28 KB, 10 trang )


126
xr[j]=xr[j]+Tr;
xi[j]=xi[j]+Ti;
}
if(iter!=0)
{
for(k=1; k<ip; k++)
{
i=k*kk-1;
for(j=k; j<N; j+=incr)
{
i=j+ip;
Tr=xr[i]*wr[l]-xi[i]*wi[l];
Ti=xr[i]*wi[l]+xi[i]*wr[l];

xr[i]=xr[j]-Tr;
xi[i]=xi[j]-Ti;

xr[j]=xr[j]+Tr;
xi[j]=xi[j]+Ti;
}
}
}
kk>>=1 ;
ip<<=l ;
incr<<=l ;
}
}

/*****************************************************


*****
This procedure is for obtaining the transpose of a
large file of complex numbers stored on secondary
memory.
We assume that the file is large to the point that it
would
not fit in active memory.
******************************************************
*****/
struct COMPLEX
{
float REAL;

127
float IMAG;
} ;

void transpose(FILE *fptr, int N, int n)
/* Algorithm */
{
int N1 , inc ;
int iter,i,k;
int k1,inc1;
int k2,j,k3,k4,NS;
struct COMPLEX *buff1,*buff2,tmp;
long loc,NT;

NS=sizeof(struct COMPLEX);
NT=N*NS ;
buff1=(struct COMPLEX *)malloc(NT);

buff2=(struct COMPLEX *)malloc(NT);

N1=N/2 ;
inc=1 ;
inc1=2 ;
for(iter=0;iter<n;iter++)
{
gotoxy(1,6);
printf(" Iteration number %4c.",(iter+1));
k1=0 ;
for(k=0;k<N1;k++)
{
for(i=k1;i<(k1+inc);i++)
{
loc=NT*(long)(i);
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1);
}
else
fread(buff1,NT,1,fptr);
loc=NT*(long)(j+inc);
if(fseek(fptr,loc,SEEK_SET)!=0)
{

128
perror("fseek failed");
exit(1) ;
}

else
fread(buff2,NT,1,fptr);
k3=0 ;
for(k2=0;k2<N1;k2++)
{
for(j=k3;j<(k3+inc);j++)
{
tmp=*(buff1+j+inc);
*(buff1+j+inc)=*(buff2+j);
*(buff2+j)=tmp;
}
k3+=inc1 ;
}

loc=NT*(long)i;
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1);
}
else
fwrite(buff1,NT,1,fptr);
loc=NT*(long)(i+inc);
if(fseek(fptr,loc,SEEK_SET)!=0)
{
perror("fseek failed");
exit(1) ;
}
else
fwrite(buff2,NT,1,fptr);

}
k1+=inc1;
}
inc*=2 ;
inc1*=2 ;
N1/=2 ;
}
}

129


Bài tập 6.5 Cho các mảng 2-D

X 










1 1 1
1 1 1
0 0 0
và Y 











1 1 1
1 1 0
1 0 0

Phát triển một chương trình C thực hiện

1. Phát triển chương trình C tính tích chập tuần hoàn giữa hai dãy trong miền
không gian.
2. Phát triển chương trình C mà sẽ thêm các điểm 0 để mỗi chiều của mảng
có độ dài ít nhất là 3 + 3 – 1 = 5 và định dạng tích chập tuần hoàn qua
DFT.
3. Dùng chương trình 6.6 để đưa ra tích chập tuần hoàn qua 2-D FFT.
6.6 Hiển thị FFT
Nếu FFT của một ảnh trong trường hợp tổng quát là một mảng của các số phức
đầy đủ, người ta thường biểu diễn biên độ và pha của tần số của ảnh. Hai yếu tố
này biểu diễn tính chất của ảnh. Thông thường biên độ tần số được biểu diễn
riêng lẻ và gọi là phổ biên độ. Mặc dù vậy, như chúng ta đã nghiên cứu, pha đóng
vai trò quan trọng trong xử lý ảnh, và hợp không hợp lý khi chỉ biểu diễn phổ biên
độ của ảnh. Để biểu diễn phổ dưới dạng ảnh, tất cả các việc chúng ta cần phải làm
là chia biên độ của FFT thành các giá trị từ 0 đến 255 (cho ảnh 8 bit). Dù thế nào
đi chăng nữa thì phổ của ảnh cũng bị suy giảm rất nhanh khi tần số tăng lên. Vì

vậy mà vùng tần số cao sẽ trở nên lu mờ khi biểu diễn phổ dưới dạng ảnh. Để giải
quyết vấn đề này chúng ta cần xử lý biên độ phổ một chút bằng hàm log. Hàm
logarit sẽ sửa độ khuếch đại, và thay thế cho hiển thị phổ |H(u,v)| chúng ta hiển
thị:
D(u,v) = log
10
(1+|H(u,v)|) (6.67)
Biểu thức này cho ta giá trị zero khi D(u,v) = 0 hay |H(u,v)| = 0 và như vậy
D(u,v) luôn luôn có giá trị dương. Một chương trình dùng để chuyển đổi phổ
thành dạng ảnh được cho ở chương trình 6.7. Hình 6.13 giới thiệu phổ của ảnh
"IKRAM.IMG" trong hình 3.2a sau khi được chuyển đổi dùng biểu thức (6.67).
Điểm tần số (0,0) nằm ở trung tâm màn hình. Chú ý phổ ảnh giảm xuống rất
nhanh chóng khi tần số tăng lên.


130
Chương trình 6.7 " DISP_FFT.C" Chương trình dùng để đưa ra một file
chứa phổ tần số trong dạng ảnh có thể hiển thị được.

/************************
* Program developed by: *
* M.A.Sid-Ahmed. *
* ver.1.0 1992. *
*************************/
/****************************************************
Program for calculating the magnitude of the 2-D FFT
given a file containing the complex values of the FFT
of an image. The result is placed in a form suitable
for display in image form and stored in an external
file. The mapping function D(u,v)=log10(1+ |(F(u,v)|)

is used.
******************************************************
/

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

void main()
{
int i,j,k,N,NB1,NB2;
FILE *fptri, *fptro,*fptrt;
double nsq;
float max,min,xr,xi,scale;
float *buffi,*bufft;
char *buffo;
char file_name[14];


1
31

Hình 6.13 Phổ của "IKRAM.IMG"
clrscr();
printf(""Enter name of file containing FFT data >
");
scanf("%s",file_name);


fptri=fopen(file_name,"rb");
printf("Enter name of file for storing magnitude data
-> ");
scanf("%s",file_name);
fptro=fopen(file_name,wb");
fptrt=fopen("temp.img","wb+");
nsq=(double)(filelength(fileno(fptri))/(2*sizeof(float
)));
N=(int)(sprt(nsq));
max=0.0; min=1.0e9;

NB1=(N<<1)*sizeof(float);
NB2=NB1>>1;

buffi=(float *)malloc(NB1);

132
bufft=(float *)malloc(NB2);
buffo(char *)malloc(N*sizeof(char));
for(i=0;i<N;i++)
{
fread(buffi,NB1,1,fptri);
for(j=0;j<N;j++)
{
k=j<<1;
xr=buffi[k];
xi=buffi[k+1];
bufft[j]=(float)sqrt((double)(xr*xr+xi*xi));
bufft[j]=(float)log10((double)(1+bufft[j]));

if(bufft[j]>max) max=bufft[j];
if(bufft[j]<min min=bufft[j];
}
fwrite(bufft,NB2,1,fptrt);
}
fclose(fptri);
fseek(fptrt,0,SEEK_SET);
scale=(float)255.0/(max-min);
for(i=0;i<N;i++)
{
fread(bufft,NB2,1,fptrt);
for(j=0;j<N;j++)
buffo[j]=(char)((bufft[j]-min)*scale);
fwrite(buffo,N,1,fptro);
}
fclose(fptro);
fclose(fptrt);
remove("temp.img");
}

Bài tập 6.6 Tính 2D_FFT của " IKRAM.IMG" và hiển thị |H(u,v)| thay thế
cho hiện thị D(u,v). Chú ý dến sự suy giảm phổ ảnh và so sánh với trường hợp
hiển thị ảnh rút ra bởi chương trình 6.7.

Bài tập 6.7 Lập một chương trình 2-D FFT theo các bước sau:
1. Thuật toán phân chia tần số.
2. Thuật toán giảm lược đầu vào.
3. Thật toán giảm lược đầu ra.

133

4. Dùng thuật toán giảm lược đầu ra thiết kế một bộ lọc 2-D FIR thông
thấp vói D
0
= 0.3, kích thước 11  11. So sánh ví dụ 2.5 trong chương 2.
6.7 Bộ lọc hai chiều dùng FFT
Nếu dùng tích chập để chuyển hàng loạt các phần tử từ miền không gian sang
miền tần số ta nên áp dụng FFT. Phép biến đổi này yêu cầu 2. (N
2
/2). log
2
N phép
nhân phức và 2. N
2
. log
2
N phép cộng phức để thu được 2-D FFT, N
2
phép nhân
phức trong miền tần số giữa FFT của điểm ảnh và các đáp ứng tần số cuả bộ lọc,
2 . (N
2
/2) . log
2
N phép nhân phức cho IFFT. Mặt khác, một bộ lọc 2-D FIR có
kích thước (2m + 1)  (2m + 1) đòi hỏi (2m + 1)
2
N
2
phép nhân để thu được ảnh
trực tiếp trong miền không gian. Xem xét một ảnh có kích thước 512  512

điểm. FFT yêu cầu:
4 4 2 4 4 512 2 9 1
2
2
2 2
( ( / )log ) ( )N N N     
 20 triệu phép nhân.
Để đưa ra tính toán này chúng ta coi rằng một phép nhân phức thì bằng 4 phép
nhân thông thường, và bộ lọc có pha zero. Phương pháp không gian áp dụng cho
một bộ lọc có kích thước 7  7 yêu cầu 7  7  512
2
 13 triệu phép nhân. Nếu
kích thước bộ lọc tăng lên thì phương pháp phân chia miền tần số có thể áp dụng.
Một bộ lọc có kích thước 11  11 yêu cầu khoảng 30 triệu phép nhân sẽ chỉ cần
khoảng 19 triệu phép nhân khi áp dụng phương pháp phân chia miền tần số. Hai
phương pháp này sẽ có cùng một số phép nhân nếu


22
2
2
N 1) (2m 1) N (2log 4N 
Cho một ảnh có kích thước 512  512 (2m + 1)  9, dễ chứng minh là nếu kích
thước bộ lọc nhỏ hơn 9 thì ta có thể phương pháp phân chia không gian. Tuy
nhiên, cần chú ý phương pháp phân chia tần số cũng yêu cầu ít thời gian xử lý
hơn do số lần truy nhập đĩa giảm xuống. Ưu điểm này được tăng lên khi kích
thước của bộ lọc lớn hơn 9  9. Ưu điểm này sẽ không còn nữa khi xét đến lỗi
wraparound. Để tránh lỗi này ta phải tăng gấp bốn lần kích thước của ảnh. Cho
một ảnh có kích thước 512  512 ta cần phải tăng lên 1024  1024. Để tránh các
phép tính toán quá lớn khi chú ý rằng h(n

1
, n
2
) của một bộ lọc khi rút ra IFFT sẽ
tăng lên rất nhanh khi n
1
, n
2
tăng lên. Tính chất này càng nổi bật khi mở rộng
Fourier chỉ chèn các giá trị zero vào các giá trị cuối của bộ lọc từ c n n/
1
2
2
2
 .
Cần nhắc lại là cả đáp ứng tấn số và đáp ứng xung được xem xét khi làm việc với
DFT.

134
Thuộc tính là h(n
1
, n
2
) tăng lên một cách nhanh chóng được xem xét khi lựa
chọn phương án lọc. Không phụ thuộc vào kích thước của ảnh, đưa ra phép nhân
giứa đáp ứng tần số của ảnh và đáp ứng tần số của bộ lọc, và chúng ta chú ý rằng
lỗi wrapapound chỉ xuất hiện ở miền nhỏ nằm ở đường bao của ảnh và trong phần
lớn trường hợp lỗi này có thể bỏ qua.
Phương pháp tần số có thể thực hiện qua các bước sau:


1. Rút ra 2-D FFT của một ảnh



21
)1)(,(),(
2
1
2
1
nn
nniFFTkkI


2. Nhân I(k
1
, k
2
) với đặc tuyến của bộ lọc, chú ý là đáp ứng tần số có gốc toạ độ
nằm tại (N/2, N/2). Cho ví dụ một bộ lọc thông cao Butterworth có đặc tuyến
như sau:

2
0
2
2
2
1
2
2

2
1
21
)12(
),(
D
H







Dùng )
2
(
2
11
N
k
N



)
2
(
2
22

N
k
N





Đáp ứng tần số của ảnh lọc có thể rút ra từ
))
2
(
2
),
2
(
2
()()(
212121
N
k
N
N
k
N
HkkIkkG 
3. Ảnh đã lọc có thể rút ra từ :

21
)1()},({{),(

2121
nn
f
kkGIFFTnni


ở đây  có nghĩa là phần thực của phần nằm trong hai dấu ngoặc.

Bài tập 6.8 Viết một chương trình lọc 2-D trong mặt phẳng tần số. Kiểm tra
chương trình dùng cùng một đặc tuyến tần số dùng thiết kế bộ lọc FIR lọc ảnh
trong hình 2.3 (chương 3) và so sánh kết quả.
6.8 Vector biến đổi Fourier
Qua chiến lược chia để trị ta đạt được hiệu suất tính toán trên máy tính của giải
thuật 1-D FFT. Thuật toán FFT vector 2-D sau đâylà cùng một chiến lược. Giải
thuật DFT 2-D được xen kẽ với những giải thuật DFT 2-D nhỏ hơn, cuối cùng chỉ
DFT 2-D của phần tử đơn được tính. Chúng ta sẽ kiểm tra vector FFT. Chúng ta


135

2211
21
),(),(
2
1
0
1
1
0
21

knkn
N
N
k
N
k
WkkhnnH







ở đây
N
j
N
eW

2

Vì vậy có thể viết lại như sau:

2211
21
2
2
211
1

2
2
1
2
0
1
1
2
0
1
2
0
2
21
1
2
0
21
)12,2(
)2,2(),(
knkn
N
N
k
N
k
n
N
N
k

knkn
N
N
k
WkkhW
WkkhnnH

















Tương tự với trường hợp1-D chúng ta có thể viết

),(),(
),(),(),(
21112110
2101210021
212

1
kkFWkkFW
kkFWkkFnnH
nn
N
n
N
n
N



(6.68a)

),(),(
),(),(),
2
(
21112110
2101210021
212
1
kkFWkkFW
kkFWkkFn
N
nH
nn
N
n
N

n
N



(6.68b)

),(),(
),(),()
2
,(
21112110
2101210021
212
1
kkFWkkFW
kkFWkkF
N
nnH
nn
N
n
N
n
N



(6.68c)
2211

21
21
2211
21
1
2
2
1
2
0
1
1
2
0
2
2
1
2
0
1
1
2
0
)12,12(
)2,12(
knkn
N
N
k
N

k
nn
N
knkn
N
N
k
N
k
n
N
WkkhW
WkkhW
















×