Tải bản đầy đủ (.pdf) (12 trang)

Nén Ảnh part 7 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (355.27 KB, 12 trang )


381
for(i=0;i<N;i++)
fprintf(fptr,"%f %f \n",d[i],r[i]);
fclose(fptr);
}
double p(double x)
{
double prob;
switch(ch)
{
case '1':
prob=exp(-x*x*0.5);
break;
case '2':
prob=1.0;
break;
case '3':
prob=exp(-1.4142136*fabs(x));
break;
}
return prob;
}

#define EPS 1.0e-6
/*
Calculating the next decision level,
given values for d[i-11 and r[i-1].
*/
double decision_level(double di_1, double ri_1)
{


double delta,di,fun,dfun,ff,area1,area2;
int i;
if(fabs(di_1)>10.0) delta=2.0;
else delta=0.1;
di=ri_1+delta;
i=0;
/* Using Newton-Raphson's method for root
finding. */
while(fabs(delta)>=EPS)
{
i++;
if(i>=1000)
{

382
printf("\n no convergence.\n");
return di;
}
area1=Romberg(di-1,di,f1);
area2=Romberg(di-1,di,f2);
ff=area1/area2;
fun=(ri_1)-ff;
if(fabs(area2)<=1.0e-10)
{
printf("\n A numerical problem was
encountered.");
printf("\n Restart problem with a different
choice.");
exit(1);
}

dfun=-p(di)*(di-ff)/area2;
if(fabs(dfun)<=1.0e-10)
{
gotoxy(1,20);
printf("\n derivative=%f",dfun);
printf("\n A numerical problem was
encountered.");
printf("\n Restart problem with a different
choice.");
exit(1);
}
delta=-fun/dfun;
di+=delta;
}
return di;
}
/*
functions used by numerical integration routine.
*/
double f1(double y)
{
return (y*(p(y)));
}
double f2(double y)
{
return p(y);
}

383
/*

Numerical integration using
Romberg method.
*/
double Romberg(double di_1,double di,double
(*f)(double))
{
double T[10][10],h,x,Area;
int N,k,kk,i,j;

N=9;
k=1 ;
h=di- di_1;
T[0][0]=h*((*f)(di_1)+(*f)(di))/2.0;
for(i=1;i<=N;i++)
{
k<<=1;
h/=2.0;
x=di_1 - h;
Area=0.0;
T[0][i]=(T[0][i-1])/2.0;
for(j=0;j<(k-1);j+=2)
{
x+=2.0*h ;
Area+=(*f)(x);
}
T[0][i]+=Area*h;
kk=1;
for(j=1;j<=i;j++)
{
kk<<=2;

T[j][i]=(kk*T[j-1][i]-T[j-1][i-
1])/(float)(kk-1);
}
}
return T[N][N];
}


Bài tập 13.8
1. Chạy chơng trình 13.9 dùng các lựa chọn sau:
3 bit, 4 bit, 5 bit, 6 bit.

384
2. Với mỗi lựa chọn số bit ta chọn:
Gauss.
Đồng đều.
Laplace.
3. Các mức lợng tử có thể dùng cho thiết kế có trên đĩa, ví dụ dùng
Q3G.DAT cho lợng tử 3 bit dùng lợng tử Gauss, Q4L.DAT cho 4 bit
lợng tử Laplace.
Phơng pháp Lloyd Lloyd cũng đa ra một phơng pháp thứ hai cho
phép xác định các mức lợng tử mà ông gọi là phơng pháp Lloyd I.
Phơng pháp này có nhiều u điểm hơn phơng pháp II (giải thuật Lloyd-
Max), vì nó dễ dàng cho tính toán và các vector lợng tử hoá có thể mở
rộng. Chú ý là vấn đề mà chúng ta quan tâm ở đây là khoảng cách lợng
tử hoá, lợng tử hoá của hàm một biến đã biết đợc phân tán. Vector
lợng tử hoá là một vector của nhiều biến mà với các biến này ta đã biết
đợc phân tán.
Thuật toán Lloyd theo các bớc sau:


1. Rút ra ớc lợng cho phạm vi của các biến
d
i
{i = 0, 1, 2, , N}
(Một ớc lợng có thể rút ra bằng cách dùng các giá trị từ lợng tử hoá
đồng đều hoặc từ các mức lợng tử trớc mà ta cần một kết quả tốt hơn).
2. Đặt một biến D
1
= 0. D
1
dùng để lu lại tình trạng không chính xác
lúc trớc.
3. Tính






1
1
)(
)(
i
i
i
i
d
d
d

d
i
dyyp
dyyyp
r
i = 0, 1, , N - 1.
4. Tính
d
r r
i
i i


1
2

i = 0, 1, , N - 1
5. Tính tình trạng không chính xác







1
0
2
2
1

)()(
N
k
d
d
k
k
k
dyypryD
Có thể dễ dàng mở rộng biểu thức trạng thái không chính xác theo

385













1
0
22
111
)()(2)(

N
k
d
d
d
d
k
d
d
k
k
k
k
k
k
k
dyyprdyyyprypyD
(13.58)
6. Nếu

D D
D
2 1
1




thì một giải pháp đã đợc tìm ra. Lu lại kết quả và thoát khỏi chơng
trình.

7. Đặt D
1
= D
2
8. Quay lại bớc 3.

Một chơng trình C cho giải thuật trên đợc đề cập đến ở dới đây.



Chơng trình 13.10 LLOYDQ.C Thuật toán Lloyd cho việc
thiết kế các mức lợng tử.
/*Program13.10 "LLOYDO.C".Lloyd algorithm for
quantizer design.*/
/* Program for designing the Lloyd-quantizer
for a Gauss, uniform or Laplace
distribution.*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>

double decision_level(double, double);
double f1(double);
double f2(double);
double f3(double);
double p(double);
double Romberg(double, double, double

(*)(double));
char ch;

void main( )
{
double *r,*d,step,sum,I1,I2,I3,D1,D2;

386
int i,j,m,N,xt,yt,niter,ind;
char file_name[16],ch1;
FILE *fptr;

clrscr( ) ;
printf("Enter number of bits >");
scanf("%d",&m);
printf("Enter number of iterations >");
scanf("%d",&niter);
N=1<<m;
r=(double *)malloc((N+1)*sizeof(double));
d=(double *)malloc((N+1)*sizeof(double));

printf("Enter choice of distribution:");
printf("\n 1. Gauss.");
printf("\n 2. Uniform.");
printf("\n 3. Laplace. >(1,2 or 3): ");

while(((ch=getch())!='1')&&(ch!='2')&&(ch!='3'));
putch(ch);
printf("\n Do you wish to start from a previous
design?

(y or n) >");
while(((ch1=getch())!='y')&&(ch1!='n'));
putch(ch1);
ind=0;

switch(ch1)
{
case 'y':
printf("\n Enter name Of file containing
quantizer data Y");
scanf("%s",file_name);
fptr=fopen(file_name,"r");
if(fptr==NULL)
{
printf("\n No such file.");
ind=1;
}
if(ind!=1)
{
for(i=0;i<N;i++)

387
fscanf(fptr,"%f %f ",&d[i],&r[i]);
d[N]=20.0;
fclose(fptr);
break;
}
case 'n':
d[N]=20.0;
d[0]=-20.0;

if(ch=='2')
{d[N]=1.0; d[0]=-1.0;}
step=(d[N]-d[0])/(float)N;
for(i=1;i<N;i++)
d[i]=d[i-1]+step;
}

D1=0.0;
for(j=0;j<niter;j++)
{
gotoxy(1,15);
printf("iter=%d",j);
D2=0.0;
for(i=0;i<N;i++)
{
I1=Romberg(d[i],d[i+1],f3),
I2=Romberg(d[i],d[i+1],f1);
I3=Romberg(d[i],d[i+1],f2);
r[i]=I2/I3;
D2+=I1-2.0*r[i]*I2+r[i]*r[i]*13;
}

for(i=1;i<N;i++)
d[i]=(r[i]+r[i-1])/2.0;
printf("\nDistortion=%lf",D2);
if(fabs((D2-D1)/D2)<=1.e-6)
{
printf("\n\nConvergence was
reached.\n");
break;

}
D1=D2;
}


388
switch(ch)
{
case '1':
case '3':
printf("\n\n -%c %9.6f ",(char)236,r[0]);
break;
case '2':
printf("\n\n %9.6f %9.6f ", d[0], r[0]);
}
for(i=1; i<N; i++)
printf("\n %9.6f %9.6f ",d[i],r[i]);
switch(ch)
{
case '1':
case '3':
printf("\n +%c",(char)236);
break;
case '2':
printf("\n %9.6f ",-d[0]);
}
printf("\nEnter file name for storing
quantizer >");
scanf("%s",file_name);
fptr=fopen(file_name,"W");

for(i=0; i<N; i++)
fprintf(fptr,"%f %f \n",d[i], r[i]);
fclose(fptr);
}

double p(double x)
{
double prob;
switch(ch)
{
case '1':
prob=exp(-x*x*0.5);
break;
case '2':
prob=1.0;
break;
case '3':
prob=exp(-1.4142136*fabs(x));

389
break;
}
return prob;
}
/*
functions used by numerical integration routine.
*/
double f1(double y)
{
return (y*(p(y)));

}

double f2(double y)
{
return p(y);
}
double f3(double y)
{
return y*y*p(y);
}


Bài tập 13.10
1. Làm lại bài tập 13.8 nhng 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
22
min
11
)()(
N
k
d
d
d
d
k
k
k
k
k
dyyprdyypyD
(13.59)
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.

390

Câu hỏi đặt ra lúc này là các hệ số nào chúng ta cần lu giữ và bằng
phơng pháp nào chúng ta có thể lu 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
j
k
j
k
N
k
d
d

jjkj
dyypryD
(13.60)
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
DD (13.61)
Làm theo các bớc trong phần 13.5 chúng ta đợc


dyyp
dyyyp
r
j
d
d
d
d

j
jk
jk
kj
j
k
j
k
)(
)(
,1
1
,




(13.62)

2
,1,
,
jkjk
jk
rr
d


(13.63)
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

y
j
j



(13.64)
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

391
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





nn
xxn
ii


ở đâ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





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
ijij
c



(13.65)
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.

392

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:

d d
i i s



(13.66)
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.

Ma trận T: 1 bit cho một phần tử.

Độ 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.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×