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

Đề thi Xử Lý Ảnh doc

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 (2.07 MB, 68 trang )

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
1

Đề thi Xử Lý Ảnh
GV: Trần Tiến Đức

MỤC LỤC

ĐỀ THI VÀ ĐÁP ÁN MÔN XỬ LÝ ẢNH SỐ
Chương 3 gồm 13 câu từ câu 1 đến câu 13
Câu 1. Xây dựng và cài đặt thuật toán làm âm ảnh.
Đáp án:
Cách làm âm c cho bs=L-1-r  ng mc xám, r
là mu vào, s là mu ra








Quan  th ta thy: Mu vào, tc là thut toán này bin nh
 thành nh trng và trng thành 
Cod e :
void Negatives(BYTE **f, BYTE **g)
{
int x, y;
BYTE r,s;
for (x=0; x<M; x++)
for (y=0; y<N; y++) {


r = f[x][y];
S

R

(0,0)

L-1

L-1

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
2

s = L-1-r;
g[x][y] = s;
}
return;
}
Câu 2. Xây dựng và cài đặt thuật toán biến đổi logarit ảnh.
Đáp án:
 bii:
s=c log(1+r)
t
 r là mu vào
 s là mc u ra
 c: hng s 
 ng hp log = 0.
Quan sát  th thng log làm cho nh
tr 

Hằng số c được tính như sau:
c log(1+r)
Rõ ràng r=0 thì s=0
Ta cn có: r=L-1 thì s=L-1
 c=
)11log(
1


L
L

 Vi L = 256 thì c= 45.9859
Cod e :
void Logarithm(BYTE **f, BYTE **g)
{
int x, y;
double r,s;
double c = (L-1)/log(1.0*L);

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y];
s = c*log(1+r);
g[x][y] = (int)s;
}
return;
}
Intensity
log

L-1
L-1
(0,0)
Negative
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
3

Câu 3. Xây dựng và cài đặt thuật toán biến đổi lũy thừa ảnh.
Đáp án:
Bic cho b
s=cr

vi r là mu vào, s là mu ra,
c, ng s 
 
 nh t
c: được tính như sau:
Ta th th:
 r=0 thì s=0
 r=L-1 thì s= L-1
 L-1=c(L-1)

 c=

)1(
1


L
L


Cod e :
void Power(BYTE **f, BYTE **g)
{
int x, y;
double r,s;
double gamma = 5.0;
double c = (L-1)/pow(1.0*(L-1),gamma);

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y];
s = c*pow(1.0*r,gamma);;
g[x][y] = (int)s;
}
return;
}












γ=0,4

γ=1
γ=1,5
S
R
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
4



Câu 4. Xây dựng và cài đặt thuật toán biến đổi tuyến tính từng phần.
Đáp án:












Quan sát trên đồ thị ta thấy:
Bii u, làm cho nh trng ít tr thành trng nhiu. Tc là làm
 n ca  n).
Ta có:
ng thm (x1,y1) và (x2,y2) là:
12
1

yy
yy


=
12
1
xx
xx



Y=
12
12
xx
yy


(x-x1)+y1
 n m (0,0) và (r1,s1)
S=
1
1
r
s
r
 m (r1,s1) và (r2,s2)











s
L-1
L-1
r
(r2,s2)
(r1,s1)
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
5

S=
12
12
rr
ss


(r-r1)+s1
 m (r2,s2) và (L-1,L-1)
S=
2)1(
2)1(
rL

sL


(r-r2)+s2
c.
Cod e :
void PiecewiseLinear(BYTE **f, BYTE **g)
{
double r1,s1,r2,s2,rmin,rmax,s,r,m,sum;
int x, y;

rmin = f[0][0];
rmax = f[0][0];

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y];
if (r<rmin)
rmin = r;
if (r>rmax)
rmax = r;
}

r1 = rmin;
s1 = 0;
r2 = rmax;
s2 = L-1;

