Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
360,15 KB
Nội dung
333 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; 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(); } 334 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. 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: 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 335 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 */ 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')); 336 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.*/ 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; 337 } 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; } } fcloseall(); printf("\nDone coding"); break; case '2': /* Decoding procedure.*/ printf("\nEnter file name for storing decoded image >"); scanf("%s",file_name); 338 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 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. 339 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 nhng 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; nhng 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 nhng 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 k 1 2 với k = 0 340 = 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: )12( 2 )14( cos) 2 ( ~ )( ~ )12( )12/( 0 k N nN nxnxkX N n (13.8) 341 Nhng cos[(2k + 1)] = 2coscos(2k) - cos[(2k - 1) ]. Vì vậy, )12( 2 )14( cos) 2 ( ~ )( ~ - 2 2 )14( cos) 2 ( ~ )( ~ 2)12( 1)2/( 02 )12/( 02 k N nN nxnx k N nN nxnxkX N n N n (13.9) Biểu thức thứ hai trong (13.9) là X(2k - 1). Bởi vậy, nên (13.9) rút gọn thành } 2 2 )14( cos 2 )14( cos) 2 ( ~ )( ~ 2{)12( )12/( 02 k N n N nN nxnxkX N n )12()12( 2 2 )14( cos kXk N n (13.10) Đặt ) 2 ( ~ )( ~ )( 00 N nxnxnx (13.11) và N nN nxnxx 2 )14( cos2) 2 ( ~ )( ~ 01 (13.12) Vì vậy: 12/ 0 00 ) 2 (2 )14( cos)()2( N n N n nxkX (13.13) Và 12/ 0 01 )12() ) 2 (2 )14( cos()()12( N n kX N kn nxkX (13.14) Biểu thức (3.13) và (3.14) dẫn chúng ta đến sơ đồ hình 13.4 cho DCT 8 điểm. Chú ý rằng X(1) = X(-1). Biểu thức (13.11) và (13.12) là biểu thức cho các phép toán bớm: 342 Đặt )2()( 00 kXkY Y k X k X k 01 2 1 2 1( ) ( ) ( ) (13.15) Hình 13.4 Lu đồ cho biểu thức (13.13) và (13.14). Vì thế: 12/ 0 0000 2 2 )14( cos)()( N n N kn nxkY (13.16) 12/ 0 0101 ) ) 2 (2 )14( cos()()( N n N kn nxkY (13.17) Chia Y 00 (k) và Y 01 (k) thành hai dãy chỉ số chẵn và lẻ nh trên chúng ta đợc: ) 2 (2 )14( cos) 4 ()()2( 1)4/( 0 000000 N n N nN nxnxkY (13.18) 13 16 2C 9 16 2C 16 2C 16 2C -1 - 1 - 1 -1 DCT 4 điểm. x(0) x(2) x(4) x(6) )0( ~ x )1( ~ x )2( ~ x )3( ~ x DCT 4 điểm. 2x(1) x(3)+x(1) x(5)+x(3) x(7)+x(5) )0( ~ x )1( ~ x )2( ~ x )3( ~ x j i C i j cos [...]... n ở đây N ( ))C N4 n 1) 4 ( 13. 21) ( 13. 22) ( 13. 23) ( 13. 24) ( 13. 25) i C ij cos j ( 13. 26) 34 3 X10(0 ) X10(1 DCT ) X00 (0 ) X00 (1 ) 2C8X11(0 ) -1 2C5 X ( DCT 8 11 1) -1 X12(0 ) X12(1 DCT ) X00 (2 ) X00 (3 ) X01 (0 ) X01 (1 ) 2C8X 13( 0 -1 ) 5 2C 8X 13( DCT -1 1) X01 (2 ) X01 (3 ) Y00 (0 ) Y00 (2 ) 2Y00(1) Y00 (3) +Y00(1 ) Y01 (0 ) Y01 (2 ) 2Y01(1) Y01 (3) +Y01(1 ) Hình 13. 5 Bước thứ hai của thuật toán... ( 13. 22) đến ( 13. 25) biểu diễn cho toán tử bướm Thay các biểu thức này vào các biểu thức từ ( 13. 18) đến ( 13. 21) chúng ta có: N / 4 1 Y00 (2k ) x10 (n) cos n 0 (4 n 1)k N 2 4 N / 41 Y00 (2k 1) Y00 (2k 1) x11 (n ) cos n 0 N / 4 1 Y01 (2 k ) x12 ( n) cos n 0 (4n 1)k N 2( ) 4 ( 13. 28) (4n 1)k N 2 4 N / 4 1 Y01 (2 k 1) Y01 (2k 1) ( 13. 27) n 0 x 13 (n) cos ( 13. 29) (4n 1)k N 2( ) 4 ( 13. 30)... 1 Y01 (2 k ) n 0 ( 13. 19) (4n 1) N x01 (n) x01 (n ) 2 cos 4 2( N ) 2 ( 13. 20) (4n 1) N Y01 (2 k 1) x01 (n ) x01 (n ) 2 cos 4 2( N ) n 0 2 (4 n 1)k Y01 (2k 1) cos 2( N ) 4 N Đặt x10 ( n) x00 ( n ) x00 ( n ) 4 ( N / 4 ) 1 x11 ( n) ( x00 ( n) x00 ( n N ( ))C N4 n1) 4 x12 (n ) x01 ( n) x01 ( n N ) 4 x 13 ( n) ( x 01 ( n) x01... 1) x11 (n ) cos n 0 N / 4 1 Y01 (2 k ) x12 ( n) cos n 0 (4n 1)k N 2( ) 4 ( 13. 28) (4n 1)k N 2 4 N / 4 1 Y01 (2 k 1) Y01 (2k 1) ( 13. 27) n 0 x 13 (n) cos ( 13. 29) (4n 1)k N 2( ) 4 ( 13. 30) 34 4 . getch(); } 33 4 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á. 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 12/ 0 01 )12() ) 2 (2 )14( cos()()12( N n kX N kn nxkX ( 13. 14) Biểu thức (3. 13) và (3. 14) dẫn chúng ta đến sơ đồ hình 13. 4 cho DCT 8 điểm. Chú ý rằng X(1) = X(-1). Biểu thức ( 13. 11) và ( 13. 12) là biểu thức cho các phép toán bớm: 34 2 Đặt