Xem mẫu

  1. ip=1; kk=(N>>1 ); incr=2; for(iter=0; iter
  2. i=j+ip; xr[j]=xr[j]+xr[i]; xi[j]=xi[j]+xi[i]; } for(k=1; k=1; ip
  3. n2 = 0,1,2,..., N-1 Biểu thức e  j 2 / N ( n k  n k ) trong hai dấu tổng gọi là hạt nhân của phép biến đổi. 11 22 H(n1,n2), trong trường hợp tổng quát, đầy đủ có thể biểu diễn theo: H(n1 , n 2 )  A(n1 , n2 ) e j (n1 ,n2 ) Trong không gian ba chiều, A(n1,n2) và (n1,n2) nằm tại vị trí của n1 và n2 và gọi là phổ tần số và phổ pha của H(n1,n2). 6.4.1 Biến đổi ngược 2-D DFT Hàm h(k1,k2) là biến đổi ngược của 2-D DFT (IFFT) của H(n1,n2) và được cho bởi biểu thức N 1 N 1 1   H (n1 , n2 )e j 2 / N .(n k n k ) (6.42) h(k1 , k 2 )  11 22 2 N n1  0n2 0 6.4.2 Một số tính chất của 2-D DFT Chuyển đổi. Từ định nghĩa của 2-D DFT và IDFT cho thấy j 2 ( ak1  bk 2 ) (6.43) N  H (n1  a, n 2  b) h( k 1 , k 2 ) e j 2 ( n1a  n2 b ) (6.44) N h(k1  a, k 2  b)  H (n1 , n 2 )e Điều đó có nghĩa là một dịch chuyển pha tuyến tính trong một miền biểu diễn bằng một dịch chuyển hằng số trong một miền khác. Xem xét biểu thức (6.43), trường hợp đặc biệt khi a = b = N/2. h(k1 , k 2 )e j ( k1  k2 )  h(k1 , k 2 )(e j ) k1  k2 )  h(k1 , k 2 )(1) k1  k2 Hay là N N h(k1 , k 2 )(1) k1 k2  H (n1  (6.45) , n2  ) 2 2 Nói cách khác, bằng cách nhân vào mỗi điểm (-1) k  k trước khi lấy DFT, chúng 1 2 ta sẽ rút ra được một phổ tần số mà điểm tần số (0,0) của nó sẽ nằm giữa mảng 2- D. Biểu thức này rất hữu dụng trong hiển thị phổ tần số, phổ biên độ và lọc dùng DFT. Từ biểu thức (6.44) chúng ta rút ra kết luận rằng dịch chuyển một hằng số trong ảnh sẽ không tác động đến phổ biên độ. H (n1  n2 )e  j 2 / N .( n1a  n2b)  H (n1  n2 ) (6.46) 108
  4. Biểu thức (6.46) cũng quan hệ đến bộ lọc 2-D. Xem xét đặc tính của bộ lọc 2- D cho bởi H (n1 , n2 )  A(n1 , n 2 )e  j 2 / N .( n1a  n2b) ở đây A(n1,n2) là phổ biên độ. Nếu một ảnh với phổ tần số cho bởi I(n1,n2) được lọc qua bộ lọc có đặc tuyến pha tuyến tính cho bởi biểu thức ở trên, kết quả sẽ là [| A(n1 , n2 )e  j 2 / N .( n1a n2b) ]I (n1 , n2 )  [ I (n1 , n2 ) A(n1 , n2 )]e  j 2 / N .( n1a n2b )  i f (n1 - a, n 2 - a) (6.47) ở đây if (n1-a, n2-b) ký hiệu cho ảnh đã được lọc. Một bộ lọc với đặc tuyến pha tuyến tính có nghĩa là không dịch chuyển biên độ. Trong khi đó nếu bộ lọc có đặc tuyến pha không tuyến tính thì pha của ảnh cũng bị biến dạng. Lý do của sự biến dạng này là tất cả các điểm đều phải chịu một sự dịch chuyển vị trí khác nhau tuỳ theo vị trí của ảnh. Tổng quát, ảnh đã được lọc có thể cho bởi i f (n1 - f (n1 , n2 ), n2 - f( n1 , n 2 )) ở đây f là hàm dịch chuyển vị trí. Chú ý rằng một ảnh biến dạng pha sẽ xuất hiện trên màn hình như một ảnh mờ . Tính đối xứng liên hợp và tuần hoàn. Biến đổi2-D DFT và IDFT tuần hoàn với chu kỳ N có nghĩa là : H(n1 , n2 )  H(n1  N, n2 )  H(n1 , n2  N) (6.48)  H(n1  N, n2  N) và h(k 1 , k 2 )  h(k 1  N, k 2 )  h(k 1 , k 2  N) (6.49)  h(k 1  N, k 2  N) Biến đổi DFT đối xứng liên hợp khi (6.50) H(n1 , n 2 )  H * (-n1 , - n 2 ) hoặc (6.51) H(n1 , n 2 )  H(-n1 , - n 2 ) Quay. Nếu chúng ta đặt k1 và k2 dưới dạng k 2  r cos k1  r sin 109
  5. h(k 1 , k 2 )  h( rsin , rcos )  h (r, ) thì Và tương tự cho n1, n2 n2   cos n1   sin H(n1 , n 2 )  H (r, ) hoặc từ định nghĩa của DFT chúng ta có thể có (6.52) h(r ,   0 )  H ( ,   0 ) Điều đó có nghĩa là nếu ảnh bị quay đi một góc 0 thì phổ của nó cũng bị quay đi một góc như vậy. Phân phối và chia độ. Từ biểu thức (6.1) chúng ta dễ thấy (6.53) a h1 (k 1 , k 2 )  b h2 (k 1 , k 2 )  aH 1 (n1 , n2 )  bH 2 (n1 , n 2 ) ở đây a,b là những độ chia. Cũng như vậy nn 1 H( 1 , 2 ) (6.54) h(ak1 , bk 2 )  ab ab 6.4.3 Giá trị trung bình Mức cường độ sáng trung bình trong một ảnh cho bởi : N 1 N 1 1   h( k , k (6.55) h 2 ) 1 2 N k1  0 k1  0 hoặc từ biểu thức (6.1) ta có thể viết h  H (0,0) Điều này có nghĩa là H(0,0) biểu diễn mức sáng của ảnh. 6.4.4 Tích chập và sự tương quan Tích chập của tín hiệu 2-D h1(k1,k2) và h2(k1,k2) cho bởi N 1 N 1   h (k , k (6.56) g (n1 , n2 )  )h2 (n1  k1 , n2  k 2 ) 1 1 2 k1  0 k 2  0 Nếu h1(k1,k2) được xác định trên miền  k     0, A  1  k1  0, B  1 1 và nếu h2(k1,k2) được xác định trên miền 110
  6. k    0, C  1   k 1 0, D  1 1 thì chúng ta có thể thấy rằng nếu hai tín hiệu có giá trị zero ngoài miền xác định của chúng thì M = A + C - 1 và N = B + D - 1. Tích chập của hai tín hiệu 2-D được viết trong dạng ký hiệu như sau: h1 (k 1 , k 2 )* h2 (k 1 , k 2 ) Có thể thấy rằng (6.57) h1 (k 1 , k 2 )* h2 (k 1 ,k 2 )  H 1 (n1 , n2 )H 2 (n1 , n2 ) Điều này có nghĩa là, tích chập trong miền không gian biến thành phép nhân bình thường trong miền tần số. Tính chất này có thể dùng cho lọc 2-D qua DFT. Chúng ta cần nhớ lại rằng bạn đã dùng kỹ thuật lọc FIR trong các chương trước cho chức năng này. Khi áp dụng các lọc bộ lọc FIR cho chức năng lọc bạn cần lấy tín hiệu khoảng cách 2-D đã được biến thành tín hiệu có chu kỳ trước khi tiến hành lấy DFT. Sự không đồng bộ của chu kỳ trong biến đổi này cũng gây ra lỗi như trong biến đổi 1-D. Vì vậy, để tránh trường hợp này ta cần thêm các số 0 vào cả hai các hàm không gian để cho chúng có kích thước M  N với M  A + C - 1 và N  B + D - 1. Tương quan hoặc tương quan chéo của tín hiệu 2-D định nghĩa bởi N 1 N 1   h (k , k (6.58) g (n1 , n2 )  )h2 (n1  k1 , n2  k 2 ) 1 1 2 k1  0 k 2  0 Biểu thức này được viết dưới dạng ký hiệu g (n1 , n2 )  h1 ( k1 , k 2 )  h2 ( k 1 , k 2 ) (6.59) Tương quan chéo thường được gọi là lọc kết hợp và dùng để phát hiện ra phần đầu dấu hiệu các vết sắc nổi trên ảnh. Nó có thể cho thấy rằng h1 ( k 1 , k 2 )  h2 ( k1 , k 2 )  H1 (n1 , n2 ). H 2 (n1 , n2 ) (6.60) 6.5 2-D FFT Biểu thức cho 2-D DFT có thể dưới dạng N 1 N 1  [  h(k1 , k 2 )e  j.2 / N .n k ]e  j.2 / N .n1k1 (6.61) H (n1 , n2 )  22 k1 0 k 2 0 N 1  h(k1 , k 2 )e  j.2 / N .n 21k 21 Đặt (6.62) G (k1 , k 2 )  k2  0 111
  7. với k1 = 0,1,2,..., N-1. Vì vậy mà biểu thức (6.61) có thể viết lại dưới dạng . N 1  G( k , n )e  j .2 / N .n1k1 (6.63) H (n1 , n2 )  1 2 k1  0 với n1=0,1,2,...,N-1. Biểu thức (6.62) có thể mở rộng ra thành N 1  h(0, k 2 )e  j.2 / N .n k G (0, n 2 )  22 k2 0 N 1  h(1, k 2 )e  j.2 / N .n k G (1, n2 )  22 k 2 0 . . . ...v.v... Mỗi biểu thức trên biểu diễn DFT của một hàng trong ảnh. Biểu thức (6.63) cũng có thể mở rộng ra thành: N 1  G (k1 ,0)e  j.2 / N .n k H (n1 ,0)  22 k1 0 N 1  G(k1 ,1)e  j.2 / N .n k H (n1 ,1)  22 k1 0 . . . ...v.v... Các biểu thức này dẫn ta đến giải thuật sau đây tính FFT hai chiều: 1. Tính 1-D FFT cho tất cả các hàng, và chứa kết quả vào mảng trung gian. 2. Dịch chuyển mảng trung gian. 112
  8. 3. Rút ra 1-D FFT cho tất cả các hàng của mảng dịch chuyển trung gian. Kết quả là dịch chuyển của mảng 2-D FFT. Chúng ta có thể viết biểu thức (6.61) có dạng N 1 N 1  [  h(k1 , k 2 )e  j.2 / N .n k ]e  j .2 / N .n2k21 (6.64) H (n1 , n2 )  1 12 k 2 0 k1 0 Nếu chúng ta đặt N 1  h(k1 , k 2 )e  j.2 / N .n k (6.65) G (n1 , k 2 )  11 k1 0 với k2 = 0,1,2,..., (N-1) thì N 1  j.2 / N .n2 k21  G (n1 , k1 )e (6.66) H (n1 , n2 )  k1  0 với n1 = 0,1,2,..., (N-1). Các biểu thức này dẫn chúng ta đến thuật toán tính 2-D FFT sau 1. Dịch chuyển file ảnh. 2. Tính FFT theo từng hàng một của ảnh đã được đọc. 3.Dịch chuyển kết quả trung gian. 4. Rút ra một hàng kề hàng FFT của dịch chuyển kết quả trung gian. Kết quả ta sẽ được 2-D FFT. Trong cả hai phương pháp dùng để rút ra 2-D FFT, kết quả trung gian đều đã phải dịch chuyển. Phương pháp đầu tiên thường hay được sử dụng hơn vì nó chỉ yêu cầu một phép toán dịch chuyển. Kết quả là một dịch chuyển của mảng 2-D FFT, có thể dùng trực tiếp dưới dạng ấy mà không đòi hỏi một phép dịch chuyển thứ hai. Chắc bạn sẽ có một câu hỏi rằng tại sao chúng ta cần phải dịch chuyển. Lý do của sự dịch chuyển này là hệ thống của bạn có thể không có đủ bộ nhớ kích hoạt (RAM) để lưu trữ kết quả trung gian hoặc là FFT của ảnh. Nếu bạn có đủ bộ nhớ RAM thì việc dịch chuyển này là không cần thiết, và bạn có thể đọc thẳng từn g 113
  9. cột từ bộ nhớ kích hoạt. Dù sao đi chăng nữa thì sự lựa chọn vẫn là đọc thẳng từng cột và có kết quả trung gian chứa theo hàng. Nếu là như vậy, chúng ta sẽ cần N  N dữ liệu thêm vào từ đĩa cứng, yêu cầu thời gian nhiều hơn. Nói một cách khác, dịch chuyển file dẫn đến từng hàng một trong FFT của kết quả trung gian, đòi hỏi nhiều hơn N lần truy nhập đĩa. Câu hỏi bây giờ là làm thế nào chúng ta có thể dịch chuyển một file trong trường hợp không thể chuyển tất cả dữ liệu một lần vào bộ nhớ kích hoạt. Trong phần tiếp theo chúng ta sẽ đề cập đến phương pháp Eklundh để giải quyết vấn đề này. 6.5.1 Ma trận dịch chuyển từ bộ nhớ ngoài Thuật toán được giải thích rõ ràng nhất bằng một ví dụ đặc biệt. Xem xét ma trận có kích thước 7  7 ở hình 6.10. Các bước của thuật toán thể hiện rõ ràng trên hình 6.10. Bạn cần chú ý rằng chương trình đòi hỏi ba lần lặp lại để dịch chuyển 23  23. Trong tất cả các lần lặp lại bạn cần phải giữ một ma trận có kích thước lại trong bộ nhớ kích hoạt tại hai hàng cuối cùng, cho phép lặp, tất cả là yêu cầu yêu cầu N lần truy nhập đĩa cho xử lý một ảnh có kích thước N  N. Nếu N = 2r thì r  N số lần truy nhập đĩa để dịch chuyển một ảnh, ít h ơn nhiều so với N  N lần truy nhập trong cách xử lý đọc một ảnh cơ bản từng khối một. Số lần truy nhập đĩa có thể giảm xuống bởi đọc, ví dụ, bốn hàng hoặc tám hàng một lúc. Thuật toán trong trường hợp tổng quát có thể coi như là sự phát triển của giải thuật FFT. Bạn cần phát triển hai lưu đồ, một để lựa chọn hàng có thể đã được thêm dữ liệu vào và một để phát hiện ra phần tử đã thay đổi. Những thuật toán này coi như là một bài tập. Mã của chương trình nguồn cho tất cả các thuật toán này cho ở chương trình 6.5. Chương trình 6.5 “TRANSPOS.C” chương trình cho dịch chuyển một ma trận. /****************************** * Program developed by: * * M.A.Sid-Ahmed. * * ver. 1.0 1992. * * @ 1994 * ******************************/ /*This program is for obtaining the transpose of a large binary file stored on secondary memory. We assume that the file is large to the 114
  10. point that it would not fit in active memory, and the data type in the file is character.*/ #include #include #include #include #include #include void transpose(FILE *, int, int); void main() { int N,n; char file_name[11]; FILE *fptr; float nsq; clrscr(); printf("Enter file-name to be transposed -->"); scanf("%s",file_name); fptr=fopen(file_name,"rb+"); if(fptr==NULL) { printf("%s does not exist. "); exit(1); } nsq=filelength(fileno(fptr)); N=sqrt((double)nsq); n=(int)(log10((double)(N))/log10((double)(2.0))); clrscr(); transpose(fptr,N,n); fclose(fptr); } void transpose(FILE *fptr, int N, int n) /* Algorithm */ { int N1,inc; 115
nguon tai.lieu . vn