intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

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

Chia sẻ: Cinny Cinny | Ngày: | Loại File: PDF | Số trang:9

68
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Hạn chế thứ hai chỉ ra rằng không có thông báo nào được mã hoá theo cách mà khi từ mã xuất hiện, bit nối bit, như là một phần của từ mã lớn hơn.

Chủ đề:
Lưu

Nội dung Text: Giáo trình xử lý ảnh y tế Tập 3 P9

  1. Hạn chế thứ hai chỉ ra rằng không có thông báo nào được mã hoá theo cách mà khi từ m ã xuất hiện, bit nối bit, như là một phần của từ mã lớn hơn. Ví dụ, 01, 102, và 202 là các từ m ã hợp lệ. Một d ãy của các từ m ã xuất hiện có dạng 1111022020101111102 có thể tách ra thành 111 -102 -202 -01-01-111-102. Tất cả các vấn đề mà chúng ta cần quan tâm khi giải mã là bộ m ã gốc. Nếu như một bộ mã bao gồm 11, 111, 102, 02 thì khi một thông báo bắt đầu vói 11, ta sẽ không biết liệu đây là thông báo 11 hay đây là phần bắt đầu của thông báo 111. Nếu một thông báo 11102 xuất hiện th ì ta sẽ không biết liệu đâ y là 111- 02 ho ặc là 11-102 được truyền đi. Mã Huffman được mã hoá theo hai hạn chế trên đây và gọi là mã có độ dư thừa tối thiểu hay gọi là mã tối ưu. Phương pháp mã hoá này theo hai bước: bước thu gọn và bước mở rộng. Để xem xét phương pháp mã hoá này ta coi rằng các thông báo để xây dựng từ mã được sắp xếp theo thứ tự xác suất xuất hiện giảm dần. p (0)  p (1)  p(2)  ...  p(N - 1) Ở đây N là số của các thông báo. Nh ư tôi đã ch ỉ ra ban đầu, cho bộ mã hoá tối ưu thì đ ộ d ài của từ mã được xắp xếp theo thứ tự L(0)  L(1)  L(2)  ...  L(N - 1 ) Các bư ớc dưới đây trình bày giải thuật mã hoá Huffman. Giải thuật n ày, cũng như ph ần lớn các giải thuật khác trong cuốn sách này, được phát triển bởi chính tác giả. 13.2.1 Giải thuật thu gọn Các bước của giải thuật thu gọn được trình bày tốt nhất theo các bước sau đây: Đặt M = N và coi đây là một mảng tuyến tính có kích thư ớc N - 2. Cho i = 0 đến N - 3 lặp lại các bước sau: { Cộng p(M) và p(M - 1). Thay p(M - 1) b ằng kết quả thu được. Xác đ ịnh vị trí, loc, trong M - 1 vị trí đầu tiên của mảng p trong đó p(M - 1) > p (loc). Đặt temp = p(M - 1). Chuyển các giá trị từ p(loc) đến p(M - 2) xuống một vị trí. Đặt giá trị trung gian vào loc. Lưu giá trị trung gian trong mảng tuyến tính v theo v(N - 2 - i) = loc Giảm M đi một giá trị. } Để hiểu giải thuật thu gọn ta xem xét ví dụ sau. Giả sử rằng khả năng xuất hiện của các thông tin là: p = {0.25, 0.25, 0.125, 0.125, 0.0625, 0.0625, 0.0625, 0.0625} 312
  2. Giải thuật thu gọn được trình bày ở trên, cho trường hợp n ày, trong hình 13.1, từ đó chúng ta có thể viết: 2  1  v  4  3  6  5   1 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.25 2 0.25 0.25 0.25 0.25 0.25 0.5 0.25 3 0.125 0.125 0.125 0.25 0.25 0.125 4 0.125 0.125 0.125 0.25 0.125 5 0.125 0.125 0.0625 0.0625 6 0.125 0.0625 7 0.0625 0.0625 8 0.0625 H ình 13.1 Giải thuật thu gọn. Mảng tuyến tính v được dùng để xây dựng mã hoá Huffman theo bước mở rộng được trình bày ở dưới đây. 13.3.2 Bước mở rộng Bước giải thuật này có th ể trình bày theo các bước sau: 1 ) Gán các giá trị ban đầu cho một mảng H theo: 0  H (1)     1   H (2 )  0  H (3)     H  0  .  .  .     .  .  0 H ( N )    Chú ý là phần tử thứ hai bằng 1 còn các ph ần tử khác bằng 0. Véc tơ tuyến tính 313
  3. v = [v[1] v[2] v[3] ... v[N - 2]]T được tính trong bước thu gọn. Chú ý là vị trí của các phần tử đ ược cho bằng 1,2,3 ... 2 ) Đặt M = 2 và i = 1. 3 ) Lưu phần tử ở vị trí v[i] trong m ảng H vào một biến trung gian temp. temp = H[v(i)] 4 ) Dịch chuyển các phần tử các phần tử ở vị trí dưới H[v(i)] một vị trí lên phía trên. Chèn giá trị 0 vào vị trí cuối cùng. 5 ) Sao chép temp tới vị trí thứ M trong H. 6 ) Dịch trái H(M) một bít. 10 0 1 0 1 0 1 0 1 0 1 0 21 10 1 1 1 1 1 1 1 1 1 1 3 11 0 0 0 0 0 1 0 0 1 0 0 1 0 4 0 1 01 0 0 1 1 0 1 1 0 1 1 5 01 1 0 0 0 0 0 0 0 0 1 0 6 0 0 1 00 1 0 0 0 1 1 7 00 1 1 0 0 0 0 8 0 0 0 1 H ình 13.2 Giải thuật mở rộng. 7 ) H[M + 1] = H[M] + 1. 8 ) Tăng M và i lên một. 9 ) Nếu i  (N - 2 ) quay lại bước thứ ba. Nếu không th ì đã hoàn thành , và mã n ằm trong bảng H. Các bước trên giải thích qua hình 13.2 dùng ví dụ hình 13.1. Các bước trên được lập ra bởi Huffman. Lu và Chen đ ã nhận ra rằng thuật toán của Huffman không phải lúc n ào cũng tạo ra một mã có độ d ài đơn diệu tăng d ần qua ví dụ của họ dưới đây: Xem xét khả năng xuất hiện thông tin dưới đây: 0.5 0.1  0.1 P  0.1 0.1  0.1 Theo giải thuật thu gọn ở trên chúng ta có 314
  4. 2  2  v  3   2  và tạo bộ m ã 0  101    1000 H  1001 110    111  Bộ mã trên không tho ả m ãn điều kiện về chiều dài của từ mã đơn điệu tăng dần; tuy nhiên, bộ m ã này có thể sử dụng nếu nó thoả mãn đ iều kiện có khả năng giải mã được. Lỗi này có thể sửa được bằng một thay đổi nhỏ theo Lu và Chen trong bước thứ ba từ p(M - 1)  p(loc) p (M - 1) > p(loc) thành Theo phương pháp này cho ta kết quả 1  2 v  2  2 và tạo ra một bộ m ã 1  001    010  H  011  0000   0001 Chú ý là thu ật toán Lu và Chen tạo ra bộ mã thì hoàn thiện hơn thuật toán mô tả ở trên. 315
  5. Chương trình dưới đây tạo ra bộ mã dùng các bước thu gọn và mở rộng ở trên. Chương trình này sử dụng thuật toán Lu và Chen mô tả ở trên. Chương trình cũng tính trung b ình độ dài từ. Ch ương trình không dùng trên ảnh, mà chỉ minh ho ạ các bước thực hiện việc sinh mã Huffman. Chú ý điều kiện dùng trong bước 3 của quá trình thu nhỏ đư ợc thay bằng điều kiện của Lu và Chen. Chương trình 13.1 Chương trình ví dụ sinh mã Huffman. /*Program 13.1 "HUFFMAN.C". Example program for generating the Huffman code.*/ /* Example program to demonstrate the algorithm for the generation procedure of the Huffman code. */ #include #include /*float p[]={0.2, 0.18, 0.1, 0.1, 0.1, 0.06, 0.06, 0.04, 0.04, 0.04, 0.04, 0.03, 0.01}; int N=13;*/ float p[]={0.5,0.1,0.1,0.1,0.1,0.1}; int N=6; void main() { int i,M,j,loc; unsigned char v[11],L[13],code[13]; unsigned char ctemp,Ltemp; float temp,sum,pt[13]; for(j=0;j
  6. break; } } temp=p[M-2]; for(j=M-2;j>=loc;j --) p[j]=p[j-1]; p[loc]=temp; M--; v[(N-3)-i]=loc; } printf("\n The v vector is given by:\n"); for(j=0; j
  7. code[M]=code[M]
  8. Huffman được sinh ra theo giải thuật được mô tả trên. Trong việc m ã hoá ảnh số bạn cần nhớ rằng chương trình sẽ cần nhiều byte trên đĩa. Khi viết một thủ tục giải m ã ta cần chú ý đến giới hạn n ày. 13.2.3 Mã hoá ảnh số Trư ớc khi mã hoá ta cần tạo ra hai bảng tra cứu: 1 . Một bảng tra cứu (LUT) chứa quan hệ các giá trị mức xám trên ảnh vói bộ mã hoá Huffman. Bảng LUT này có th ể phát triển d ùng quan hệ: table_code[gray[i]] = code[i] ở đây code[i] là mã Huffman. 2 . Một bảng tra cứu xác lập quan hệ giữa các mức xám trên ảnh vói chiều dài từ mã Huffman. LUT có thể tạo ra theo mối quan hệ sau: table_length [ gray[i]] = L[i] Mã hoá theo các bư ớc sau: a. Mở một file để chứa ảnh đ ã được mã hoá. b. Đặt Len = 0 và aux = 0. aux là một thanh ghi bốn byte để truyền m ã. Len chứa số các bít còn lại trong aux. c. Đọc giá trị điểm ảnh. d. Xác định mã Huffman của nó, code[i], và độ d ài của từ m ã L[i], dùng hai bảng LUT để tạo ra giá trị ban đầu. e. Dịch aux sang trái L[i] bit. f. Th ực hiện phép logic OR code[i] với aux. g. Len = Len + L[i]. h. Nếu Len  8 thì chuyển 8 bit cuối đến file đầu ra và giảm Len đi 8. i. Nếu chưa h ết file thì chuyển đến bước c. k. Chuyển các bít còn lại trong thanh ghi aux ra file đầu ra. Để giải mã được ảnh chúng ta cần phải tạo thêm ph ần header của file. Header của file bao gồm cả chiều dài thực sự của file tính theo bit. Chú ý là chiều dài thực sự có thể lớn hơn hoặc bằng chiều d ài thực sự của file. Điều này bởi vì chúng ta chỉ có thể chứa dư ới dạng đơn vị byte, còn file ảnh đ ã mã hoá ph ải có chiều dài không chia hết cho 8. Phần này chứa đủ thông tin để thiết lập các bảng LUT, dùng cho việc giải mã ảnh. Nó bao gồm các mức xám trên ảnh, dạng mã Huffman và chiều dài tương đương của chúng. Chú ý rằng các từ mã được sắp xếp theo thứ tự giảm dần theo xác suất xuất hiện của chúng. Chương trình C sau đây sẽ trình bày các b ước trên. Chương trình 13.2 "HUCODING" . Mã hoá Huffman ảnh số. /*Program 13.2 "HUCODING.C". Huffman coding of digital images.*/ 319
  9. /* This program is for coding a binary file using Huffman codes. */ #include #include #include #include #include #include void main() { int i,j,N,M,loc,k,ind,xt,yt; unsigned char *v,*L,*gray, *table_length; unsigned long int *code, *table_code, ctemp2; unsigned long int aux1,aux2,Lmask,act_len,flength; unsigned char mask,Len; int ch; unsigned char ctemp,Ltemp; float temp, sum, *pt, *p, big; unsigned long int *histo; double nsq; char file_name1[14], file_name2[14]; FILE *fptr,*fptro; clrscr(); printf("Enter file name of image -->"); scanf("%s",file_name1); fptr=fopen(file_name1,"rb"); if(fptr==NULL) { printf("%s does not exist. ",file_name1 ); exit(1); } printf("\nEnter file name for compressed image -- >"); scanf("%s",file_name2); k=stricmp(file_name1 ,file_name2); if (k==0) { printf("\nInput and output files cannot share the same name."); fcloseall(); exit(1); 320
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2