Giáo trình xử lý ảnh y tế Tập 3 P7 potx

9 249 0
Giáo trình xử lý ảnh y tế Tập 3 P7 potx

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

Thông tin tài liệu

309 y1=f(x1,fun,x,xt,s,N); } dx=2.0*dx; x2=x1+dx; y2=f(x2,fun,x,xt,s,N); iter=0 ; while(y2<y1) { iter++; dx=2.0*dx; x0=x1; y0=y1; x1=x2; y1=y2; x2=x1+dx; y2=f(x2,fun,x,xt,s,N); } *a=x0; *b=x2; } /* Brent's algorithm for obtaining the minimum of a single variable function. */ #define CGOLD 0.381966 float Brent(float ax, float bx , float (*fun) (float *) , float TOL, float *x,float *xt, float *S, int N) { float a,b,u,v,w,xx,e,fx,fv,fu,fw,xm,tol1,tol2,c,r,q,p; int iter; a=ax; b=bx; v=a+CGOLD*(b-a); w=v; xx=v; e=0.0; fx=f(xx,fun,x,xt,S,N); fv=fx; 310 fw=fx; c=0.0; iter=0; while(iter<100) { iter++; xm=0.5*(a+b); tol1=EPS*(float)fabs((double)xx)+TOL/3.0; tol2=2.0*tol1; if((float)fabs((double)(xx-xm))<=(tol2-0.5*(b-a))) { return xx; } if((float)fabs((double)e)>tol1) { r=(xx-w)*(fx-fv); q=(xx-v)*(fx-fw); p=(xx-v)*q-(xx-w)*r; q=2.0*(q-r); if(q>0.0) p=p; q=(float)fabs((float)q); r=e; e=c; /* is parabola acceptable.*/ if(((float)fabs((double)p)<(float)fabs((double)(0.5*q* r)))|| (p > q*(a-xx))|| (p < q*(b-xx))) {/* fit parabola.*/ if(q==0.0) q=1.e-10; c=p/q; u=xx+c; /* f must not be evaluated too close to a or b. */ if( (((u-a)<tol2))|| ((b-u)<tol2) ) c=((xm-xx)>0.0) ? tol1 : -tol1; goto l2; } else goto l1; } else 311 { /* A tỷ lệ vàng step. */ l1: if(xx>=xm) e=a-xx; else e=b-xx; c=CGOLD*e; } /* update a,b,v,w, and x. */ l2: if(fabs((double)c)>=tol1) u=xx+c; else u=xx+((c>0.0)?tol1:-tol1); fu=f(u,fun,x,xt,S,N); if(fu<=fx) { if(u>=xx) a=xx; else b=xx; v=w; fv=fw; w=xx; fw=fx; xx=u ; fx=fu; continue; } else { if(u<xx) a=u; else b=u; } if((fu<=fw)||(w==xx)) { v=w; fv=fw; w=u; fw=fu; continue; } if((fu<=fv)||(v==xx)||(v==w)) { v=u; fv=fu; } } } 312 Để kiểm tra chương trình 12.3 chúng ta lấy dữ liệu dùng chương trình 12.2 từ ảnh "AUTHOR.IMG". Các màu ở đây được chia thành các sắc màu liên tiếp nhau. Dữ liệu đã có sẵn trên đĩa, chứa trong file "TINT2.DAT", dữ liệu có thể biểu diễn trên sơ đồ màu như hình 12.13. Chương trình có thể bị ngắt tại bất kỳ lúc nào bằng cách ấn phím ESC. Kết quả của hệ thống sẽ được lưu một cách tự động trong một file đặc biệt có tên ban đầu do người dùng đặt. Nếu sau đó bạn muốn tiếp tục với "đào tạo", bạn cần quay trở về chương trình chính, nhưng lần này trả lời "y" khi chương trình hỏi bạn: Bạn có muốn dùng các trọng số được đào tạo trước không? Lý do phải có phím ESC là đào tạo đòi hỏi một thời gian dài và bạn muốn ngắt chương trình, dùng máy tính vào các việc khác. Để áp dụng, chúng ta dùng một một perceptron ba lớp (cũng có thể dùng perceptron hai lớp), với lớp che khuất đầu tiên có tám nút, lớp che khuất thứ hai có bốn nút, và lớp ra chỉ có một nút. Lớp vào, tất nhiên là chỉ có hai nút, một cho x và một cho y - các biến của biểu đồ màu. Tín hiệu ra của hệ thống sẽ là 1 nếu dữ liệu biểu diễn cho sắc màu skin, và 0 cho các trường hợp còn lại. Chương trình bắt đầu bằng một số tính ngẫu nhiên giữa 0 và 1, và đòi hỏi gần 17,000 phép lặp và hơn 5 giờ tính toán trên máy 486-25 MHz. Sai lệch giảm xuống từ 32 xuống 0.0057. File chứa hệ thống này, chẳng hạn như, số các lớp, số các điểm trong mỗi lớp, và trọng số có sẵn trên đĩa dưới tên " WTSST.DAT". Hình 12.13 "TINT2.DAT" dùng thử mạng thần kinh. Bây giờ chúng ta cần phát triển một chương trình để kiểm tra cách làm việc thực sự của hệ thống. Liệt kê cho tất cả các thuật toán này trong một chương trình được cho ở dưới đây. 313 Chương trình 12.4 “TESNLYE.C”. Kiểm tra. /* Program 12.4 "TESNLYE.C". Testing a multilayer network.*/ /************************************ * Developed by M.A.Sid-Ahmed. * * ver. 1.0, 1992. * * @ 1994 * *************************************/ /* Program for testing a multi-layer perceptron. */ void float fun(float *); #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> int M,*NL,*NS,L; int *d; float *xp,*y,*net,*delta,theta; void main() { float *w,q,xt; int i,j,N,xd,ind,Nt; char file_name[14],file_name2[14],ch; FILE *fptr,*fptr2; clrscr(); printf("\nEnter file_name for weights >"); scanf("%s",file_name); fptr=fopen(file_name,"r"); if(fptr==NULL) { printf("file %s does not exist. ",file_name); exit(1); } fscanf(fptr,"%d ",&L); NL=(int *)malloc(L*sizeof(int)); 314 NS=(int *)malloc((L-2)*sizeof(int)); for(i=0;i<L;i++) fscanf(fptr,"%d ",&NL[i]); NS[0]=NL[0]*NL[1]; for(i=1;i<(L-2);i++) NS[i]=NS[i-1]+NL[i]*NL[i+1]; N=NS[L-3]+NL[L-2]*NL[L-1]; /* Total # of weights. */ /* Assigning memory for weights. */ w=(float *)malloc(N*sizeof(float)); for(i=0;i<N;i++) fscanf(fptr,"%f ",&w[i]); fscanf(fptr,"%f ",&theta); fclose(fptr), Nt=0 ; for(i=1;i<L;i++) Nt+=NL[i]; /* Total number of neurals. */ /* Assigning memory to *net, *z, *delta. */ net=(float *)malloc(Nt*sizeof(float)); y=(float *)malloc(Nt*sizeof(float)); delta=(float *)malloc(Nt*sizeof(float)); printf("\nEnter file - name containing training data - ->"); scanf("%s",file_name2); fptr2=fopen(file_name2,"r"); if(fptr2==NULL) { printf("file %s does not exist. ", file_name); exit(1); } /* Determining the size of the data. */ M=0; ind=1; while(1) { for(i=0;i<NL[0];i++) { 315 if((fscanf(fptr2,"%f ",&xt))==EOF) /* input data. */ { ind=0; break; } } if(ind==0) break; for(i=0;i<NL[L-1];j++) /* desired output. */ fscanf(fptr2,"%d ",&xd); M++; } printf("\n# of data points=%d",M); rewind(fptr2); /* Assigning memory to *xp, *d */ xp=(float *)malloc((M*NL[0])*sizeof(float)); d=(int *)malloc((M*NL[L-1])*sizeof(int)); /* Reading in the data. */ for(i=0; i<M; i++) { for(j=0;j<NL[0];j++) fscanf(fptr2,"%f ",&xp[j*M+i]); for(j=0;j<NL[L-1];j++) fscanf(fptr2,"%d ",&d[j*M+i]); } fclose(fptr2); gotoxy(1,7); printf ("Press any key to see network response for next input."); fun(w); } extern float *net,*w,*delta,*y; extern int *d; extern int *NS,*NL; /* Generating the function. */ void fun(float *w) 316 { int i,j,k,m,n,Nt1,Nt2; float error, E; for(k=0;k<M;k++) { for(i=0;i<NL[1];i++) /* From input layer to first */ { /* hidden layer. */ net[i]=0.0; for(j=0;j<NL[0];j++) net[i]+=w[i+j*NL[1]]*xp[j*M+k]; net[i]+=theta; E=(float)exp(-(double)net[i]); y[i]=1.0/(1.0+E); } Nt1=NL[1]; Nt2=0; for(n=2;n<L;n++) /* From layer n-1 to layer n. */ { for(i=0;i<NL[n];i++) { m=Nt1+i; net[m]=0.0; for(j=0;j<NL[n-1];j++) net[m]+=w[NS[n-2]+i+j*NL[n]]*y[j+Nt2]; net[m]+=theta; E=(float)exp(-(double)net[m]); y[m]=1.0/(1.0+E); } Nt1+=NL[n]; Nt2+=NL[n-1]; } gotoxy(1,10); for(i=0;i<NL[L-1];i++) /* Calculating the error. */ { error=d[k+i*M]-y[Nt2+i]; printf("response to data # %d",k+1); if (NL[L-1]!=1) printf("\noutput # %d",i); printf("\ndesired=%d actual=%f error=%f", d[k+i*M],y[Nt2+i],error); } getch(); 317 } /*k-loop*/ } Bài tập 12.2 1. Dùng hệ thống, với các trọng số "WTSST.DAT" có sẵn trên đĩa, để kiểm tra liệu hệ thống này có thể "nhận ra " sắc màu skin như được cho trong "TINT2.DAT". 2. Phát triển một chương trình C mà dùng một hệ thống nhiều lớp để sửa lại một cách có lựa chọn một màu đặc biệt. Dùng hệ thống xác định bằng các trọng số chứa trong " WTSS.DAT" áp dụng trên ảnh "AUTHOR.IMG" 3. Lập lại chương trình 12.3 PERNCONJG.C dùng thuật toán Davidon - Fletcher - Powell để thay thế . Lưu lại chương trình vào file PERNDFP.C. 4. Kiểm tra PERNDFP.C trên TINT2.DAT. 12.7 Quá trình nhận biết Thật không rõ ràng lắm là tại sao sự nhận biết lại chiếm một vị trí quan trọng trong mối quan tâm của con người. Dù có thế nào thì quá trình nhận biết luôn luôn được kết hợp một cái tên hoặc một cách gọi nào đó. Để xác định một vật thể, cho ví dụ, là quá trình xử lý kết hợp giữa nhận ra hình dạng và kết hợp với một cái tên đặc biệt. Câu hỏi là: bạn có cần phải biết tất cả các hình dạng khác nhau để nhận ra hình dạng của một vật thể? Trong thuật toán nhận biết đã dùng (thuật toán này cũng áp dụng quy tắc delta), tất cả dữ liệu biểu diễn cho một màu đặc biệt và dữ liệu biểu diễn cho tất cả các màu khác còn lại cần phải được biết. Điều này có vẻ hơi khác với cách mà chúng ta nhận biết. Có vẻ như chúng ta không cần những thông tin ngoài thông tin xác định cấu trúc một lớp màu đặc biệt mà chúng ta muốn nhận biết. Các dữ liệu về phân lớp đối tượng hoặc cảm nhận màu sắc sẽ có thể dạy cho hệ thống thần kinh về một đối tượng đặc biệt, hoặc màu sắc, mà không cần một sự tham khảo các điểm ngoài tập hợp này. Trong sự quan sát của tôi, tôi nhận ra rằng trẻ em bắt đầu nhận ra rất sớm sự khác nhau về hình dạng của các vật thể biểu diễn các ký tự của bảng chữ cái, mỗi ký tự một thời điểm. Phương pháp nhận biết là công nhận, tiếp nối nhau bởi các lần đặt tên. Sự kết hợp của hình dạng, cảm nhận hoặc cảm giác với gọi tên là một xử lý đặc biệt cho nhận dạng. Chú ý là nếu bạn nghe giọng nói của một người trên điện thoại lần đầu tiên, và người gọi cho bạn tên của anh hoặc cô ta thì suy nghĩ đầu tiên của bạn là tưởng tượng ra một khuôn mặt với cái tên ấy - một khuôn mặt mà trí tưởng tượng của bạn tạo ra trên cơ sở của kết hợp của giọng nói và tên gọi. Sau này, khi bạn gặp người đó, một câu nói cửa miệng hay dùng là "Bạn hoàn toàn không giống như . 30 9 y1 =f(x1,fun,x,xt,s,N); } dx=2.0*dx; x2=x1+dx; y2 =f(x2,fun,x,xt,s,N); iter=0 ; while (y2 < ;y1 ) { iter++; dx=2.0*dx; x0=x1; y0 =y1 ; x1=x2; y1 =y2 ; x2=x1+dx; y2 =f(x2,fun,x,xt,s,N);. thuật toán n y trong một chương trình được cho ở dưới đ y. 31 3 Chương trình 12.4 “TESNLYE.C”. Kiểm tra. /* Program 12.4 "TESNLYE.C". Testing a multilayer network.*/ /************************************. { v=u; fv=fu; } } } 31 2 Để kiểm tra chương trình 12 .3 chúng ta l y dữ liệu dùng chương trình 12.2 từ ảnh "AUTHOR.IMG". Các màu ở đ y được chia thành các sắc màu liên

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

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan