You are on page 1of 68

thi X L nh GV: Trn Tin c

1

thi X L nh
GV: Trn Tin c

MC LC

THI V P N MN X L NH S
Chng 3 gm 13 cu t cu 1 n cu 13
Cu 1. Xy dng v ci t thut ton lm m nh.
p n:
Cch lm m nh c cho bng phng trnh: s=L-1-r trong L=256 l s lng mc xm, r
l mc xm u vo, s l mc xm u ra








Quan st th ta thy: Mc xm u ra ngc vi u vo, tc l thut ton ny bin nh
en tr thnh nh trng v trng thnh en.
Code:
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: Trn Tin c
2

s = L-1-r;
g[x][y] = s;
}
return;
}
Cu 2. Xy dng v ci t thut ton bin i logarit nh.
p n:
Phng trnh bin i:
s=c log(1+r)
trong :
- r l mc xm u vo
- s l mc xm u ra
- c: hng s dng
- log(1+r): trnh trng hp log = 0.
Quan st th thy ng log lm cho nh
tr nn sng hn.
Hng s c c tnh nh sau:
Ta c phng trnh: s=c log(1+r)
R rng r=0 th s=0
Ta cn c: r=L-1 th s=L-1
c=
) 1 1 log(
1
+

L
L

Vi L = 256 th c= 45.9859
Code:
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: Trn Tin c
3

Cu 3. Xy dng v ci t thut ton bin i ly tha nh.
p n:
Bin i ly tha c cho bng phng trnh:
s=cr

vi r l mc xm u vo, s l mc xm u ra,
c, l cc hng s dng.
- <1: lm cho nh sng hn
- >1: lm cho nh ti hn.
c: c tnh nh sau:
Ta thy trn th:
- r=0 th s=0
- r=L-1 th s= L-1
L-1=c(L-1)

c=

) 1 (
1

L
L

Code:
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: Trn Tin c
4



Cu 4. Xy dng v ci t thut ton bin i tuyn tnh tng phn.
p n:












Quan st trn th ta thy:
Bin i nh en t thnh nh en nhiu, lm cho nh trng t tr thnh trng nhiu. Tc l lm
tng tng phn ca nh (ko gin tng phn).
Ta c:
Phng trnh ng thng i qua 2 im (x1,y1) v (x2,y2) l:
1 2
1
y y
y y

=
1 2
1
x x
x x


Y=
1 2
1 2
x x
y y

(x-x1)+y1
- on I: im (0,0) v (r1,s1)
S=
1
1
r
s
r
- on II: im (r1,s1) v (r2,s2)










s
L-1
L-1
r
(r2,s2)
(r1,s1)
thi X L nh GV: Trn Tin c
5

S=
1 2
1 2
r r
s s

(r-r1)+s1
- on III: im (r2,s2) v (L-1,L-1)
S=
2 ) 1 (
2 ) 1 (
r L
s L


(r-r2)+s2
trong : (r1,s1) v (r2,s2) c cho trc.
Code:
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;
}
Cu 5. Xy dng v ci t thut ton cn bng histogram.
p n:
Mc ch ca cn bng histogram l lm cho histogram ng u. Khi ta lm tng c
tng phn ca nh.
thi X L nh GV: Trn Tin c
6

Cn bng histogram c cho bng phng trnh:
s=T(r)=(L-1)
}
r
r
dw w p
0
) (
vi p
r
(w) : Xc sut xy ra mc xm w
Trong xc sut, tch phn ca hm mt l hm phn phi. Cng thc trn c w l bin lin
tc, ta khng th lp trnh n. Ta phi dng cng thc ri rc:
s
k
=T(r
k
)=(L-1)

=
k
j
j r
r p
0
) (
vi k= 0,1,2,,L-1
Code:
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;
}
Cu 6. Xy dng v ci t thut ton c t histogram.
p n:
Khng phi cn bng histogram lc no cng tt, nn i khi ta phi a nh v histogram nh
ta mong mun.
thi X L nh GV: Trn Tin c
7


Tnh histogram ca nh ri suy ra hm bin i histogram t ng
p
r
(r
j
)=
MN
n
j

s
k
=T(r
k
)=

=
k
j
j r
r p
0
) (
Cho histogram mong mun p
z
(z
i
)
Bin i histogram mong mun.
v
k
=G(z
k
)=
k
k
j
j z
s z p =

=0
) (
Cho r
k
, ta suy ra z
k
nh sau:
z
k
= G
-1
(T(r
k
))
Mc tiu: c mc xm u vo r
k
, ta suy ra mc xm u ra z
k
.
V d cho histogram mong mun nh hnh v sau:
thi X L nh GV: Trn Tin c
8


m t histogram mong mun nh hnh v, ta dng phng trnh ng thng i qua hai
im (x
1
,y
1
) v (x
2
,y
2
):
1 2
1
y y
y y

=
1 2
1
x x
x x

=>y=
1 2
1 2
x x
y y

(x-x1)+y1

Code:
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: Trn Tin 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;
}
Cu 7. Xy dng v ci t thut ton cn bng histogram cc b.
p n:
Trong trng hp 2 mc xm k nhau chnh lch qu nh, nu ta cn bng histogram t ng
s khng c kt qu. Trong trng hp ta phi dng histogram cc b.
Chn ca s c kch thc l c phn t trung tm, v d: m=n=3, cn bng histogram ca
d liu ly t ca s v thay phn t trung tm bng phn t mi.
thi X L nh GV: Trn Tin c
10

Code:
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: Trn Tin c
11