for (x=0; x<M; x++)
for (y=0; y<N; y++) {

r = f[x][y];
if (r<r1)
s = s1/r1*r;
else if (r<r2)
s = (s2-s1)/(r2-r1)*(r-r1)+s1;
else
s = (L-1-s2)/(L-1-r2)*(r-r2)+s2;
g[x][y] = (int)s;
}
return;
}
Câu 5. Xây dựng và cài đặt thuật toán cân bằng histogram.
Đáp án:
Ma cân bng u
n ca nh.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
6

Cân bc cho b
s=T(r)=(L-1)

r
r
dwwp
0
)(

vi p
r
(w) : Xác sut xy ra mc xám w

Trong xác sut, tích phân ca hàm m là hàm phân phi. Công thc trên có w là bin liên
tc, ta không th lp trình nó. Ta phi dùng công thc ri rc:
s
k
=T(r
k
)=(L-1)


k
j
jr
rp
0
)(

v-1
Cod e :
void HistogramEqualization(BYTE **f, BYTE **g)
{
double T[L];
int k, j, x, y;
BYTE r;
double s;
double p[L];

Histogram(f,p);

for (k=0; k<L; k++) {
T[k] = 0;

for (j=0; j<=k; j++)
T[k] = T[k] + p[j];
}

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y];
s = T[r];
g[x][y] = (int)(s*(L-1));
}
return;
}
Câu 6. Xây dựng và cài đặt thuật toán đặc tả histogram.
Đáp án:
Không phi cân bng hit, nnh v 
ta mong mun.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
7


Tính histogram ca nh ri suy ra hàm bii histogram t ng
p
r
(r
j
)=
MN
n
j


s
k
=T(r
k
)=


k
j
jr
rp
0
)(

Cho histogram mong mun p
z
(z
i
)
Bii histogram mong mun.
v
k
=G(z
k
)=
k
k
j
jz
szp 


0
)(

Cho r
k
, ta suy ra z
k

z
k
= G
-1
(T(r
k
))
Mục tiêu: có mu vào r
k
, ta suy ra mu ra z
k
.
Ví d cho histogram mong mu sau:
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
8


 mô t histogram mong mung th
m (x
1
,y

1
) và (x
2
,y
2
):
12
1
yy
yy


=
12
1
xx
xx


=>y=
12
12
xx
yy


(x-x1)+y1

Cod e :
void HistogramSpecification(BYTE **f, BYTE **g)

{
double pz1,pz2,pz3,pz4,pz5,pz6;
int z1,z2,z3,z4,z5,z6;
double pz[L];
double G[L];
double pr[L];
double T[L];
double sum;

int z, k, i, j, x, y;

// Histogram dac ta
z1 = 0; pz1 = 0.75;
z2 = 10; pz2 = 7;
z3 = 20; pz3 = 0.75;
z4 = 180; pz4 = 0;
z5 = 200; pz5 = 0.7;
z6 = 255; pz6 = 0;

for (z=0; z<L; z++)
if (z<z2)
pz[z] = (pz2-pz1)/(z2-z1)*(z-z1) + pz1;
else if (z<z3)
pz[z] = (pz3-pz2)/(z3-z2)*(z-z2) + pz2;
else if (z<z4)
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
9

pz[z] = (pz4-pz3)/(z4-z3)*(z-z3) + pz3;
else if (z<z5)

pz[z] = (pz5-pz4)/(z5-z4)*(z-z4) + pz4;
else
pz[z] = (pz6-pz5)/(z6-z5)*(z-z5) + pz5;


// Chuan hoa pz sao cho tong xac suat bang 1
sum = 0;
for (z=0; z<L; z++)
sum += pz[z];

for (z=0; z<L; z++)
pz[z] = pz[z]/sum;

for (k=0; k<L; k++) {
G[k] = 0;
for (i=0; i<=k; i++)
G[k] = G[k] + pz[i];
}

// Histogram cua anh
Histogram(f,pr);
for (k=0; k<L; k++) {
T[k] = 0;
for (j=0; j<=k; j++)
T[k] = T[k] + pr[j];
}


// Matching 2 histogram
BYTE r;

double s;
for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y];
s = T[r];
for (k=0; k<L; k++)
if (G[k]>=s)
break;
g[x][y] = k;
}
return;
}
Câu 7. Xây dựng và cài đặt thuật toán cân bằng histogram cục bộ.
Đáp án:
ng hp 2 mc xám k nhau chênh lch quá nh, nu ta cân bng histogram t ng
s không có kt qung hi dùng histogram cc b.
Chn ca s c l  có phn t trung tâm, ví d: m=n=3, cân bng histogram ca
d liu ly t ca s và thay phn t trung tâm bng phn t mi.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
10

