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

8 302 0
Giáo trình xử lý ảnh y tế Tập 3 P18 pptx

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

Thông tin tài liệu

392 Min=1.e20 ; for (i=0; i<M; i++) histo[i]=0.0; for(i=0; i<N1; i++) { fread(buffi,sizeof(float),NS,fptri); for(j=0;j<N1;j++) { kk=j*NB ; for(k1=0;k1<NB;k1++) { loc1=kk+k1*N; kk2=k1*NB; for(k2=0;k2<NB;k2++) { loc=loc1+k2; k=kk2+k2 ; buffi[loc]-(buffi[loc]-mu[k])/sigma[k]; if(buffi[loc]<Min) Min=buffi[loc]; if(buffi[loc]>Max) Max=buffi[loc]; }/* k2 loop. */ }/* k1 loop.*/ }/* j-loop.*/ }/* i-loop.*/ rewind(fptri); /*Rewind input file.*/ xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs ( " "); gotoxy(xt,yt+1); printf("\n\nEnter fraction of DCT coefficients to be"); printf("\n retained per block (e.g. 0.25, 0.5, etc.) >"); scanf ( "%f", &fdct); xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); gotoxy(xt,yt); k=fdct*Nt; 393 T=(int *)malloc(Nt*sizeof(int)); sum=0.0; for(i=0;i<Nt;i++) T[i]=0; T[0]=1; /* dc component.*/ while(k>1) { smax=-1.0; for(i=0;i<Nt;i++) { if(T[i]==1) continue; if(sigma[i]>smax) { smax=sigma[i]; loc=i; } } T[loc]=1; k ; } h=(Max-Min)/(float)m; d[0]=Min; for(i=0;i<(m-1);i++) d[i+1]=d[i]+h; d[M]=Max; for(i=0;i<N1;i++) { fread(buffi,sizeof(float),NS,fptri); for(j=0;j<N1;j++) { kk=j*NB ; for(k1=0;k1<NB;k1++) { loc1=kk+k1*N; kk2=k1*NB ; for(k2=0;k2<NB;k2++) { loc=loc1+k2; k=kk2+k2 ; if(T[k]==0) continue; buffi[loc]=(buffi[loc]-mu[k])/sigma[k]; for(kt=0;kt<M;kt++) { 394 if((buffi[loc]<d[kt+1])&&(buffi[loc]>=d[kt])) { histo[kt]+=1.0; break; } } } /* k2 loop. */ } /* k1 loop.*/ }/* j-loop.*/ } /* i-loop.*/ rewind(fptri ) ; /*Rewind input file. */ for( i=0; i<M; i++) x[i]=(d[i]+d[i+1])/2.0; NQ=(long int)(Nt-1)*(long int)(N1*N1); if (ch=='y' ) { printf ( "\n\nPrepari ng data for output plotting."); /* Preparing data for X-Y plotting. Data is prepared in a format suitable for plotting by GRAFTOOL, a graphical analysis software tool by 3-D Visions , (412 S.Pacific Coast Hwy. Suite 201, Redondo Beach, CA. 90277).*/ fprintf(fptro,"%d %d\n",M,2); for(i=0;i<M;i++) { fprintf(fptro,"%e %e\n",x[i],histo[i]); } fclose(fptro); } xt=wherex(); yt=wherey(); gotoxy(70, 25); textattr(WHITE+(BLACK<<4)); cputs ( " " ); gotoxy (xt, yt+1); free (d); printf(" \nDesigning the quantizer."); mut=0.0; sigmat=0.0; for(j=0; j<M; j++) mut+=histo[j]*x[j]; 395 sum=0.0; for(j=0; j<M ; j++) sum+=x[j]*x[j]*histo[j]; sigmat= NQ*sum-mut*mut; sigmat/=(float)NQ*(float)(NQ-1); sigmat=(float)sqrt((double) sigmat); printf("\n Enter file name containing the"); printf("\n Lloyd-Max quantizer > "); scanf("%s",file_name); fptro=fopen(file_name,"r"); if(fptro==NULL) { printf("\n That file does not exist. Run the "); printf("\n program for designing the Lloyd-Max quantizer.\n"); exit(1); } i=0; while(1) { k=fscanf(fptro," %f %f",&dt,&rt); i++; if(k==EOF) break; } NQ=i-1; d=(float *)malloc(NQ*sizeof(float)); r=(float *)malloc(NQ*sizeof(float)); rewind(fptro); i=0; while(1) { k=fscanf(fptro," %f %f",&d[i],&r[i]); if(k==EOF) break; d[i]=d[i]*sigmat; r[i]=r[i]*sigmat; i++; } fclose(fptro); /*Close file containing distribution.*/ /* Header information: Block size, image size, number of quantization levels, 396 zonal sampling matrix, standard deviations & means, reconstruction levels. */ printf("\nEnter file name to store quantized image,\n "); textattr(BLUE+(YELLOW<<4)+BLINK); cputs(" Do NOT give the name an extension > "); scanf("%s",file_name); textattr(WHITE+(BLACK<<4)); imaget=strchr(file_name,'.'); if(imaget!=NULL) { j=strcspn(file_name,"."); file_name[j]='\0'; } imaget=strcpy(temp,file_name); imaget=strcat(temp,".hdr"); fptro=fopen(temp,"wb"); /*save size of block, size of image and # of quant. levels .*/ putc(NB,fptro); putc(NQ,fptro); k=(255)&N; putc(k,fptro); k=(255)&(N>>8); putc(k,fptro); /* Zonal Sampling matrix. */ j=0; k=0; loc=0; for(i=0;i<Nt;i++) { j=(j<<1)|T[i]; k++; if(k==8) { putc(j,fptro); k=0; } } /* standard deviations and means.*/ for(i=0; i<Nt; i++) { k=i<<1; buffi[k]=sigma[i]; buffi[k+1]=mu[i]; 397 } /* reconstruction levels.*/ k=Nt<<1; for(i=0; i<NQ; i++) { buffi[k+i]=r[i]; } fwrite(buffi , sizeof(float), (Nt<<1)+NQ,fptro); fclose(fptro); clrscr(); printf ( " \n Quantizing."); imaget=strcpy(temp, file_name); imaget=strcat(temp, ".DC"); fptro1=fopen(imaget,"wb"); imaget=strcpy(temp, file_name); imaget=strcat(temp,".AC"); fptro=fopen(imaget,"wb"); xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(RED+(LIGHTGRAY<<4)+BLINK); cputs("WAIT"); gotoxy(xt,yt); for(i=0;i<N1;i++) { fread(buffi,sizeof(float),NS,fptri); for(j=0;j<N1;j++) { kk=j*NB; for(k1=0;k1<NB;k1++) { kk1=k1*N; kk2=k1*NB; for(k2=0;k2<NB;k2++) { if((k1+k2)==(int)0) { ch=(unsigned char)(buffi[kk]/2.0); putc(ch,fptro1); continue; } loc=kk1+k2+kk; loc1=kk2+k2; 398 if(T[loc1]==0) continue; else buffi[loc]=(buffi[loc]-mu[loc1])/sigma[loc1]; if(buffi[loc]<d[1]) ch=(char)0; else if(buffi[loc]>=d[NQ-1]) ch=(char)(NQ-1); else { for(k=1;k<(NQ-1);k++) { if((buffi[loc]<d[k+1])&&(buffi[loc]>=d[k])) { ch=(char)k; break; } /* if */ } /* k-loop. */ } /* else */ putc(ch,fptro); } /* k2 loop. */ }/* k1 loop. */ } /* j-loop. */ } /* i-loop. */ xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs ( " "); gotoxy(xt,yt); printf(" \nDone !!"); fcloseall(); } Trước khi bạn dùng chương trình 13.11 bạn cần thiết kế lượng tử hoá Lloyd-Max như các bước trong bài tập 13.8. Bạn cũng sẽ cần chạy FCT2D.EXE trên ảnh đã bị nén. Bài tập 13.11 Bạn sẽ tìm thấy trên đĩa đi kèm theo cuốn sách này ảnh “KAREN.IMG”. Đưa ra các bước sau: 1. Chạy 2-D FCT trên ảnh “KAREN.IMG” dùng một khối 8  8. File FCT này có tên là “KARENFCT.IMG”. 2. Chạy chương trình “QUANTIZE.EXE” trên “KARENFCT.IMG” dùng các bước sau: 399 a. Tỷ lệ các hệ số giữ lại là 0.25. b. Lượng tử hoá 32 mức (5 bit). Chứa ảnh đã lượng tử hoá và nén trong “KarenQ”. 3. Chạy chương trình mã hoá Huffman trên “KarenQ.AC”. Bài tập 13.11 cho kết quả sau đây: Kích thước ảnh gốc: 65536 byte. Kích thước file chứa các điểm AC: 15360 byte. Kích thước file chứa các điểm DC: 1024 byte. Kích thước của header: 652 byte. Kích thước của file mã hoá Huffman: 8973 byte. Tỷ lệ nén thường được tính theo bit trên điểm ảnh (bpp). Giá trị này có thể tính từ các biểu thức trên theo: 8 65536 65210248973    bpp  1.3 Giá trị này chứng tỏ rằng 83.75 phần trăm kích thước của ảnh gốc đã được nén lại. Bạn có thể giảm kích thước của file chứa các điểm DC một chút dùng RLC. Nếu bạn làm như vậy kích thước của file này sẽ là 1017 bit. Mã RLC có thể cho kết quả tốt trên ảnh có kích thước lớn. Nếu bạn dùng lượng tử hoá 4 bit thì tỷ lệ nén là 1.1 bpp. Nếu bạn trả lời “y” để tính dữ liệu lược đồ mức xám cho các khối AC (chỉ các dứ liệu còn giữ lại), bạn sẽ có được file dữ liệu dùng để in ra. Kết quả dữ liệu lược đồ mức xám của ảnh “KARENFCT.IMG” cho trong hình 13.19. Lược đồ mức xám này biểu diễn phân bố Laplace như tôi đã đề cập ở phần đầu cuốn sách này. Bài tập 13.12 1. Làm lại bài tập 13.10 trên ảnh “IKRAM.IMG”. 2. Tính bpp. 3. Vẽ lược đồ mức xám của khoảng cách các hệ số AC. Để nghiên cứu ảnh lượng tử hoá bạn cần hiện tất cả các khối một lúc. Chương trình sau thực hiện chính xác điều đó. Chương trình này sẽ in các dữ liệu không giữ lại là các điểm zero. Chương trình 13.12 “QUANCHK.C” Chương trình hiện thị các khối lượng tử hoá. . chương trình 13. 11 bạn cần thiết kế lượng tử hoá Lloyd-Max như các bước trong bài tập 13. 8. Bạn cũng sẽ cần ch y FCT2D.EXE trên ảnh đã bị nén. Bài tập 13. 11 Bạn sẽ tìm th y trên đĩa đi. tập 13. 11 cho kết quả sau đ y: Kích thước ảnh gốc: 65 536 byte. Kích thước file chứa các điểm AC: 1 536 0 byte. Kích thước file chứa các điểm DC: 1024 byte. Kích thước của header: 652 byte 89 73 byte. Tỷ lệ nén thường được tính theo bit trên điểm ảnh (bpp). Giá trị n y có thể tính từ các biểu thức trên theo: 8 65 536 652102489 73    bpp  1 .3 Giá trị n y chứng tỏ rằng 83. 75

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

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

Tài liệu liên quan