Free2D((void **)w);
return;
}
Cu 8. Xy dng v ci t thut ton nng cao cht lng nh bng
thng k histogram.
p n:
Nu s chnh lch mc xm qu nh th cn bng histogram cho ton b nh s khng thy
c s chnh lch . Nu cn bng histogram cc b tc cn bng cho tng khi nh, ta s
thy c s chnh lch nhng li lm thay i nh.
V vy phn ny ta nu ra tiu chun chn khi nh lm r.
Tiu chun chn khi nh cn c vo 2 i lng thng k l mean (gi tr trung bnh hay gi tr
kz vng) v variance (phng sai). Xem xt cc v d sau:
Ta c:
mean=
N
1

=
1
0
N
i
i
x
v
variance=
N
1

=
1
0
2
) (
N
i
mean x
i

= lch chun = iance var
V d: Cho 2 nhm s liu:
[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 = iance var =7.21
thi X L nh GV: Trn Tin 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= iance var =1.58
ngha:
Variance (phng sai) dng o s phn tn ca d liu xa hay gn gi tr mean. Nu variance
bng khng ngha l d liu bng nhau.
o 2 khi d liu vi nhau th mean v variance ca khi phi gn bng nhau.
Tiu chun chn khi trong nh lm r:
2
: l phng sai, cn l lch chun.
Khi c chn l 3*3.
G(x,y)=

) , (
) , (
y x f
y x Ef

m
sxy:
mean ca khi nh
m
G
: mean ca ton b nh
sxy:
lch chun khi nh
G:
lch chun ca ton b nh.
vi E=4.0, k
0
=0.4, k
1
=0.02, k
2
=0.4.
Code:
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);
Nu m
sxy
<=k
0
m
G
v k
1 G
<=
sxy
<=k
2 G


Nu ngc li
thi X L nh GV: Trn Tin 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: Trn Tin c
14

Cu 9. Xy dng v ci t thut ton lc tuyn tnh lm trn.
p n:
Ngi ta dng mt ca s nh c gi l mt n (hay b lc), chng hn b lc c kch thc
3x3.
Lc trong khng gian c cho bng phng trnh:
G(x,y)=w(-1,-1)f(x-1,y-1)+w(-1,0)f(x-1,y)++w(0,0)f(x,y)++w(1,1)f(x+1,y+1)
Mt n lc ngi ta s cho ty vo bi ton c th.
Tng qut lc trong khng gian c cho bng phng trnh :
g(x,y)=

=
a
a s

=
+ +
b
b t
t y s x f t s w ) , ( ) , (
Trong :
mxn l kch thc ca b lc, m v n thng l s l b lc c phn t trung tm.
a=m/2 v b=n/2 l kch thc na b lc.
Php ton lc trong khng gian c gi l tng chp (convolution).
i vi lc tuyn tnh, mt n lc thng l b lc trung bnh.
V d: mt n lc trung bnh v mt n Gauss:


Code:
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: Trn Tin 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;
}
Cu 10. Xy dng v ci t thut ton lc median.
p n:
Lc median (lc trung v) l ly v tr chnh gia.
Lc median c bit hiu qu khi trong nh c nhiu xung, nhiu xung cn c gi l nhiu
mui tiu. Nhiu mui tiu l nhng m en v m trng trong nh.
Thc hin lc median nh sau:
Ly s liu vo tng ca s (3x3). To mng mt chiu, sp tng dn v phn t f(x,y) c thay
bng phn t chnh gia.

void Sort(BYTE **a, int sizex, int sizey)
{
int i, j;
BYTE *b = *a;
thi X L nh GV: Trn Tin 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;
}
Cu 11. Xy dng v ci t thut ton nng cao cht lng nh bng o
hm cp mt.
p n:
Ngi ta dng o hm cp mt hoc cp hai lm tng nt ca nh.
Yu cu a hm cp mt:
- o hm cp mt bng 0 trong min c mc xm ng u.
- o hm cp mt khc 0 im u ca mc xm bc hoc mc xm thoai thoi.
- o hm cp mt khc 0 dc theo mc xm thoai thoi.
o hm cp mt ca hm hai chiu c gi l gradient, k hiu lV

v c nh ngha nh
sau :
thi X L nh GV: Trn Tin c
17