Cod e :
void LocalHistogram(BYTE **w, int m, int n, double *p)
{
int x, y, k;
BYTE r;
for (k=0; k<L; k++)
p[k] = 0;

for (x=0; x<m; x++)

for (y=0; y<n; y++) {
r = w[x][y];
p[r]++;
}

for (k=0; k<L; k++)
p[k] = p[k]/(m*n);
return;
}

void LocalHistogramEqualization(double *p, double *T)
{
int j, k;
for (k=0; k<L; k++) {
T[k] = 0;
for (j=0; j<=k; j++)
T[k] = T[k] + p[j];
}
return;
}

void LocalEnhancement(BYTE **f, BYTE **g)
{
int m, n;
m = 3; n = 3;

BYTE **w;
int x, y, s, t, a, b;
a = m/2;
b = n/2;

double p[L];
double T[L];
BYTE r;

w = (BYTE **)Alloc2D(m,n,sizeof(BYTE));

for (x=a; x<M-a; x++)
for (y=b; y<N-b; y++) {
for (s=-a; s<=a; s++)
for (t=-b; t<=b; t++)
w[s+a][t+b] = f[x+s][y+t];

LocalHistogram(w,m,n,p);
LocalHistogramEqualization(p,T);
r = f[x][y];
g[x][y] = (int)((L-1)*T[r]);
}
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
11


Free2D((void **)w);
return;
}
Câu 8. Xây dựng và cài đặt thuật toán nâng cao chất lượng ảnh bằng
thống kê histogram.
Đáp án:
Nu s chênh lch mc xám quá nh thì cân bng histogram cho toàn b nh s không thy
c s chênh lu cân bng histogram cc b tc cân bng cho tng khi nh, ta s
thc s chênh l li nh.

Vì vy  phn này ta nêu ra tiêu chun chn khi  làm rõ.
Tiêu chun chn khi  ng thng kê là mean (giá tr trung bình hay giá tr
k vng) và variance ( sau:
Ta có:
mean=
N
1



1
0
N
i
i
x


variance=
N
1




1
0
2
)(
N

i
meanx
i

=  lch chun =
iancevar

Ví d: Cho 2 nhóm s liu:
[0 8 12 20] và [8 9 11 12]

x
x-mean
(x-mean)
2

0
8
12
20
-10
-2
2
10
100
4
4
10
variance = 208/4 = 52
deviation =
iancevar

=7.21
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
12

x
x-mean
(x-mean)
2

8
9
11
12
2
-1
1
2
4
1
1
4
Variance=10/4=2.5
Deviation=
iancevar
=1.58
Ý nghĩa:
  phân tán ca d liu xa hay gn giá tr mean. Nu variance
b liu bng nhau.
 i d liu vi nhau thì mean và variance ca khi phi gn bng nhau.
Tiêu chuẩn chọn khối trong ảnh để làm rõ:

2
: là , còn  lch chun.
Khc chn là 3*3.
G(x,y)=





),(
),(
yxf
yxEf

m
sxy:
mean ca khi nh
m
G
: mean ca toàn b nh
sxy:
 lch chun khi nh
G:
 lch chun ca toàn b nh.
vi E=4.0, k
0
=0.4, k
1
=0.02, k
2

=0.4.
Cod e :
double Mean(BYTE **a, int sizex, int sizey)
{
double m;
int x, y;
m = 0;
for (x=0; x<sizex; x++)
for (y=0; y<sizey; y++)
m = m + a[x][y];
m = m/(sizex*sizey);
Nu m
sxy
<=k
0
m
G
và k
1 G
<=
sxy
<=k
2 G


Nc li
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
13

return m;

}

double StandardDeviation(BYTE **a, int sizex, int sizey, double mean)
{
double variance;
int x, y;
variance = 0;
for (x=0; x<sizex; x++)
for (y=0; y<sizey; y++)
variance = variance + (a[x][y]-mean)*(a[x][y]-mean);
variance = variance/(sizex*sizey);
return sqrt(variance);
}

void HistogramStatistics(BYTE **f, BYTE **g)
{
int m, n;
m = 3; n = 3;

BYTE **w;
int x, y, s, t, a, b;
a = m/2;
b = n/2;
double MG, DG, msxy, sigmasxy;
double E = 4.0, k0 = 0.4, k1 = 0.02, k2 = 0.4;

MG = Mean(f,M,N);
DG = StandardDeviation(f,M,N,MG);

w = (BYTE **)Alloc2D(m,n,sizeof(BYTE));


for (x=a; x<M-a; x++)
for (y=b; y<N-b; y++) {
for (s=-a; s<=a; s++)
for (t=-b; t<=b; t++)
w[s+a][t+b] = f[x+s][y+t];
msxy = Mean(w,m,n);
sigmasxy = StandardDeviation(w,m,n,msxy);
if (msxy <= k0*MG && (k1*DG <= sigmasxy && sigmasxy <=
k2*DG))
g[x][y] = (int)E*f[x][y];
else
g[x][y] = f[x][y];
}

Free2D((void **)w);
return;
}
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
14

Câu 9. Xây dựng và cài đặt thuật toán lọc tuyến tính làm trơn.
Đáp án:
i ta dùng mt ca s nh c gi là mt n (hay b lc), chng hn b lc
3x3.
Lc cho b
G(x,y)=w(-1,-1)f(x-1,y-1)+w(-1,0)f(x-+w(1,1)f(x+1,y+1)
Mt n lc i ta s cho tùy vào bài toán c th.
Tng quát lc cho b :
g(x,y)=



a
as



b
bt
tysxftsw ),(),(

 :
mxc ca b lng là s l  b lc có phn t trung tâm.
a=m/2 và b=n/2 là c na b lc.
Phép toán lc c gi là tng chp (convolution).
i vi lc tuyn tính, mt n lng là b lc trung bình.
Ví d: mt n lc trung bình và mt n Gauss:


Cod e :
void Convolution(BYTE **f, int M, int N, BYTE **g, double **w, int m, int n,
BOOL border)
{
int bx, by, a, b, x, y, s, t, p, q;
double r;

a = m/2; b = n/2;
if (border) {
bx = 0;
by = 0;

}
else {
bx = a;
by = b;
}

for (x=bx; x<M-bx; x++)
for (y=by; y<N-by; y++) {
r = 0;
for (s=-a; s<=a; s++)
x
9
1

1
1
1
1
1
1
1
1
1
16
1
x
1
2
1
2

4
2
1
2
1
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
15

for (t=-b; t<=b; t++) {
p = x+s;
q = y+t;
if (p<0)
p = p+M;
if (p>=M)
p = p-M;
if (q<0)
q = q+N;
if (q>=N)
q = q-N;
r = r + w[s+a][t+b]*f[p][q];
}
g[x][y] = (int)r;
}
return;
}


void LinearFilter(BYTE **f, BYTE **g)
{
int m, n;

m = 35; n = 35;
double **w;
w = (double **)Alloc2D(m,n,sizeof(double));
int s, t;
for (s=0; s<m; s++)
for (t=0; t<n; t++)
w[s][t] = 1.0/(m*n);


Convolution(f, M, N, g, w, m, n, TRUE);
Free2D((void **)w);
return;
}
Câu 10. Xây dựng và cài đặt thuật toán lọc median.
Đáp án:
Lc median (lc trung v) là ly v trí chính gia.
Lc bit hiu qu khi trong nh có nhiu xung, nhic gi là nhiu
mui tiêu. Nhiu mui tiêu là nhm trng trong nh.
Thc hin l
Ly s liu vào tng ca s (3x3). To mng mt chiu, sn và phn t c thay
bng phn t chính gia.

void Sort(BYTE **a, int sizex, int sizey)
{
int i, j;
BYTE *b = *a;
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
16

BYTE temp;


int n = sizex*sizey;
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if (b[i] > b[j]) {
temp = b[i];
b[i] = b[j];
b[j] = temp;
}
return;
}

void MedianFilter(BYTE **f, BYTE **g)
{
int m=3,n=3;
int a,b,x,y,s,t;
a = m/2; b = n/2;
BYTE **w;

w = (BYTE **)Alloc2D(m,n,sizeof(BYTE));

for (x=a; x<M-a; x++)
for (y=b; y<N-b; y++) {
for (s=-a; s<=a; s++)
for (t=-b; t<=b; t++)
w[s+a][t+b] = f[x+s][y+t];

Sort(w,m,n);
g[x][y] = w[a][b];
}


Free2D((void **)w);
return;
}
Câu 11. Xây dựng và cài đặt thuật toán nâng cao chất lượng ảnh bằng đạo
hàm cấp một.
Đáp án:
o hàm cp mt hoc c  nét ca nh.
Yêu c hàm cp mt:
- o hàm cp mt bng 0 trong min có mu.
- o hàm cp mt khác 0  iu ca mc hoc mc xám thoai thoi.
- o hàm cp mt khác 0 dc theo mc xám thoai thoi.
o hàm cp mt ca hàm hai chic gi là gradient, ký hiu là


c nh 
sau :
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
17


=grad(f)=






y
x

g
g
=
















y
f
x
f


x
f
g
x




: o hàm cp mt theo x
y
f
g
y



:o hàm cp mt theo y
o hàm cp mt  :
x
f


=f(x+1,y)-f(x,y)
o hàm cp mt the :
y
f


=f(x,y+1)  f(x,y)
 ln c gradient f kí hiu là :
M(x,y)=mag(

f)=
22
yx
gg 


Nc hai s lâu nên ta tính tr tuyi cho nhanh.
M(x,y)

|g
x
|+|g
y
|
Gi s liu trong mt n 3x3 là
z
1

z
2

z
3

z
4

z
5

z
6

z
7


z
8

z
9

o hàm cp mt ng x là : g
x
= z
8
-z
5

o hàm cp mt theo ng y là : g
y
= z
6
-z
5

 o hàm cp mt  : g
x
=z
9
-z
5

vo hàm cp mt theo y là : g
y

=z
8
-z
6

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
18


Ta có hai mt n g
x
và g
y
và gi là mt n Roberts.
Mt n c chn nên không có phn t  rng
o hàm cp mt  :
g
x
=
x
f


=(z
7
+2z
8
+z
9
)-(z

1
+2z
2
+z
3
)
và g
y
=
y
f


=(z
3
+2z
6
+z
9
)-(z
1
+2z
4
+z)
Vii dng mt n  :

Cod e :
void ConvolutionInt(BYTE **f, int M, int N, int **g, double **w, int m, int
n, BOOL border)
{

int bx, by, a, b, x, y, s, t, p, q;
double r;

a = m/2; b = n/2;
if (border) {
bx = 0;
by = 0;
}
else {
bx = a;
by = b;
}

for (x=bx; x<M-bx; x++)
for (y=by; y<N-by; y++) {
r = 0;
for (s=-a; s<=a; s++)
for (t=-b; t<=b; t++) {
p = x+s;
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
19

q = y+t;
if (p<0)
p = p+M;
if (p>=M)
p = p-M;
if (q<0)
q = q+N;
if (q>=N)

q = q-N;
r = r + w[s+a][t+b]*f[p][q];
}
g[x][y] = (int)r;
}
return;
}

void Gradient(BYTE **f, BYTE **g)
{
int **gx, **gy, **Mag;
int x, y;

gx = (int **)Alloc2D(M,N,sizeof(int));
gy = (int **)Alloc2D(M,N,sizeof(int));
Mag = (int **)Alloc2D(M,N,sizeof(int));


int m = 3, n = 3;
double **Sobelx, **Sobely;

Sobelx = (double **)Alloc2D(m,n,sizeof(double));
Sobely = (double **)Alloc2D(m,n,sizeof(double));

Sobelx[0][0] = -1; Sobelx[0][1] = -2; Sobelx[0][2] = -1;
Sobelx[1][0] = 0; Sobelx[1][1] = 0; Sobelx[1][2] = 0;
Sobelx[2][0] = 1; Sobelx[2][1] = 2; Sobelx[2][2] = 1;

Sobely[0][0] = -1; Sobely[0][1] = 0; Sobely[0][2] = 1;
Sobely[1][0] = -2; Sobely[1][1] = 0; Sobely[1][2] = 2;

Sobely[2][0] = -1; Sobely[2][1] = 0; Sobely[2][2] = 1;

ConvolutionInt(f,M,N,gx,Sobelx,m,n,TRUE);
ConvolutionInt(f,M,N,gy,Sobely,m,n,TRUE);

for (x=0; x<M; x++)
for (y=0; y<N; y++)
Mag[x][y] = abs(gx[x][y]) + abs(gy[x][y]);

int max,r;
max = Mag[0][0];
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (Mag[x][y] > max)
max = Mag[x][y];

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = Mag[x][y];
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
20

g[x][y] = (int)(1.0*r/max*255);
}

Free2D((void **)gx);
Free2D((void **)gy);
Free2D((void **)Mag);

Free2D((void **)Sobelx);

Free2D((void **)Sobely);

return;
}
Câu 12. Xây dựng và cài đặt thuật toán nâng cao độ nét của ảnh bằng đạo
hàm cấp hai.
Đáp án:
Yêu cu co hàm cp hai:
- o hàm cp hai bng 0  vùng có mu.
- o hàm cp hai khác 0  u và cui ca mc hoc mc xám thoai thoi.
- o hàm cp hai bng 0 dc theo mc xám thoai thoi.
o hàm cp hai ca hàm mt chi
x
f
2
2


=f(x+1) + f(x-1)  2f(x)
nh o hàm cp hai ca hàm hai bin là:
f
2

=
2
2
x
f



+
2
2
y
f




o hàm cp mt ca hàm 2 bin)
o hàm cp 2 ca c gi là toán t Laplace.
Nhc li:
o hàm cp hai ng x:
2
2
x
f


=f(x+1,y)+f(x-1,y)-2f(x,y)
o hàm cp hai ng y:
2
2
y
f


=f(x,y+1)+f(x,y-1)-2f(x,y)
o hàm cp hai ca nh là:
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

21

),(
2
yxf
=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
Hay vii dng mt n  :


Ta m rng thêm các mt n p hai  :




Tùy bài toán mà ta dùng mt n cho phù hp.
Nâng cao độ nét của ảnh được cho bằng phương trình:
g(x,y)=f(x,y)+c[
f
2

(x,y)]

c=-1 nu tâm mt n âm
c=1 nu tâm mt n 
Mu ra s có giá tr nh i chu mu
ra nm trong khong 0 255.
n nht: nu ra có giá tr âm thì cho bng 0, nu ra >255 thì cho bng 255.
Chun hóa cách khác:
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
22


Ta có giá tr min (giá tr âm) và max, ta phi chuyn khong min ng công
thc sau :
g[x][y]=
minmax
min]][[

yxg
255
Cod e :
void ConvolutionInt(BYTE **f, int M, int N, int **g, double **w, int m, int
n, BOOL border)
{
int bx, by, a, b, x, y, s, t, p, q;
double r;

a = m/2; b = n/2;
if (border) {
bx = 0;
by = 0;
}
else {
bx = a;
by = b;
}

for (x=bx; x<M-bx; x++)
for (y=by; y<N-by; y++) {
r = 0;
for (s=-a; s<=a; s++)

for (t=-b; t<=b; t++) {
p = x+s;
q = y+t;
if (p<0)
p = p+M;
if (p>=M)
p = p-M;
if (q<0)
q = q+N;
if (q>=N)
q = q-N;
r = r + w[s+a][t+b]*f[p][q];
}
g[x][y] = (int)r;
}
return;
}

void Laplace(BYTE **f, BYTE **g)
{
int **temp;
int x, y, r;


temp = (int **)Alloc2D(M,N,sizeof(int));
int m = 3, n = 3;
double **w;

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
23


w = (double **)Alloc2D(m,n,sizeof(double));
w[0][0] = 0; w[0][1] = 1; w[0][2] = 0;
w[1][0] = 1; w[1][1] = -4; w[1][2] = 1;
w[2][0] = 0; w[2][1] = 1; w[2][2] = 0;

ConvolutionInt(f,M,N,temp,w,m,n,TRUE);


// Chuan hoa anh Laplace
int min;
min = temp[0][0];
int max;
max = temp[0][0];

for (x=0; x<M; x++)
for (y=0; y<N; y++) {
if (temp[x][y] < min)
min = temp[x][y];
if (temp[x][y] > max)
max = temp[x][y];
}

double scale = 0.3;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
temp[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)* 255);

for (x=0; x<M; x++)
for (y=0; y<N; y++) {

r = f[x][y] - temp[x][y];
if (r < 0)
r = 0;
if (r > 255)
r = 255;
g[x][y] = r;
}

Free2D((void **)temp);
Free2D((void **)w);
return;
}
Câu 13. Xây dựng và cài đặt thuật toán nâng cao độ nét ảnh bằng mặt nạ
làm nhòe và lọc tăng cường.
Đáp án:
N nét ca nh dùng mt n làm nhòe ng dùng trong công ngh in nh, quá trình
g
- Làm nhòe nh.
- Ly nh gc tr vi c mt nh mi gi là mt n làm nhòe.
- Cng mt n làm nhòe vi nh gc.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
24

Kí hiu:
_______
),( yxf
: là 
Mt n c biu din b
gmask(x,y)=f(x,y) -
_______

),( yxf

g(x,y) = f(x,y) + k.gmask(x,y)
k c chn > 0, khi k=1 ta gi là mt n làm nhòe, khi k>1 ta gi là lng.
Mt n Gauss  làm nhòe nh c cho b :
gauss(x,y)=
2
22
2

yx
e




:  lch chun c.
Cod e :
void ConvolutionDouble(BYTE **f, int M, int N, double **g, double **w, int m,
int n, BOOL border)
{
int bx, by, a, b, x, y, s, t, p, q;
double r;

a = m/2; b = n/2;
if (border) {
bx = 0;
by = 0;
}
else {

bx = a;
by = b;
}

for (x=bx; x<M-bx; x++)
for (y=by; y<N-by; y++) {
r = 0;
for (s=-a; s<=a; s++)
for (t=-b; t<=b; t++) {
p = x+s;
q = y+t;
if (p<0)
p = p+M;
if (p>=M)
p = p-M;
if (q<0)
q = q+N;
if (q>=N)
q = q-N;
r = r + w[s+a][t+b]*f[p][q];
}
g[x][y] = r;
}
return;
}
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
25


void UnsharpMask(BYTE **f, BYTE **g)

{
double **Gauss, sigma=3, sum;
int x, y;
int m = 5, n = 5;
double **fbar, **gmask;


fbar = (double **)Alloc2D(M,N,sizeof(double));

// Tao mat na Gauss
Gauss = (double **)Alloc2D(m,n,sizeof(double));
for (x=-m/2; x<=m/2; x++)
for (y=-n/2; y<=n/2; y++)
Gauss[x+2][y+2] = exp(-(1.0*x*x+1.0*y*y)/(2*sigma*sigma));

sum = 0;
for (x=0; x<m; x++)
for (y=0; y<n; y++)
sum += Gauss[x][y];

for (x=0; x<m; x++)
for (y=0; y<n; y++)
Gauss[x][y] = Gauss[x][y]/sum;

ConvolutionDouble(f, M, N, fbar, Gauss, m, n, TRUE);

gmask = (double **)Alloc2D(M,N,sizeof(double));

for (x=0; x<M; x++)
for (y=0; y<N; y++)

gmask[x][y] = (f[x][y] - fbar[x][y]);

int s;
double k = 4.5;
for (x=0; x<M; x++)
for (y=0; y<N; y++) {
s = int(f[x][y] + k*gmask[x][y]);
if (s > 255)
s = 255;
if (s < 0)
s = 0;
g[x][y] = s;
}

Free2D((void **)Gauss);
Free2D((void **)fbar);
Free2D((void **)gmask);

return;
}

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

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