1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình xử lý ảnh y tế Tập 2 P10 pot

8 261 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 225,52 KB

Nội dung

185 w[i]=w[i-1]+winc; for(i=0;i<Nt;i++) { fprintf(fptro," %e",w[i]); fprintf(fptri," %e",w[i]); } for(m=0;m<Nt;m++) { fprintf(fptro,"\n%e",w[m]); fprintf(fptri,"\n%e",w[m]); for(n=0;n<Nt;n++) { zrt=zit=(float)0.0; zrb=zib=(float)0.0; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { xrm=(float)cos((double)(i*w[m])); xim=(float)sin(-(double)(i*w[m])); xrn=(float)cos((double)(j*w[n])); xin=(float)sin(-(double)(j*w[n])); rl=(xrm*xrn-xim*xin); im=(xrm*xin+xim*xrn); zrt+=a[i][i]*rl; zit+=a[i][j]*im; zrb+=b[i][j]*rl; zib+=b[i][j]*im; } theta=(float)(atan2((double)zit,(double)zrt)- atan2((double)zib,(double)zrb)); mag=(float)sqrt((double)(zrt*zrt+zit*zit)); mag/=(float)sqrt((double)(zrb*zrb+zib*zib)); fprintf(fptro," %e",mag); fprintf(fptri," %e",theta); } } fclose(fptro); fclose(fptri); } /* Solving a set of linear algebraic equations using Gauss-Jordan's method. */ void SIMQ(float *a, int N) { int i,j,l,k,N1; 186 float big,temp; N1=N+1; for(j=0;j<N;j++) { big=(float)fabs((double)a[j*N1+j]); l=j; for(k=j;k<N;k++) { if(big<(float)fabs((double)a[k*N1+j])); Hình 9.7 Đáp ứng biên độ của bộ lọc thông cao IIR kích thước 3  3. 187 Hình 9.8 Đáp ứng pha của bộ lọc IIR kích thước 3  3. { big=(float)fabs((double)a[k*N1+j]); l=k; } } if(big<1.e-10) { printf("\n No unique solution to set of equations.\n"); exit(1); } for(k=0;k<N1;k++) { temp=a[j*N1+k]; a[j*N1+k]=a[l*N1+k]; a[l*N1+k]=temp; } for(k=j+1;k<N1;k++) a[j*N1+k]/=a[j*N1+j]; a[j*N1+j]=1.0; for(i=0;i<N;i++) { if(i!=j) 188 { for(k=j+1;k<N1;k++) a[i*N1+k]-=a[i*N1+j]*a[j*N1+k]; a[i*N1+j]=(float)0.0; } } } } Bảng 9.2 Các hệ số của bộ lọc IIR HPF 3  3 a b i,j -0.020378 1.000000 0,0 -0.021780 - 0.592040 0,1 -0.019647 0.007175 0,2 -0.010713 0.001662 0,3 -0.021780 - 0.592041 1,0 -0.021506 0.040878 0 1,1 -0.020782 0.006758 1,2 -0.013680 0.002367 1,3 -0.019647 0.007175 2,0 -0.020782 0.006758 2,1 0.979037 0.004866 2,2 -0.606853 0.002372 2,3 -0.010713 0.001662 3,0 -0.013680 0.002367 3,1 -0.606854 0.002372 3,2 0.397027 0.001505 3,3 9.6 Cách tiếp cận lặp Các sai số về trọng số cho bởi biểu thức (9.15) cho phép chúng ta thiết kế của bộ lọc khi giải một tập hợp của các phương trình tương thích. Các sai số không về trọng số có dạng nguyên thuỷ như trong phương trình (9.12) sẽ cho kết quả là một tập hợp của các phương trình phi tuyến. Chúng ta có thể bắt đầu từ định nghĩa sai số cho bởi phương trình (9.15) và qua phép lặp lại ,kết quả gần đúng sẽ được rút ra từ sai số không trọng số. Nếu L ký hiệu cho số phép lặp lại và B L-1 (  1 ,  2 ) là đáp ứng tần số của mẫu số rút ra từ phép lặp trước đó, thì từ biểu thức (9.15) chúng ta có thể viết: 189 ),( 1 ),( ),( ),( ),( ),( ),(),( 211 21 211 21 21 211 2121          L L L d L L LL B A B H B B B (9.25) ở đây L=1,2,3, Đặt B 0 (  1 ,  2 ) = 1.0 làm cho sai số trong phép lặp đầu tiên có dạng được dùng trong phương pháp Shanks. Các sai số về mặt lý thuyết sẽ tiếp cận các sai số không trọng số trong mỗi vòng lặp. Sự hội tụ sẽ đạt được khi ),(),( 21121    LL BB Ký hiệu sai số dưới dạng ),( ),(),( ),( 211 2121 21       L LL B B (9.26) Chúng ta có thể viết : ),( 1 ),( ),( ),( ),(),( 211 21 211 21 2121         L L L d L B A B H B (9.27) Khi phép nhân trong miền tần số tương đương với tích chập trong miền không gian, chúng ta có thể viết : ),()(),()(),( 1 00 1 00 jnimgajnimhbnm LLij N j N i LLij N j N i L           (9.28) ở đây ),( 1 ),( 211 211 zzB zzG L L    (9.29) và ),( ),( ),( 211 21 211 zzB zzH zzH L d L     (9.30) Bởi vì ji Lij N j N i L zzbzzB       211 00 211 )(),( (9.31) nên ),()( 00 ),(),( 11 0 1 jnimgb N j N i nmnmg LLij ji L           (9.32) và ),()( 00 ),(),( 11 0 1 jnimhb N j N i nmhnmh LLij ji d L            (9.33) 190 Xây dựng chuẩn L 2 dùng sai số cho bởi biểu thức (9.28) ta có : ),( 0 2 0 nm M n M m Q L        (9.34) Lấy vi phân theo (a lk ) L và cho các biểu thức này bằng không ),(),( ),(),()( 00 ),(),()( 1 0 1 0 1 0 1 0 0 1 0 0 1 00 knlmgnmh knlmgjnimhb N j N i knlmgjnimga L M n L M m L M n L M m Lij ji L N i M n L M m N j Lij                              (9.35) ở đây l,k = 0,1,2, ,N. Đạo hàm theo (b P ) L và cho các biểu thức này bằng không chúng ta có ),(),()( 1 0 0 1 00 knlmhjnimga L N i M n L M m N j Lij           ),(),( ),(),()( 00 1 0 1 0 1 0 1 0 0 knlmhnmh knlmhjnimhb N j N i L M n L M m L M n L M m Lij ji                        (9.36) ở đây l,k = 0,1,2, ,N và l + k  0. Biểu thức (9.35) và (9.36) sinh ra 2(N + 1)  (N + 1) - 1 phương trình đại số tuyến tính. Phương trình này có thể viết dưới dạng ma trận:                2 1 32 21 F F X CC CC T (9.37) ở đây C 1 = một ma trận đối xứng [(N + 1)  (N + 1)]  [(N + 1)  (N + 1)]. 191 C 2 = một ma trận [(N + 1)  (N + 1)]  [(N + 1)  (N + 1) - 1]. C 3 = một ma trận đối xứng [(N + 1)  (N + 1) - 1]  [(N + 1)  (N + 1)]. X = một vector chứa các hệ số của bộ lọc. F 1 và F 2 = các vector có kích thước tương ứng [(N + 1)  (N + 1)] và [(N + 1)  (N + 1) - 1]. Chú ý rằng ma trận ở bên phải của biểu thức (9.37) là đối xứng. Các bước lặp lại của thuật toán có thể mô tả bởi các bước sau : 1. Dùng các phương pháp Shanks tính ra {a ij } 0 và {b ij } 0 với L = 0,1,2, , { 2. Tính g L-1 (m,n) và h ‘ L-1 (m,n) từ biểu thức (9.32) và (9.33). 3. Rút ra tập hợp của các phương trình đại số tuyến tính từ biểu thức (9.35) và (9.36). 4. Giải ra các giá trị của {a ij } L và {b ij } L . } Trong phần lớn các trường hợp, luôn luôn đòi hỏi phải có một phép lặp. Hàm sai số (chuẩn L 2 ) thường giảm mạnh trong lần lặp đầu tiên và sau đó giảm dần dần qua các lần lặp còn lại. Để kiểm tra phép lặp gần đúng này, chúng ta sẽ áp dụng ví dụ của bộ lọc thông cao có kích thước 2  2 cho ở phần 9.5. Các hệ số của bộ lọc dùng các giả thiết Shanks cho ở bảng 9.1. Hàm sai số ban đầu, Q, cho trong biểu thức (9.12) được tính dùng các hệ số cho ở bảng 9.1 và kết quả là 0.001145. Sau một lần lặp, Q giảm xuống chỉ còn là 0.000770. Trong lần lặp thứ hai, nó giảm xuống 0.00078 và giữ nguyên giá trị này cho đến lần lặp thứ ba. Bài tập 9.1 Phát triển chương trình C “IIRDITER.C” dùng giả thiết lặp để thiết kế bộ lọc IIR. Giá trị ban đầu của hệ số nhập vào được rút ra từ lần chạy đầu tiên của chương trình 9.2. Chương trình cần đọc bậc của bộ lọc và hệ số ban đầu từ file. 9.7 Lọc ảnh dùng bộ lọc IIR Các bước thực hiện của biểu thức (9.2) cho lọc ảnh 2-D cũng giống như các bước thực hiện của bộ lọc FIR mà chúng ta đã nghiên cứu trong chương 3, phần 3.4 (xem hình 3.1). Sự khác nhau cơ bản trong trường hợp này là chúng ta cần hai bộ đệm chuyển đổi ảnh, một cho nhập vào và một chứa số lượng dòng cần thiết cho ảnh xuất ra. Mỗi một bộ đệm này đều có kích thước (N + 1)  độ rộng ảnh. Bộ đệm chuyển đổi nhập vào có thể có kiểu dữ liệu “char”. Bộ đệm chuyển đổi đầu ra nên có kiểu dữ liệu là ”float” hoặc là “double”. Nếu chúng ta coi wx[i][j] và wy[i][j] là bộ đệm chuyển đổi nhập ảnh vào và xuất ảnh ra, thì thuật toán lọc IIR 2-D có thể theo những bước sau: 192 1.Xoá bộ đệm chuyển đổi ảnh nhập vào và xuất ra . 2.Cho n = 0,1,2, ,(chiều dài ảnh - 1). { a.Chuyển dòng thứ n của ảnh vào hàng đầu tiên của wx, chẳng hạn, wx[0][j] = ảnh [n][j]; j = 0,1, ,(chiều rộng ảnh - 1). b.Cho m = 0,1,2, ,(chiều rộng ảnh - 1).          N j jmiji ji N j N i jmiji N i m wybwxawy 0 ,, 0 00 ,, 0 ,0 3.Chuyển hàng đầu tiên của wy vào một file xuất ra, chẳng hạn, xuất ra [n][j] = wy[0][j]; j = 0,1,2, ,(chiều rộng ảnh -1). 4.Dịch chuyển các hàng của wx và wy để hàng i+1  hàng i } Chương trình thực hiện giải thuật trên được cung cấp ở dưới đây. Chương trình 9.3 “IIRFIL.C”. Lọc ảnh dùng bộ lọc IIR. /* Program 9.3 "IIRFILT.C".Program for filtering images using IIR fliters. */ /* This program is for filtering images using 2-D iir filters. The filter's coefficients can be obtained from iird.exe or lirditer.exe. */ #include <stdio.h> #include <math.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <alloc.h> #include <ctype.h> #include <string.h> void main() { FILE *fptri,*fptro,*fptrt; unsigned char *buff,**wx,ch,*temp1; double nsq; float **wy,**a,**b,*temp2,*bufft; float max,min,scale,tt; int n,m,image_length,image_width,i,j,N,N1,ind; int true_length,true_width,yt; . 1,1 -0. 020 7 82 0.006758 1 ,2 -0.013680 0.0 023 67 1,3 -0.019647 0.007175 2, 0 -0. 020 7 82 0.006758 2, 1 0.979037 0.004866 2, 2 -0.606853 0.0 023 72 2,3 -0.010713 0.0016 62 3,0 -0.013680 0.0 023 67 3,1. ),(),( 21 121    LL BB Ký hiệu sai số dưới dạng ),( ),(),( ),( 21 1 21 21 21       L LL B B (9 .26 ) Chúng ta có thể viết : ),( 1 ),( ),( ),( ),(),( 21 1 21 21 1 21 21 21         L L L d L B A B H B . ),()(),()(),( 1 00 1 00 jnimgajnimhbnm LLij N j N i LLij N j N i L           (9 .28 ) ở đ y ),( 1 ),( 21 1 21 1 zzB zzG L L    (9 .29 ) và ),( ),( ),( 21 1 21 21 1 zzB zzH zzH L d L     (9.30) Bởi vì ji Lij N j N i L zzbzzB       21 1 00 21 1 )(),(

Ngày đăng: 10/07/2014, 22:20

TỪ KHÓA LIÊN QUAN