V=grad(f)=
(

y
x
g
g
=
(
(
(
(

c
c
c
c
y
f
x
f

trong :
x
f
g
x
c
c
= : o hm cp mt theo x
y
f
g
y
c
c
= :o hm cp mt theo y
o hm cp mt theo x c nh ngha l :
x
f
c
c
=f(x+1,y)-f(x,y)
o hm cp mt theo y c nh ngha l :
y
f
c
c
=f(x,y+1) f(x,y)
ln ca vect gradient f k hiu l :
M(x,y)=mag( Vf)=
2 2
y x
g g +
Nu tnh cn bc hai s lu nn ta tnh tr tuyt i cho nhanh.
M(x,y) ~|g
x
|+|g
y
|
Gi s liu trong mt n 3x3 l
z
1
z
2
z
3

z
4
z
5
z
6

z
7
z
8
z
9

o hm cp mt theo hng x l : g
x
= z
8
-z
5

o hm cp mt theo hng y l : g
y
= z
6
-z
5

Nhng Roberts nh ngha o hm cp mt theo x nh sau : g
x
=z
9
-z
5

v o hm cp mt theo y l : g
y
=z
8
-z
6

thi X L nh GV: Trn Tin c
18


Ta c hai mt n g
x
v g
y
v gi l mt n Roberts.
Mt n Roberts c kch thc chn nn khng c phn t trung tm. Do Sobel m rng
nh ngha o hm cp mt nh sau :
g
x
=
x
f
c
c
=(z
7
+2z
8
+z
9
)-(z
1
+2z
2
+z
3
)
v g
y
=
y
f
c
c
=(z
3
+2z
6
+z
9
)-(z
1
+2z
4
+z)
Vit di dng mt n nh sau :

Code:
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: Trn Tin 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: Trn Tin 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;
}
Cu 12. Xy dng v ci t thut ton nng cao nt ca nh bng o
hm cp hai.
p n:
Yu cu ca o hm cp hai:
- o hm cp hai bng 0 vng c mc xm ng u.
- o hm cp hai khc 0 u v cui ca mc xm bc hoc mc xm thoai thoi.
- o hm cp hai bng 0 dc theo mc xm thoai thoi.
nh ngha o hm cp hai ca hm mt chiu nh sau:
x
f
2
2
c
c
=f(x+1) + f(x-1) 2f(x)
nh ngha o hm cp hai ca hm hai bin l:
f
2
V =
2
2
x
f
c
c
+
2
2
y
f
c
c

V: gradient (o hm cp mt ca hm 2 bin)
o hm cp 2 ca nh cn c gi l ton t Laplace.
Nhc li:
o hm cp hai theo hng x:
2
2
x
f
c
c
=f(x+1,y)+f(x-1,y)-2f(x,y)
o hm cp hai theo hng y:
2
2
y
f
c
c
=f(x,y+1)+f(x,y-1)-2f(x,y)
o hm cp hai ca nh l:
thi X L nh GV: Trn Tin c
21

) , (
2
y x f V =f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
Hay vit di dng mt n nh sau :


Ta m rng thm cc mt n o hm cp hai nh sau :




Ty bi ton m ta dng mt n cho ph hp.
Nng cao nt ca nh c cho bng phng trnh:
g(x,y)=f(x,y)+c[ f
2
V (x,y)]
Trong :
c=-1 nu tm mt n m
c=1 nu tm mt n dng
Mc xm u ra s c gi tr nh hn 0 v ln hn 255 nn ta phi chun ha mc xm u
ra nm trong khong 0..255.
n gin nht: nu u ra c gi tr m th cho bng 0, nu u ra >255 th cho bng 255.
Chun ha cch khc:
thi X L nh GV: Trn Tin c
22

Ta c gi tr min (gi tr m) v max, ta phi chuyn khong min max vo 0255 bng cng
thc sau :
g[x][y]=
min max
min ] ][ [

y x g
255
Code:
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: Trn Tin 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;
}
Cu 13. Xy dng v ci t thut ton nng cao nt nh bng mt n
lm nhe v lc tng cng.
p n:
Nng cao nt ca nh dng mt n lm nhe thng dng trong cng ngh in nh, qu trnh
gm cc bc sau y:
- Lm nhe nh.
- Ly nh gc tr vi nh lm nhe ta c mt nh mi gi l mt n lm nhe.
- Cng mt n lm nhe vi nh gc.
thi X L nh GV: Trn Tin c
24

K hiu:
_______
) , ( y x f : l nh lm nhe,
Mt n lm nhe c biu din bng cc phng trnh sau:
gmask(x,y)=f(x,y) -
_______
) , ( y x f
g(x,y) = f(x,y) + k.gmask(x,y)
k c chn > 0, khi k=1 ta gi l mt n lm nhe, khi k>1 ta gi l lc tng cng.
Mt n Gauss dng lm nhe nh c cho bng phng trnh :
gauss(x,y)=
2
2 2
2o
y x
e
+


o : lch chun c cho trc.
Code:
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: Trn Tin 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;
}
thi X L nh GV: Trn Tin c
26


Chng 9 gm cu 6 cu t cu 14 n cu 19
Cu 14. Xy dng v ci t thut ton Erosion.
p n:
Erosion l bo mn.
Cho A v B l 2 tp trong Z, bo mn A bi B k hiu l .

Ta ly tp B di i mt di z sao cho tp va di l tp con ca A.
Code:
void Erosion(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL
border)
{

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

BOOL flag;
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++) {
flag = TRUE;
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;
thi X L nh GV: Trn Tin c
27


if (B[s+a][t+b] == 1 && f[p][q] != 255) {
flag = FALSE;
goto Exit;
}
}
Exit:
if (flag)
g[x][y] = 255;
else
g[x][y] = 0;
}
return;
}
Cu 15. Xy dng v ci t thut ton Dilation.
p n:
Dilation l gin n
Cho A v B l 2 tp trong Z, gin n A bi B k hiu l c nh ngha l:

Ly tp di i mt di z sao cho tp va di giao vi tp A khc rng.
Lu { phng trnh ny da trn tp phn x ca B, nhng do B thng l i xng nn
= B.
Code:
void Dilation(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL
border)
{

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

a = m/2;
b = n/2;

BOOL flag;

if (border) {
bx = 0;
by = 0;
}
else {
thi X L nh GV: Trn Tin c
28

bx = a;
by = b;
}

for (x=bx; x<M-bx; x++)
for (y=by; y<N-by; y++) {
flag = FALSE;
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;

if (B[s+a][t+b] == 1 && f[p][q] == 255) {
flag = TRUE;
goto Exit;
}
}
Exit:
if (flag)
g[x][y] = 255;
else
g[x][y] = 0;
}

return;
}
Cu 16. Xy dng v ci t thut ton Opening.
p n:
Opening ca tp A bi phn t cu trc B k hiu l , c nh ngha nh sau:

