Chúng ta nhận thấy rằng hầu hết các hệ số này có biên độ rất nhỏ so với các giá trị xung quanh khối một chiều DC.. Mỗi hệ số có 1024 giá trị khi chúng ta xem xét tất cả các khối, và tạo
Trang 11 Làm lại bài tập 13.8 nhưng lần này dùng chương trình 13.10 cho giải thuật Lloyd
2 So sánh thời gian tính toán khi dùng giải thuật Lloyd-Max và khi dùng giải thuật Lloyd
Từ biểu thức (13.52) và (13.58) chúng ta có thể phát triển một chương trình cho tình trạng méo tối thiểu:
1
0
2 2
min
1 1
) ( )
(
N
k
d d
d
k k k
k
dy y p r
dy y p y
13.6 Lượng tử hoá các hệ số của FCT
Trong phần 13.4 chúng ta đã bắt đầu vấn đề của biến đổi cho mã hoá Phương pháp chúng ta áp dụng là chia ảnh thành các khối hình vuông; mỗi khối có kích thước 8 8 và 16 16 Biến đổi cosin nhanh cho mỗi khối này đã được rút ra Chúng ta nhận thấy rằng hầu hết các hệ số này có biên độ rất nhỏ
so với các giá trị xung quanh khối (một chiều) DC Câu hỏi đặt ra lúc này là các hệ số nào chúng ta cần lưu giữ và bằng phương pháp nào chúng ta có thể lưu giữ tốt nhất các giá trị này? Câu trả lời cho vấn đề này có thể tìm thấy trong phần lượng tử hoá mà chúng ta đã nghiên cứu ở trên
Chú ý là các hệ số của FCT xác định một dạng biến dạng Cho ví dụ, một ảnh có 256 256 điểm và kích thước của các khối là 8 8 điểm, có tất cả 64
hệ số cho mỗi khối và 32 32 khối Mỗi hệ số có 1024 giá trị khi chúng ta xem xét tất cả các khối, và tạo nên một biến dạng riêng Đánh giá biến dạng
cho hệ số thứ j có thể cho bởi
1
0
,
1
) ( ) (
J k j
j k
N
k d
d
j j k
j = 0, 1, 2, , L - 1
ở đây L là số các hệ số cho một khối và N j số các mức lượng tử cho hệ số j
Tổng số các biến dạng sẽ là
1
0
L
j j
D
Làm theo các bước trong phần 13.5 chúng ta được
dy y p
dy y yp r
j d
d
j
j k j k
) (
) (
, 1 1
,
Trang 2và
2
, 1 , ,
j k j k j k
r r
Nếu chúng ta coi rằng bất kỳ hệ số nào có thể xác định bằng cùng một hàm khả năng xuất hiện độ sáng, thì thay thế giá trị các hệ số này (mà được biểu
diễn trong biểu thức trên là y) bằng
j
Chúng ta sẽ cho tất cả các hệ số với các phân bố xuất hiện giống nhau, với giá trị trung bình và chuẩn của độ lệch cho bởi = 0 và = 1 Kết quả sau khi tính toán cho ta các mức chia và các mức khôi phục cho tất cả hệ số “chia” Điều này tất nhiên chỉ áp dụng với điều kiện là các hệ số có cùng một số các bit Trước khi đưa ra các mức lượng tử chúng ta có thể bỏ bớt một số hệ số
Nếu hệ số (0, 0) hay còn gọi là thành phần một chiều DC biểu diễn cho giá trị
trung bình của độ sáng của một khối, chúng ta không thể bỏ điểm này đi được
Các hệ số khác trong một khối (còn gọi là các hệ số xoay chiều AC) mang các
thông tin về các chi tiết của ảnh Có thể nhận thấy là các chi tiết có độ lệch lớn hơn độ lệch chuẩn thì mang nhiều tin tức hơn các chi tiết có độ lệch ít hơn độ lệch chuẩn Vì vậy mà chúng ta bắt đầu lược bỏ các hệ số bắt đầu từ vùng có trải rộng ít nhất Vậy bao nhiêu hệ số sẽ được chúng ta giữ lại? Điều này phụ thuộc vào mức độ mà chúng ta muốn nén ảnh và phụ thuộc vào bao nhiêu các chi tiết bị mất trên ảnh mà chúng ta có thể chấp nhận được
Dựa trên các giả thiết trên chúng ta có thể phát triển một thuật toán cho nén ảnh và lượng tử hoá Các bước sau mô tả cho cả việc lượng tử hoá các hệ số FCT
1 Tính và cho tất cả các hệ số FCT (Chú ý là độ lệch chuẩn và trung bình có thể tính trong một dải thông của ảnh dùng biểu thức sau cho :
) 1 (
2 2
2
n n
x x
ở đây x i biểu diễn các giá trị cho một trong các hệ số) được tính từ tổng
của x i
2 Áp dụng các hệ số cho các chi tiết được giữ lại cụ thể là 0.25 , 0.5
3 Giữ lại các hệ số đã nhân thêm phân số chia có sai lệch cao hơn sai lệch chuẩn
4 Định dạng một ma trận T có dạng
Trang 3
lại còn hợp trường các 0
mất không j)
(i, số hệ nếu 1
ij
T
5 Chia khoảng cỏch cỏc hệ số c ij (cụ thể một cho cỏc giỏ trị mà T ij = 1) trong tất cả cỏc khối, ngoại trừ cỏc giỏ trị một chiều cho mỗi khối, như sau:
ij
ij ij c
6 Tớnh phõn bố của cỏc giỏ trị AC “chia” cho mảng FCT
7 Tớnh s của phõn bố rỳt ra từ cỏc bước trước
8 Dựng lượng tử hoỏ Lloyd-Max mức N, và sửa lại cỏc mức chia và khụi
phục cỏc mức theo:
i = 0, 1, 2, , N - 1
chỳ ý d N = -d 0
Hàm phõn bố Laplace cung cấp một xấp xỉ tốt hơn cho phõn bố của cỏc hệ
số chia như chỳng ta thấy ở phần dưới đõy Sự lựa chọn của N cũng như
cỏc hệ số chia của cỏc hệ số phụ thuộc mức độ nộn
9 Lượng tử cỏc hệ số AC “ chia” dựng lượng tử hoỏ của bước 8
10 Chia mỗi giỏ trị một chiều với 2 Điều này đảm bảo rằng cỏc giỏ trị một chiều khụng vượt quỏ 255 (một biểu diễn 8 bit)
11 Định dạng một phần đầu file chứa đầy đủ thụng tin để khụi phục lại ảnh
bị nộn Phần này chứa thụng tin về cỏc mức chia và cỏc mức một chiều bị cắt bớt và tập hợp cỏc giỏ trị AC cho cỏc hệ số giữ lại
12 Áp dụng mà mó hoỏ Huffman cho file chứa cỏc giỏ trị AC
Ma trận T thường gọi là ma trận khu vực, và cần cung cấp cỏc hệ số cho
chức năng khụi phục Phần đầu file dựng bốn thụng tin theo thứ tự sau
Chiều rộng của khối (ta coi khối là một hỡnh vuụng): 1byte
Số cỏc mức lượng tử: 1 byte
Chiều rộng của ảnh: 2 byte
Trang 4Độ lệch chuẩn, trung bình: 4 byte trong biểu diễn số thực số các hệ số Các mức khôi phục: 4 byte trong biểu diễn số thực/ mức
Chương trình 13.11 đưa ra lượng tử của các hệ số biến đổi cosin dùng các bước trên Kết quả của chương trình là 3 file có cùng tên do người dùng xác định, nhưng có phần mở rộng khác nhau Nếu người dùng cho tên ‘image1q’
khi trả lời cho thông báo “Enter file name to store quantized image .” xuất
hiện khi chạy chương trình, ba file sau đây được tạo ra:
1 ‘image1q.hdr’, là file chứa thông tin về header
2 ‘image1q.dc’ là file chứa thông tin về các hệ số một chiều bị cắt bớt
của một loạt các khối
3 ‘image1q.ac’ file chứa một loạt các lượng tử cho các hệ số AC của một
loạt các khối Phần này không chứa thông tin về các giá trị bị loại bỏ, nếu chúng ta coi rằng nó có giá trị 0 và ma trận vùng chỉ ra vị trí của nó trong khối
Chương trình nhập các tên sau đây do người dùng đặt:
1 Tên file chứa biến đổi cosin của một ảnh bị nén, và kích thước của khối dùng trong FCT
2 Tên file chứa dữ liệu lượng tử Lloyd-Max Nếu bạn chạy MAXQ1.EXE (xem bài tập 13.8), và cho tên file chứa các mức lượng tử mà bạn muốn dùng Lượng tử 5 bit Laplace cho kết quả tuyệt vời Lượng tử 4 bit Laplace cho bạn một kết quả có thể chấp nhận được, như là một kinh nghiệm cho bạn
3 Phần trăm của các hệ số AC được giữ lại Bạn có thể lựa chọn bất kỳ giá trị nào: thông thường là 0.25 hoặc là 0.5 Các phân số nhỏ hơn hay mức thấp hơn các mức lượng tử gây nên một sai số cao hơn khi khôi phục lại ảnh
4 Tên file chứa các lượng tử hoá của ảnh Để trả lời, bạn cho tên file không có phần mở rộng như đã nói trước đây
Chương trình 13.11 “QUANTIZE.C” Chương trình cho lượng tử hoá
và nén kết quả của biến đổi FCT
/* -
This program does quantization on the block
DCT of an image The input file should be the
block DCT transform o the image The program
also designs a quantizer based on the statistics
Trang 5of the DCT coefficients
You should first run either the program for
the Lloyd-Max or the one for Lloyd quantizer
design if you haven't already done so
-*/
#include <stdio.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>
#include <io.h>
#include <string.h>
#include <process.h>
void main()
{
int N,i,j,k,M,xt,yt,N1,NS,k1,k2,NB,Nt;
int m,kk,kk1,kk2,kt;
unsigned long int NC,NQ,loc,loc1;
float nsq,*sigma,*d,sum,*histo,*x,*mu;
float denom,mut,sigmat,*sumd,*sumdsq;
float Max,Min,h,*r,dt,rt,fdct,smax;
int b,*T;
FILE *fptri,*fptro,*fptro1;
char file_name[14],*imaget,temp[14];
float *buffi;
unsigned char ch;
clrscr();
printf("This program carries out quantization on the block");
printf("\n DCT of an image The 2-D FCT should
be run on the");
printf("\n image prior to this program If you haven't, just");
printf("\n enter NULL to the first prompt this will return you");
printf("\n to DOS.\n");
printf("\n You will need also to run the program MAXQ for");
printf("\n designing the Max quantizer The
program will");
printf("\n modify the decision and reconstruction
Trang 6printf("\n the quantizer to fit the results to the statistics");
printf("\n of the DCT data.\n\n");
printf("Enter name of input file containing 2-D FCT results >");
scanf("s",file_name);
fptri=fopen(file_name,"rb");
if(fptri==NULL)
{
printf("\nNo such file exists.\n");
exit(1);
}
nsq=filelength(fileno(fptri));
/* -
Assume image is square
-*/
N=(int)sqrt((double)(nsq/sizeof(float)));
m=(int)(log10((double)N)/log10((double)2.0));
k=1;
for( i=0; i<m; i++)
k<<=1;
if(k!=N)
{
printf ("\nTransformed Image should have dimensions" ) ;
printf ( "\nthat are multipies 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));
Trang 7mu=(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;
k=kk2+k2 ,
sumd[k]+=buffi[loc];
sumdsq[k]+=buffi[loc]*buffi[loc];
} /* k2 loop */
} /* k1 loop */
} /*j-loop.*/
} /* i-100p*/
/* Compute s and g for each coefficient.*/
printf("\n Computing 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]);
mu[i]=sumd[i]/(float)NC;
Trang 8free(sumd);
free(sumdsq);
rewind(fptri); /*Rewind input file.*/
xt=wherex();
yt=wherey();
gotoxy(70,25);
textattr(WHITE+(BLACK<<4));
cputs(" ");
gotoxy(xt,yt);
printf("\nDo you wish to save histogram data");
printf("\n for plotting (y or n) >");
while(((ch-getch())!='y')&&(ch!='n'));
if(ch=='y')
{
printf("\nEnter name for output file to store
histogram");
printf("\n of a.c components of the DCT of each
block >");
scanf("%s",file_name);
fptro=fopen(file_name,"w");
printf("\nEnter number of data points you wish
generated on the");
printf("\n histogram distribution >");
scanf("%d",&M);
}
else M=64;
/*Allocating memory.*/
d=(float *)malloc((M+1)*sizeof(float));
histo=(float *)malloc(M*sizeof(float));
x=(float *)malloc(M*sizeof(float));
clrscr ();
gotoxy(70, 25);
textattr(WHITE+(GREEN<<4)+BLINK);
cputs("WAIT");
gotoxy (1,1);
printf ("\nGenerating the distribution of the a.c " );
printf ( "\n coefficients of the Cosine transform
");
/*scaling and generating histogram of
a.c coeff i ci ents */
Max=1.e-20;