1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Nén Ảnh part 10 pdf

6 89 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 227,1 KB

Nội dung

417 printf("\nthat are multiples of 2. Check size of \n"); printf("original image used in the transform."); exit (1); } printf("\nEnter block size used (e.g. 8x8, 16x16, etc.) >"); scanf("%dx%d",&NB,&NB); Nt=NB*NB; /* size of block.*/ N1=N/NB; /* # of blocks in the horizontal or vertical directions*/ NS=NB*N; /* Size of input buffer. */ NC=N1*N1; /* Total # of blocks in image.*/ /*Allocating memory.*/ buffi=(float *)malloc(NS*sizeof(float)); sumd=(float *)malloc(Nt*sizeof(float)); sumdsq=(float *)malloc(Nt*sizeof(float)); sigma=(float *)malloc(Nt*sizeof(float)); xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); gotoxy(xt,yt); for(j=0;j<Nt;j++) { sumd[j]=0.0; sumdsq[j]=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; 418 k=kk2+k2 ; sumd[k]+=buffi[loc]; sumdsq[k]+=buffi[loc]*buffi[loc]; } /* k2 loop. */ } /* k1 loop. */ } /*j-loop.*/ } /* i loop*/ /* Compute o for each coefficient.*/ printf ( "\nComputing the Standard deviation for " ); printf ("each coefficient. \n" ) ; denom=(float) NC*(float) (NC -1.0); for(i=0; i<Nt ; i++) { sigma[i]=fabs((((float)NC)*sumdsq[i]- (sumd[i]*sumd[i]))/denom); sigma[i]=(float)sqrt( (double)sigma[i]); if(sigma[i]==0.0) sigma[i]=1.0e-10 ; } free(sumd); free(sumdsq); fclose(fptri); xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs( " ") ; gotoxy (xt , yt ) ; printf ( " \ nDone."); b=(int *)malloc(Nt*sizeof(int)); k=0 ; printf("\n\nEnter bpp >"); scanf("%f",&bpp); printf("\nEnter file name to store bit allocation matrix >"); scanf("%s",file_name); fptro=fopen(file_name ,"w"); B=bpp*Nt; theta=0.01; for(i=0;i<Nt;i++) { 419 sum=0.5*log10((double)(sigma[i]*sigma[i]/the ta))/log10(2.0); b[i]=(sum>0.0)?(int)sum:0; } Bs=0 ; for(i=0;i<Nt;i++) Bs+=b[i]; error=Bs-(float)B; if(error>0) xp=theta; else xn=theta; sign1=(error>0.0)?1:-1; theta=1.0; while(1) { for(i=0;i<Nt;i++) { sum=0.5*log10((double)(sigma[i]*sigma[i]/the ta))/log10(2.0); b[i]=(sum>0.0)?(int)sum:0; } Bs=0; for(i=0;i<Nt;i++) Bs+b[i]; error=Bs-(float)B; sign2=(error>0.0)?1:-1; if((sign1+sign2)==0) break; theta+=1; } if(error>0.0) xp=theta; else xn=theta; /* Half-interval method. */ k=0; while(1) { k++; theta=(xp+xn)/2.0; for(i=0;i<Nt;i++) { sum=0.5*log10((double)(sigma[i]*sigma[i]/the ta))/log10(2.0); b[i]=(sum>0.0)?(int)sum:0; } 420 Bs=0; for(i=0;i<Nt;i++) Bs+=b[i]; error=Bs-(float)B; if((fabs(error)<0.5)||(k>=200)) break; if(error>0.0) xp=theta; else xn=theta; } clrscr(); printf("\n%d\n",Bs); printf("\n\n Bit allocation matrix.\n"); k=0; for(i=0;i<NB;i++) { for(j=0;j<NB;j++) printf(" %3d",b[k++]); printf("\n"); } error=B-Bs; printf("\nError in total bit allocation=%f bits\n",error); k=0; for(i=0;i<NB;i++) { for(j=0;j<NB;j++) fprintf(fptro,"%d ",b[k++]); fprintf(fptro,"\n"); } } Chạy chơng trình 13.14 trên KARENFCT.IMG, chúng ta rút ra ma trận phân bố bit giới thiệu trong bảng 13.2 với bpp lần lợt bằng 1 và 0.5. Bài tập 13.15 1. Lập một chơng trình C dùng phơng pháp ma trận phân bố bit để nén ảnh. Chú ý là bạn sẽ không cần thay đổi các hệ số FCT. Mỗi hệ số bạn sẽ dùng các bớm chuẩn của nó và dùng lợng tử hoá Lloyd-Max. Nếu một hệ số, chiếm bốn bít trong bảng phân bố, thì bạn sẽ dùng lợng tử hoá 4 bit. Chú ý, phân bố cho các hệ số đồng thời đợc mô tả tốt nhất bằng một hàm Gauss (thoả mãn biểu thức này). Đồng thời tạo ra phần header của file đúng quy tắc cho lợng tử hoá ngợc. 2. Lập một ma trận lợng tử hoá ngợc cho phơng pháp này. 421 3. So sánh các kết quả việc khôi phục các ảnh dùng phơng pháp trớc và phơng pháp này với 0.5 bpp, 1 bpp và 1.5 bpp. Nh bạn đã thấy, đây là chơng dài nhất trong cuốn sách này. Nguyên nhân chủ đề này liên quan nhiều đến công nghiệp và các lĩnh vực nghiên cứu công nghiệp. Tuy nhiên, tôi không nói đến tất cả các phơng pháp viết về lĩnh vực này nh lợng tử hoá vector với hệ code-book, phơng pháp này có giá trị của nó, và điều mã xung có phân biệt (DPCM). Những phơng pháp tôi đề cập đến trong chơng này là những phơng pháp đợc sử dụng rộng rãi. Những độc giả quan tâm đến những thông tin hơn nữa có thể tìm kiếm và tham khảo những sách và báo đề cập đến chủ đề này. Có thể tham khảo trang có liên quan đến lợng tử hoá vector ở phần 15. Chủ đề lợng tử hoá vector đợc nói đến trong phần 14. DPCM đề cập đến ở phần 4 và 16. Bảng 13.12 Phân bố bit cho karen.img. (a) 1 bpp; (b) 0.5 bpp. 6 4 3 2 2 1 1 0 4 3 2 2 1 1 0 0 3 3 2 2 1 1 0 0 2 2 2 1 1 0 0 0 2 2 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (a) 5 3 2 1 1 0 0 0 3 2 2 1 0 0 0 0 2 2 1 1 0 0 0 0 2 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (b) Có nhiều chuẩn trong việc nén ảnh; đặc biệt là chuẩn đợc đợc JPEG (Joint Photographic Experts Group) đề xuất đang bắt đầu áp dụng trong một số ứng dụng. Trong chuẩn JPEG ảnh đợc nén nh sau: 1. Khối điểm kích thớc 8 8 của DCT trên ảnh nguyên gốc đợc tính. 422 2. Hệ số chuyển đổi đợc tiêu chuẩn hoá bằng cách áp dụng một mảng do ngời sử dụng định nghĩa nó đợc định trớc cho tất cả các khối. 3. Hệ số DC đợc mã hóa với lợc đồ DPCM. 4. Mỗi khối đợc sắp xếp lại sử dụng mã zigzag (xem hình 13.21). Điều này là theo RLC và lợc đồ mã Huffman. Để nén một ảnh màu, JPEG đề xuất rằng mỗi thành phần đợc mã hoá một cách độc lập với nhau. Trong chuẩn JPEG, ngời sử dụng cần phải cung cấp mảng tiêu chuẩn hoá. Điều này là một phần khó khăn của bài toán còn để lại cho ngời sử dụng. Hai mục trên nói về vi mạch đã đợc phát triển trong công nghệ phục vụ việc nén/giải nén ảnh thời gian thực đợc đề cập trong phần tham khảo 18 và 19. Chúng đợc dựa trên cơ sở những chuẩn đợc đề xuất bởi JPEG. Hình 13.21 Mã Zigzag. . nhiều chuẩn trong việc nén ảnh; đặc biệt là chuẩn đợc đợc JPEG (Joint Photographic Experts Group) đề xuất đang bắt đầu áp dụng trong một số ứng dụng. Trong chuẩn JPEG ảnh đợc nén nh sau: 1. Khối. ngời sử dụng. Hai mục trên nói về vi mạch đã đợc phát triển trong công nghệ phục vụ việc nén/ giải nén ảnh thời gian thực đợc đề cập trong phần tham khảo 18 và 19. Chúng đợc dựa trên cơ sở những. while(1) { k++; theta=(xp+xn)/2.0; for(i=0;i<Nt;i++) { sum=0.5*log10((double)(sigma[i]*sigma[i]/the ta))/log10(2.0); b[i]=(sum>0.0)?(int)sum:0; } 420 Bs=0; for(i=0;i<Nt;i++)

Ngày đăng: 29/07/2014, 04:20

TÀI LIỆU CÙNG NGƯỜI DÙNG

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

TÀI LIỆU LIÊN QUAN