Opening thng dng xa nhiu.
Code:
void Openning(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g)
{
BYTE **temp;
temp = (BYTE **)Alloc2D(M,N,sizeof(BYTE));
Erosion(f,M,N,B,m,n,temp,FALSE);
Dilation(temp,M,N,B,m,n,g,FALSE);
thi X L nh GV: Trn Tin c
29

Free2D((void **)temp);
return;
}
Cu 17. Xy dng v ci t thut ton Closing.
p n:
Closing ca tp A bi phn t cu trc B k hiu l A B v c nh ngha nh sau:
A B = (A B) B
Closing thng dng lp nhng khe h.
Code:
void Closing(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g)
{
BYTE **temp;
temp = (BYTE **)Alloc2D(M,N,sizeof(BYTE));
Dilation(f,M,N,B,m,n,temp,FALSE);
Erosion(temp,M,N,B,m,n,g,FALSE);
Free2D((void **)temp);
return;
}
Cu 18. Xy dng v ci t thut ton trch bin.
p n:
Bin ca tp A k hiu l u tin ta bo mn A bi B, ly nh A ban u tr i nh
bo mn, ta s c bin.

Code:
void Boundary(BYTE **f, BYTE **g)
{
int x, y;
BYTE **temp;
BYTE **B;

temp = (BYTE **)Alloc2D(M,N,sizeof(BYTE));

// Hieu chinh anh
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (f[x][y] < 128)
f[x][y] = 0;
thi X L nh GV: Trn Tin c
30

else
f[x][y] = 255;

int m = 3, n = 3;
B = (BYTE **)Alloc2D(m,n,sizeof(BYTE));

for (x=0; x<m; x++)
for (y=0; y<n; y++)
B[x][y] = 1;

Erosion(f,M,N,B,m,n,temp,FALSE);
Free2D((void **)B);

for (x=0; x<M; x++)
for (y=0; y<N; y++)
g[x][y] = f[x][y] - temp[x][y];

Free2D((void **)temp);
return;
}
Cu 19. Xy dng v ci t thut ton lp l trng.
p n:
Cho mt i tng bn trong c l trng, mc ch l ta phi lp l trng ny.
Lp l trng c cho bng phng trnh:


thi X L nh GV: Trn Tin c
31




Thut ton ngng khi X
k
ca bc trc v sau khng thay i.
Ghi ch: X l nh c kch thc bng nh A.
Code:
void Complement(BYTE **f, BYTE **Ac)
{
int x, y;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (f[x][y] == 0)
Ac[x][y] = 255;
else
Ac[x][y] = 0;
return;
}

void Intersect(BYTE **a, int M, int N, BYTE **b, BYTE **c)
{
int x, y;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (a[x][y]==255 && b[x][y] == 255)
c[x][y] = 255;
thi X L nh GV: Trn Tin c
32

else
c[x][y] = 0;
return;
}

void HoleFilling(BYTE **f, POINT p)
{

BYTE **X;
BYTE **B;
BYTE **Ac;
BYTE **temp;
BYTE **Xn;

X = (BYTE **)Alloc2D(M,N,sizeof(BYTE));

int x,y;

X[p.y][p.x] = 255;

//X[x-1][y] = 255; X[x+1][y] = 255;
//X[x][y-1] = 255; X[x][y+1] = 255;

int m=3, n=3;
B = (BYTE **)Alloc2D(m,n,sizeof(BYTE));

for (x=0; x<m; x++)
for (y=0; y<n; y++)
B[x][y] = 1;

B[0][0] = 0; B[0][2] = 0;
B[2][0] = 0; B[2][2] = 0;

// Hieu chinh anh
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (f[x][y] < 128)
f[x][y] = 0;
else
f[x][y] = 255;

Ac = (BYTE **)Alloc2D(M,N,sizeof(BYTE));
Complement(f,Ac);

BOOL flag;
while (TRUE) {
temp = (BYTE **)Alloc2D(M,N,sizeof(BYTE));
Dilation(X,M,N,B,m,n,temp,FALSE);
Xn = (BYTE **)Alloc2D(M,N,sizeof(BYTE));
Intersect(temp,M,N,Ac,Xn);

flag = TRUE;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (X[x][y] != Xn[x][y]) {
flag = FALSE;
goto Thoat;
thi X L nh GV: Trn Tin c
33

}
Thoat:
for (x=0; x<M; x++)
for (y=0; y<N; y++)
X[x][y] = Xn[x][y];
Free2D((void **)Xn);
Free2D((void **)temp);
if (flag==TRUE)
break;
}

for (x=0; x<M; x++)
for (y=0; y<N; y++)
f[x][y] = f[x][y]+X[x][y];

Free2D((void **)X);
Free2D((void **)B);
Free2D((void **)Ac);
return;
}
thi X L nh GV: Trn Tin c
34


Chng 10 gm 7 cu t cu 20 n cu 26
Cu 20. Xy dng v ci t thut ton pht hin cnh nh bng o hm
cp hai.
p n:
C 3 bc c bn phi lm pht hin cnh nh:
- Lm trn nh gim nhiu.
- Pht hin nhng im trn cnh.
- B nhng im trn cnh khng cn thit.
Ngi ta dng mt n o hm cp hai pht hin cnh nh, nhng cnh nh s b dy ln
gp i, v ta phi x l trng hp ny.
Ngoi ra ngi ta dng cc mt n o hm cp hai sau y pht hin cnh nh.

Nu mun pht hin ng thng trong nh th ta dung ln 4 mt n ny ln lt qut qua nh.
Ta gi u ra ti 1 im nh l R1, R2, R3 v R4.
im nh cn ly c
Khi lp trnh c 4 u ra, ta ly im nh c Rmax.
Lu { tng cc h s trong mt n u = 0
Mc ch l khi qut mt n qua vng nh c sng ng u th u ra s = 0.
Code:
void LineDetectionLaplace(BYTE **f, BYTE **g)
{
int **temp;
int x, y, r;
thi X L nh GV: Trn Tin c
35



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

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

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


// Chuan hoa anh Laplace cach 1
int min;
int max;
max = temp[0][0];
min = 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 = 1.0;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
g[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)*255);



Free2D((void **)temp);
Free2D((void **)w);
return;
}
Cu 21. Xy dng v ci t thut ton pht hin cnh nh bng o hm
cp mt.
p n:
Ta dng mt n o hm cp mt pht hin cnh nh.
C 2 mt n o hm cp mt thng dng l Sobel, Prewitt.
thi X L nh GV: Trn Tin c
36


Gi g
x
l nh o hm theo hng x.
g
y
l nh o hm theo hng y.
nh ln:

hay dng cng thc xp x.

nh ca hng (direction) hay l nh gc pha:

Ta c th kt hp thm vi ngng ly nhng im nh trn cnh cho tt.
Chng hn ta ly ngng =33% gi tr max ca o hm cp 1, nu ta pht hin im nh nh
hn ngng th ta b qua.
Code:
void LineDetectionGradient(BYTE **f, BYTE **g)
{
int **temp;
int x, y, r;


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

w = (double **)Alloc2D(m,n,sizeof(double));
w[0][0] = 2; w[0][1] = -1; w[0][2] = -1;
w[1][0] = -1; w[1][1] = 2; w[1][2] = -1;
w[2][0] = -1; w[2][1] = -1; w[2][2] = 2;
thi X L nh GV: Trn Tin c
37


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

// Chuan hoa anh gradient cach
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];

double scale = 1.0;
for (x=0; x<M; x++)
for (y=0; y<N; y++)
g[x][y] = (int)(scale*(temp[x][y]-min)/(max-min)*255);
Free2D((void **)temp);
Free2D((void **)w);
return;
}
Cu 22. Xy dng thut ton pht hin cnh Marr Hildreth.
p n:
Ta c hm Gauss
c gi l lch chun
c gi l phng sai
Ta dng hm Gauss lm trn nh v lc nhiu.
Suy ra o hm cp 2 ca Gauss

o hm cp 2 ca hm 2 chiu Gauss cn c gi l Laplace ca Gauss v vit tt l LoG.
Thut ton Marr-Hildreth gm cc bc sau y.
- Dng mt n Gauss lm trn nh
- Tnh Laplace ca nh bc 1.
- tm im ct 0 ca nh o hm cp 2, im ct 0 l im nh bc 2 m trc c
gi tr dng v sau c gi tr m v ngc li.
thi X L nh GV: Trn Tin c
38

Ta thng cho = 4 v kch thc ca b lc l n = 6
Cu 23. Xy dng thut ton pht hin cnh Canny.
p n:
Cho n nay phng php pht hin cnh ca Canny l tt nht.
Phng php ca Canny da trn 3 mc tiu sau y:
- Tc sai s thp.
- Cc im trn cnh l ng.
- Xa b cc im tha trn cnh.
Ta c hm Gauss:

Ta dng hm Gauss lm trn nh v xa nhiu:

Trong :
l php chp.
f(x,y) l nh u vo.
G(x,y) l mt n Gauss.
f
s
(x,y) l nh lm trn.
Tip theo ta dung mt n o hm cp 1 nh Sobel hay Prewitt pht hin cnh ca nh
lm trn.


Sau xa b nh nh, dng ngng kp v phn tch lin thng pht hin bin khng b
t nt.
Tm li, thut ton pht hin Canny gm 4 bc:
- Bc 1: dng mt n Gauss lm trn nh.
thi X L nh GV: Trn Tin c
39

- Bc 2: tnh nh o hm cp 1 v nh gc pha: M(x,y) v (x,y).
- Bc 3: xa nhng nh nh.
- Bc 4: dng ngng kp v phn tch lin thng ni cc cnh b t.
V d: ngng thp c chn T
L
=0.04, ngng cao c khong 2.5 T
L
.
Cu 24. Xy dng thut ton lin kt cnh bng x l cc b.
p n:
Dng mt n o hm cp mt nh Sobel hay Prewitt pht hin cnh ca nh lm trn.


Bc 1: Tnh M(x,y) v (x,y)
Bc 2: To nh nh phn g, theo cng thc sau y.

T
M
l ngng, A l gc ca cnh cn quan tm, T
A
l phm vi gc
Bc 3: Qut tng dng qua nh v lp nhng l trng, nu chiu di ca l trng khng
vt qu K.
Bc 4: Pht hin l trng theo hng khc bng cch l quay nh mt gc , lp li bc 3
v quay ngc tr li
A c cho c th l 0, -180
o
, 90
o
, -90
o
, 45
o
, -45
o
.
Cu 25. Xy dng thut ton lin kt cnh bng x l trn min.
p n:
Sau khi tch bin v ly ngng, ta c cc im ri nhau. By gi ta phi ni cc im li
vi nhau.
Hnh sau y biu din tp cc im ca mt ng cong h, c im u l A v im cui l
B.
thi X L nh GV: Trn Tin c
40


Vit phng trnh ng thng i qua hai im A v B, tip theo ta tnh khong cch t cc
im cn li n ng thng v chn khong cch ln nht, trong trng hp ny l im
C. Vit phng trnh ng thng qua AC v BC. Tnh khong cch cn li t cc nh v chn
khong cch ln nht D Ni A B C D E F.Nu khong cch t cc im n ng thng nh
hn ngng T th ta dng v khng chia tip. Nh vy ta xp x 1 ng t nt thnh
ng gp khc.
Hai vn kh nht l:
Th nht lm sao ta bit c hai im ban u, th hai l sao bit c th t ca nh. Ta c
th chn im bn phi nht v bn tri nht lm im ban u. Cch khc l ta tm nhng
im xa nht ca ng cong. Cn by gi thut ton phi cho trc hai im ban u v cho
trc cc nh theo th t.
Thut ton nh sau:
Bc 1: cho trc P l tp hp cc nh c th t, cho trc hai nh bt u A v B.
Bc 2: khai bao ngng T, v d cho T=5, khai bo 2 stacks l open v closed.
Bc 3: t im A vo stacks open v im B vo stacks closed. i vi ng cong khp
kn th bc 3 c thay i mt cht, im A c a vo stacks open v im B c a vo
stacks open v stacks closed.
thi X L nh GV: Trn Tin c
41

Bc 4: vit phng trnh ng thng ca hai nh sau cng trong stacks closed v stacks
open.
Bc 5: Tnh khong cch t cc nh gia hai nh bc 4 vi ng thng bc 4 v
chn nh c khong cch ln nht.
Bc 6: Nu khong cch ln nht ln hn ngng th a nh vo stack opend v
quay tr li bc 4
Bc 7: Ngc li, ly nh trong open v a vo closed.
Bc 8: Nu open cha rng th n bc 4.
Bc 9: n khi no open rng th thi, cc nh trong stacks closed l cc nh cn tm.
Cu 26. Xy dng v ci t thut ton bin i Hough.
p n:
Mc ch ca bin i Hough l pht hin ra ng thng v ng trn, hoc ng bt k.
Thng thng nht l dng bin i Hough pht hin
ng thng.
Cho im x
i
, y
i
trong mt phng x, y.
Phng trnh ng thng y=ax+b.
Nu ng thng i qua im (xi,yi) th n s l y
i
=ax
I
+b. Khi
cho a, b thay i th c rt nhiu ng thng i qua (x
i
,y
i
).
Ta c thm mt im (x
j
,y
j
) na th cng c v s ng thng
i qua (x
j
,y
j
).
Nh vy s c mt ng thng i qua hai im (x
i
,y
i
) v (x
j
,y
j
).
V ng thng s c a, b ging nhau.
Y
i
= ax
i
+b
Y
j
= ax
j
+b
thi X L nh GV: Trn Tin c
42


Dng mt phng a, b khng bit c kch thc nh l bao
nhiu v cho nh chy t -, v b: -,
khc phc a, b c th ra ti , th ta chuyn phng trnh
ng thng qua ta cc:

Do cc im nh c ta x dng, y dng nn chy t -
90
0
n 90
0
v phm vi ca l , trong D l
khong cch xa nht gia 2 gc i din trong nh.
Code:
void TransformHough(BYTE **f, HDC hdc, int xc, int yc)
{
BYTE **Hough;
int RHO = (int)(2*sqrt(2.0)*sqrt(1.0*M*M+N*N)+1);
int THETA = 181;
int theta, rho;
int x, y;
double pi = 4.0*atan(1.0);


Hough = (BYTE **)Alloc2D(RHO,THETA,sizeof(BYTE));

for (theta = -THETA/2; theta<=THETA/2; theta++)
for (rho=-RHO/2; rho<=RHO/2; rho++)
for (x=0; x<M; x++)
for (y=0;y<N; y++)
if (f[x][y] == 0)
if
((int)(x*cos(theta*pi/180)+y*sin(theta*pi/180)) == rho)
Hough[rho+RHO/2][theta+THETA/2] +=
20;


BYTE r;
for (x=0; x<RHO; x++)
for (y=0; y<THETA; y++) {
r = Hough[x][y];
SetPixel(hdc,xc+y,x,RGB(r,r,r));
}

thi X L nh GV: Trn Tin c
43

FILE *fp;
_wfopen_s(&fp,L"LineHough.pgm",L"wb");
fprintf_s(fp,"P5 %d %d 255 ",THETA,RHO);
fwrite(*Hough,sizeof(BYTE),THETA*RHO,fp);
fclose(fp);

Free2D((void **)Hough);
return;

}
thi X L nh GV: Trn Tin c
44


Chng 4 gm 10 cu t cu 27 n cu 36
Cu 27. Trnh by cc bc lc nh trong min tn s.
p n:
Lc nh trong min tn s gm 7 bc sau y:
Bc 1: Cho nh u vo f(x,y) c kch thc MxN. M rng nh c kch thc l PxQ. C th
P=2M, Q=2N.
Bc 2: Thm zero vo phn m rng, ta c nh f
p
(x,y).
Bc 3: Nhn f
p
(x,y) vi (-1)
x+y
di F(0,0) vo tm nh.
Bc 4: Bin i Fourier ca nh Bc 3 ta c F(u,v).
Bc 5: Cho hm lc c gi tr thc H(u,v) i xng qua tm (P/2,Q/2). Thc hin php nhn
G(u,v) = F(u,v)H(u,v).
Bc 6: Thu c nh x l bng bin i Fourier ngc, ly phn thc v di tr li gc ta


Bc 7: B phn m rng, ta thu c nh g(x,y) c kch thc MxN.
Biu din bng s khi:


thi X L nh GV: Trn Tin c
45

Cu 28. Xy dng v ci t thut ton lm trn nh trong min tn s
dng b lc lowpass l tng.
p n:
Lc trong min tn s c cho bng phng trnh:

