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

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

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

Thông tin tài liệu

330 gotoxy(1,3); printf(" "); gotoxy(1,3); printf(" Enter file name >"); scanf ( "%s", file_name2); ind=access(file_name2, 0); } } fptro=fopen(file_name2, "wb"); xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(RED+(LIGHTGRAY<<4)+BLINK); cputs("WAIT"); /*Reading the header.*/ act_len=0; M=8*sizeof(long int)-8; for(j=0;i<4;i++) { ch=getc(fptr); aux1=(unsigned long int)ch; aux1<<=M; act_len|=aux1; aux1=(long int)0; M-=8; } N=getc(fptr); gray=( unsigned char * )malloc(N*sizeof(char)); L=(unsigned char *)malloc(N*sizeof(char)); code=( unsigned long int *)malloc ( N*sizeof(long int)); for(i=0; i<N; i++) gray[i]=getc(fptr); for(i=0; i<N ; i++) L[i]=getc(fptr); mask=128; Len=0; aux2=0; aux1=0; ind=1; i=0; while(ind) { ch=getc(fptr); 331 for(k=0;k<8;k++) { aux1=ch&mask; ch<<=1; aux2<<=1; if(aux1!=0) aux2|=1; Len++; if(Len==L[i]) { code[i]=aux2; aux2=0; Len=0; i++; if(i==N){ ind=0; break; } } } } Len=0; aux1=aux2=0; flength=0; /*a parameter to measure against actual file length.*/ mask=128; ind=1; while(ind) { ch=getc(fptr); for(k=0;k<8;k++) { /* test if the actual end of file has been reached.*/ if(flength>act_len){ind=0; break;} aux1=(ch&mask); ch<<=1; aux2<<=1; if(aux1!=0) aux2|=1; Len++; for(j=0;j<N;j++) { if(L[j]>Len) break; 332 if(L[j]==Len) { if(code[j]==aux2) { aux2=0; putc((int)gray[j],fptro); Len=0 ; break; } } } flength++; } } gotoxy(70, 25); textattr(WHITE+(BLACK<<4)); cputs( " "); gotoxy (xt, yt); printf(" \ n Done decoding. "); fcloseall(); getch(); } Hình 13.3 Cây nhị phân giải mã Huffman hình 13.2. Bài tập 13.3 1. Áp dụng chương trình 13.3 cho việc giải mã ảnh đã mã hoá ở bài tập 13.2. 2. Mã hoá Huffman có thể đạt được kết quả hơn nhờ sử dụng cây nhị phân. Cây nhị phân trong hình 13.3 biểu diễn mã Huffman ở hình 13.2. 0 1 1 1 1 2 3 4 5 6 7 8 0 0 0 0 0 0 1 1 Nút gốc Nút lá Các nút gốc 333 a. Viết chương trình C sử dụng mã Huffman đặt trong phần header của file ảnh đã mã hoá để tạo một cây nhị phân. b. Mở rộng cho chương trình giải mã dùng cây nhị phân. Chương trình phải đạt được một vài yêu cầu quan trọng nhanh hơn phương pháp đã mô tả trong phần này. giải thích tại sao. 13.3 Mã chiều dài thay đổi Mã chiều dài thay đổi (RLC) là một phương pháp nén ảnh dựa trên sự cắt bớt các dư thừa không gian. Cho mã hoá chiều dài thay đổi một chiều, một mã chiều dài thay đổi được định nghĩa là một số các phần tử điểm ảnh liên tục có chung một giá trị. Một ảnh có thể mã hoá dùng một cặp (mã chiều dài thay đổi, mã mức xám). Một chương trình như vậy sẽ không thể làm giảm kích thước của ảnh nếu ảnh không chứa các điểm có cùng các giá trị mức xám. Điều kiện này xuất hiện trong một ảnh nhiều chi tiết. Dù có thế đi chăng nữa thì định nghĩa của RLC có thể là một phương pháp tốt để mã hoá mà có thể khắc phục các vấn đề xuất hiện dựa theo các điều kiện sau: 1. Một mã chiều dài thay đổi được xác định bằng ba bít cuối cùng có ý nghĩa của nó được xác lập bằng 1. Còn 5 bít thấp của nó cung cấp một bộ đếm từ 1 đến 31 cho byte đi theo nó. 2. Nếu giá trị một điểm có mã chiều dài thay đổi bằng không, thì nó được mã hoá như sau: a. Nếu 3 bit cuối của nó đều xác lập lên 1, châửng hạn,  224, thì nó được mã hoá thành (11100000, giá trị điểm), cụ thể, mã chiều dài thay đổi bằng không theo sau bằng giá trị điểm. b. Cho các trường hợp còn lại, nó được mã hoá như giá trị điểm. Các bước trên giả thiết rằng trong một ảnh bình thường, mã chiều dài thay đổi lớn hơn 31 ít xuất hiện, và các điểm có giá trị lớn hơn 224 cũng ít xuất hiện. Chương trình C sau sẽ thực hiện các bước trên. Chương trình 13.4 "RLC.C". Chương trình cho giải thuật RLC. /*Program 13.4 "RLC.C". Program for RLC.*/ /* Run length code. */ /* This program can be used for either coding images in RLC or decoding them. */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #define MASK 224 /* MASK=11100000 */ 334 void main() { int buff[256],p; int N,i,k; FILE *fptr,*fptro; char file_name[14],ch; int NMASK=(~MASK); clrscr(); printf("This program can be used for both coding"); printf("\nand decoding images using 1-D RLC."); printf("\n\n Enter choice:"); printf("\n 1.Coding."); printf("\n 2.Decoding >" ); while(((ch=getch())!='1')&&(ch!='2')); putch(ch); printf("\n\nEnter input file name >"); scanf("%s",file_name); fptr=fopen(file_name,"rb"); if(fptr==NULL) { printf("\n file %s does not exist.\n"); exit(1); } switch(ch) { case '1': printf("Enter output file name >"); scanf("%s",file_name); fptro=fopen(file_name,"wb"); /* Read first line.*/ N=0; while((buff[N]=getc(fptr))!=EOF) { N++; if(N==256) break; } while(N!=0) { i=0; while(i<N) { p=buff[i]; /*Read reference value.*/ 335 k=0; if(i==(N-1)) /*Is reference value last value in line? */ { if((p&MASK)==MASK) { k=k|MASK; putc(k,fptro); putc(p,fptro); } else putc(p,fptro); break; } i++; while(p==buff[i]) { i++; k++; if((k==31)||(i==N)) break; } if(k==0) { if((p&MASK)==MASK) { k=MASK; putc(k,fptro); putc(p,fptro); } else putc(p,fptro); } else { k|=MASK; putc(k,fptro); putc(p,fptro); } } N=0; while((buff[N]=getc(fptr))!=EOF) { N++; if(N==256) break; 336 } } fcloseall(); printf("\nDone coding"); break; case '2': /* Decoding procedure.*/ printf("\nEnter file name for storing decoded image- ->"); scanf("%s",file_name); fptro=fopen(file_name,"wb"); while(1) { k=getc(fptr); if(k==EOF) break; if((k&MASK)==MASK) { p=getc(fptr); if(p==EOF) { putc(k,fptro); break; } k=k&(NMASK); for(i=0;i<=k;i++) putc(p,fptro); } else putc(k,fptro); } fcloseall(); break; } } Bài tập 13.4 1. Dùng chương trình 13.4 trên ảnh IKRAM.IMG. 2. Dùng mã Hufman để nén ảnh và so sánh với các phương pháp mã hoá khác. 3. Áp dụng các bước giải mã Huffman và RLC để giải nén ảnh. 4. Viết một chương trình C dùng các khái niệm cơ bản (mã chiều dài thay đổi, mã) mà không sử dụng các bước mô tả cho chương trình 13.4. áp 337 dụng chương trình của bạn lên ảnh IKRAM.IMG. Khi đó kích thước của ảnh sau khi nén so với ảnh gốc sẽ thế nào ? 5. Áp dụng mã Huffman với: a. File rút ra từ phần 4. b. Chiều dài thay đổi và giá trị điểm chia bằng cách xem xét chúng như hai file. Có thể chuyển mã 1-D RLC sang mã 2-D RLC bằng cách kiểm tra các dòng trước, hoặc kiểm tra bốn hướng khác nhau (trên, dưới, trái, phải). Các 2-D RLC này có thể nén ảnh ở mức độ cao hơn. 13.4 Mã chuyển đổi Nhắc lại là biến đổi Fourier cho một ảnh thì có phần lớn các giá trị lớn nhất nằm ở miền tần số thấp. Mật độ các giá trị này giảm xuống nhanh chóng khi tần số tăng lên. Tính chất này, tính chất mà chúng ta áp dụng để lọc ảnh, cũng được áp dụng trong khi nén ảnh. Có một số phép biến đổi thuận tiện hơn phép biến đổi Fourier. Phép biến đổi tối ưu nhất là phép biến đổi được đề xuất bởi Karhunen-Loeve (KL). Tuy nhiên, phép biến đổi này tự nó không thể đưa ra các bước tính toán nhanh hoặc hiệu quả hơn. Một phép biến đổi xem có vẻ giống như biến đổi KL nhưng có thể tính toán như biến đổi Fourier rời rạc là phép biến đổi cosin rời rạc. Biến đổi cosin có một sự thay đổi nhỏ tối ưu hoá trong miền tập trung năng lượng so với biến đổi KL; nhưng do ưu điểm của kỹ thuật tính toán nên nó được áp dụng như một tiêu chuẩn trong kỹ thuật nén ảnh. Phép biến đổi được áp dụng trên toàn bộ ảnh nhưng thông thường người ta hay áp dụng trên các khối nhỏ hơn có kích thước 8  8 hoặc 16  16. Lý do là: 1. Biến đổi của các khối nhỏ thì dễ tính hơn là biến đổi cho toàn bộ ảnh. 2. Quan hệ giữa các điểm ảnh ít thay đổi giữa các điểm ảnh gần nhau. Chúng tôi sẽ trình bày dưới đây phép biến đổi cosin và các kỹ thuật tính toán hoàn thiện của nó. Một số phép biến đổi khác như Hadamard, Walsh, , không được nghiên cứu trong cuốn sách này, bởi vì chúng không tối ưu bằng phép biến đổi Fourier và chúng có nhiều giới hạn trong lĩnh vực này. 13.4.1 Biến đổi cosin Biến đổi một chiều cosin rời rạc (DCT-Discrete Cosin Transform) cho bởi            1 0 2 )12( cos)( 2 )( N n k N kn nx N kX   (13.4) ở đây 338  k  1 2 với k = 0 = 1 với các trường hợp còn lại. và k = 0,1,2, , N. Một số phương pháp biến đổi nhanh cosin (FCT-Fast Cosine Transform) đã được phát triển. Một trong số đó là biến đổi của Chan và Ho. Thuật toán này tương tự như thuật toán FFT, ngoại trừ một số biến đổi ở đầu vào dữ liệu. Phép biến đổi này coi rằng N là bội số của 2. Dữ liệu đầu vào x(n) được sắp xếp lại theo thứ tự: )12()1( )2( ~ ~        nxnNx nxx n = 0,1,2, ,N/2 - 1 (13.5) Thay vào biểu thức (13.4) chúng ta được X k x n n k N x n n k N n N n N ( ) ( )cos ( ) ( )cos ( ) ( / ) ( / )            2 4 1 2 2 1 4 3 2 0 2 1 0 2 1   Sau khi nhân ta được: N kn nxkX N n 2 )14( cos)( ~ )( 1 0       (13.6) Cũng giống như phương pháp hệ thập phân trong miền tần số cùng trong FFT, chúng ta cũng chia X(k) thành các giá trị chẵn và lẻ theo các bước sau: Các mục chỉ số chẵn:      1 0 2 2)14( cos)( ~ )2( N n N kn nxkX  có thể biểu diễn thành:            1 0 2 2 )14( cos]) 2 ( ~ )( ~ [)2( N n N knN nxnxkX  (13.7) Các mục chỉ số lẻ:      1 0 2 )12)(14( cos)( ~ )12( N n N kn nxkX  biểu thức này sau khi nhân một vài phép nhân, có thể biểu diễn thành: . Áp dụng chương trình 13. 3 cho việc giải mã ảnh đã mã hoá ở bài tập 13. 2. 2. Mã hoá Huffman có thể đạt được kết quả hơn nhờ sử dụng c y nhị phân. C y nhị phân trong hình 13. 3 biểu diễn mã Huffman. "); gotoxy (xt, yt); printf(" n Done decoding. "); fcloseall(); getch(); } Hình 13. 3 C y nhị phân giải mã Huffman hình 13. 2. Bài tập 13. 3 1. Áp dụng. Bài tập 13. 4 1. Dùng chương trình 13. 4 trên ảnh IKRAM.IMG. 2. Dùng mã Hufman để nén ảnh và so sánh với các phương pháp mã hoá khác. 3. Áp dụng các bước giải mã Huffman và RLC để giải nén ảnh.

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

Từ khóa liên quan

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

Tài liệu liên quan