Trong F(u,v) l bin i Fourier ca nh f.
lm trn trong min tn s ta dng b lc lowpass (thng thp).
C 3 loi b lc thng thp thng dng:
B lc lowpass l{ tng, Butterworth, Gauss.
B lc lowpass l{ tng khng th ch to c bng phn cng do qun tnh ca linh kin
in t. Tuy nhin ta c th lp trnh bng phn mm. B lc lowpass l{ tng c cho bng
phng trnh:

trong :
D
0
l tn s ct.
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

th ca b lc lowpass l{ tng
thi X L nh GV: Trn Tin c
46


void IdealLowpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 1024;
const int Q = 1024;
double D0 = 10, Duv;


FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Lowpass ly tuong
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
if (Duv <= D0)
H[u][v] = 1;
thi X L nh GV: Trn Tin c
47

else
H[u][v] = 0;
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
Cu 29. Xy dng v ci t thut ton lm trn nh trong min tn s
dng b lc lowpass Butterworth.
p n:
Lc trong min tn s c cho bng phng trnh:

Trong F(u,v) l bin i Fourier ca nh f.
lm trn trong min tn s ta dng b lc lowpass (thng thp).
C 3 loi b lc thng thp thng dng:
B lc lowpass l{ tng, Butterworth, Gauss.
B lc lowpass Butterworth c cho bng phng trnh
thi X L nh GV: Trn Tin c
48


Trong :
D
0
l tn s ct
n : gi l bc b lc
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

th ca b lc lowpass Butterworth


void ButterworthLowpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 1024;
const int Q = 1024;
double D0 = 10, Duv;

thi X L nh GV: Trn Tin c
49


FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Lowpass Butterworth
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = 1.0/(1.0+pow(Duv/D0,2*n));
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
thi X L nh GV: Trn Tin c
50


Cu 30. Xy dng v ci t thut ton lm trn nh trong min tn s
dng b lc lowpass Gauss.
Lc trong min tn s c cho bng phng trnh:

Trong F(u,v) l bin i Fourier ca nh f.
lm trn trong min tn s ta dng b lc lowpass (thng thp).
C 3 loi b lc thng thp thng dng:
B lc lowpass l{ tng, Butterworth, Gauss.
B lc lowpass Gauss c cho bng phng trnh

Trong :
: c gi l lch chun
: c gi l phng sai.
Cho nn ta c:

vi D
0
l tn s ct.
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh


thi X L nh GV: Trn Tin c
51

th ca b lc Gauss:

void GaussLowpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 1024;
const int Q = 1024;
double D0 = 10, Duv, n;


FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H
thi X L nh GV: Trn Tin c
52


// Lowpass Gauss
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = exp(-Duv*Duv/(2*D0*D0));
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
Cu 31. Xy dng v ci t thut ton lm nt nh trong min tn s
dng b lc highpass l tng.
p n:
Ngi ta dng b lc thng cao lm tng nt ca nh
B lc thng cao (highpass) l hiu ca mt v b lc thng thp:

Ta c 3 loi b lc highpass thng dng l: l{ tng, Butterworth, Gauss.
B lc highpass l{ tng c cho bng phng trnh:
thi X L nh GV: Trn Tin c
53


trong :
D
0
l tn s ct.
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

th ca b lc highpass l{ tng

Code:
void IdealHighpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 2048;
const int Q = 2048;

FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
thi X L nh GV: Trn Tin c
54

FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Highpass ideal
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
if (Duv <= D0)
H[u][v] = 0;
else
H[u][v] = 1;
}

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
thi X L nh GV: Trn Tin c
55

Cu 32. Xy dng v ci t thut ton lm nt nh trong min tn s
dng b lc highpass Butterworth.
p n:
Ngi ta dng b lc thng cao lm tng nt ca nh
B lc thng cao (highpass) l hiu ca mt v b lc thng thp:

Ta c 3 loi b lc highpass thng dng l: l{ tng, Butterworth, Gauss.
B lc highpass Butterworth c cho bng phng trnh:

trong :
n l bc ca b lc, D
0
l tn s ct.
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

th ca b lc highpass Butterworth:

Code:
thi X L nh GV: Trn Tin c
56

void ButterworthHighpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 2048;
const int Q = 2048;

FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Highpass Butterworth
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = 1/(1+pow(D0/Duv,2*n));
}

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
thi X L nh GV: Trn Tin c
57

g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}

Cu 33. Xy dng v ci t thut ton lm nt nh trong min tn s
dng b lc highpass Gauss.
p n:
Ngi ta dng b lc thng cao lm tng nt ca nh
B lc thng cao (highpass) l hiu ca mt v b lc thng thp:

Ta c 3 loi b lc highpass thng dng l: l{ tng, Butterworth, Gauss.
B lc highpass Gauss c cho bng phng trnh:

trong :
D
0
l tn s ct.
D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

th ca b lc highpass Gauss:
thi X L nh GV: Trn Tin c
58


Code:
void GaussHighpassFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 2048;
const int Q = 2048;

FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Highpass Gauss
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = 1.0 - exp(-Duv*Duv/(2*D0*D0));
thi X L nh GV: Trn Tin c
59

}

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
Cu 34. Xy dng v ci t thut ton bin i Laplace trong min tn
s.
p n:
Ta c bin i Fourier ca vi phn cp n ca hm f(x)

C th bin i Fourier ca vi phn cp 2 ca hm mt chiu l:

thi X L nh GV: Trn Tin c
60

M rng bin i fourier ca vi phn cp 2 ca hm hai chiu l:

v j
2
= -1
Vy o hm cp 2 ca nh l:

t

Ta phi bin i H(u,v) H(u,v) l i xng qua tm ca nh.

Sau ta dng php bin i Fourier ngc c nh Laplace

Code:
void LaplaceFrequency(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 1024;
const int Q = 1024;
double Duv, pi = 4.0*atan(1.0);


FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = 1.0*f[x][y]/255;

// Buoc 3 Doi vao tam anh
thi X L nh GV: Trn Tin c
61

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = -Duv*Duv;
}


for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];


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

max = fabs(max);
for (x=0; x<M; x++)
for (y=0; y<N; y++)
gp[x][y] = gp[x][y]/max;

double scale = 120;
double r;
for (x=0; x<M; x++)
for (y=0; y<N; y++) {
r = f[x][y]-scale*gp[x][y];
if (r<0)
g[x][y] = 0;
thi X L nh GV: Trn Tin c
62

else if (r>255)
g[x][y] = 255;
else
g[x][y] = (int)r;
}

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
Cu 35. Xy dng v ci t thut ton mt n lm nhe, lc tng cng
v lc nng tn s cao.
p n:
Mt n lm nhe c cho bng phng trnh:

Trong min tn s th

vi H
LP
(u,v) l b lc lowpass v F(u,v) l bin i Fourier ca nh f.
l bin i Fourier ngc.
Nng cao nt ca nh dng mt n lm nhe c cho bng phng trnh:
g(x,y) = f(x,y) + k*g
mask
(x,y)
Nu k=1 ta gi l mt n lm nhe. Nu k>1 ta gi l lc tng cng.
Biu din trong min tn s:

hay

Biu thc nm trong cp du ngoc vung c gi l b lc nng tn s cao.
Tng qut lc nng tn s cao c cho bng phng trnh:
thi X L nh GV: Trn Tin c
63


trong k
1
>= 0 iu khin di t gc v k
2
>= 0 iu khin s tham gia ca tn s cao.
C th, b lc highpass l b lc Gauss c D
0
= 40, k
1
= 0.5, k
2
= 0.75.

void HighFrequencyEmphasis(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 1024;
const int Q = 1024;

double D0 = 40, Duv;
double k1 = 0.5, k2 = 0.75;

FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = f[x][y];

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H
// High Frequency Emphasis
for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = 1.0 - exp(-Duv*Duv/(2*D0*D0));
H[u][v] = k1 + k2*H[u][v];
}

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
thi X L nh GV: Trn Tin c
64


for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}
Cu 36. Xy dng v ci t thut ton lc ng hnh.
p n:
Ta c nh f(x,y) l tch ca hai thnh phn: chi v phn x.

vi i l chi v r l phn x. chi tham gia tn s thp v phn x tham gia
tn s cao. Nh vy nu ta mun tng tng phn v lm nt nh th phi gim tn
s thp v nng tn s cao.
Ta thy 2 thnh phn i v r c nhn vi nhau nn khng th tch ra c.
Tuy nhin ta nh ngha:

khi :
thi X L nh GV: Trn Tin c
65


Hay

Hm lc H(u,v) c cho sao cho c th gim tn s thp v nng tn s cao.
X l trong min tn s:

Suy ra nh x l:

Do trc ta ly logarit ca nh nn by gi ta phi ly ngc tr li bng hm m.

Ta c s khi l:

Ngi ta cho hm lc ng hnh H(u,v) nh sau, c th nng tn s cao v gim c
tn s thp.

thi X L nh GV: Trn Tin c
66


Trong v
Phng trnh ca H(u,v) nh sau:

D(u,v) l khong cch t mt im bt k (u,v) n tm ca nh

C th ta chn:
Trong c l iu khin dc ca hm H(u,v).
Code:
void HomomorphicFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;

int x, y, u, v;
const int P = 2048;
const int Q = 1024;


FR = (double **)Alloc2D(P,Q,sizeof(double));
FI = (double **)Alloc2D(P,Q,sizeof(double));
H = (double **)Alloc2D(P,Q,sizeof(double));
gp = (double **)Alloc2D(P,Q,sizeof(double));


// Buoc 1 va 2 Mo rong anh va them zero
thi X L nh GV: Trn Tin c
67

for (x=0; x<M; x++)
for (y=0; y<N; y++)
FR[x][y] = log(1.0 + f[x][y]);

// Buoc 3 Doi vao tam anh
for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];

// Buoc 4 Bien doi Fourier
fft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H
double gl=0.25, gh=2, c=1;
double D0 = 80, Duv;

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
Duv = sqrt(1.0*(u-P/2)*(u-P/2) + 1.0*(v-Q/2)*(v-Q/2));
H[u][v] = (gh-gl)*(1-exp(-c*Duv*Duv/(D0*D0))) + gl;
}

for (u=0; u<P; u++)
for (v=0; v<Q; v++) {
FR[u][v] = FR[u][v]*H[u][v];
FI[u][v] = FI[u][v]*H[u][v];
}

// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);

for (x=0; x<P; x++)
for (y=0; y<Q; y++)
if ((x+y)%2 == 1)
gp[x][y] = -FR[x][y];
else
gp[x][y] = FR[x][y];

double scale = 80;

for (x=0; x<M; x++)
for (y=0; y<N; y++)
gp[x][y]=scale*exp(gp[x][y]);


// Buoc 7 Bo phan them vao
for (x=0; x<M; x++)
for (y=0; y<N; y++)
if (gp[x][y] > 255)
g[x][y] = 255;
else if (gp[x][y] < 0)
g[x][y] = 0;
else
g[x][y] = (int)gp[x][y];

Free2D((void **)FR);
thi X L nh GV: Trn Tin c
68

Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);

return;
}

You might also like