Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Đề 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:
!"#$%
#$&'(%#$&')
*')+,) /#$&')01(23&'(%#'4.35
678(869
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];
:
;
<=%=>
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
?35@3
<A>
• #$&'(
• #$&')
• "B
• <A>C=9
*')+, C7D9
Hằng số c được nh như sau:
E) <A>
;F==
E) &
)11log(
1
−+
−
L
L
G23 ! H 9IJ I
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;
}
K63.
<=%=>
L6)M(6
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
N35@3O.P)
Q
(23#$&'(%#$&')%
%Q"B9
• QR
• QS"39
c: được nh như sau:
E) D+,
• ==
•
<>
Q
γ
)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;
}
T
γ=0,4
γ=1
γ=1,5
S
R
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
N35@36U63V'%8U783V'9E#
WXY)<Z[3\X>9
Ta có:
?C]3^')3_<$%.>(<$%.>
12
1
yy
yy
−
−
12
1
xx
xx
−
−
`
12
12
xx
yy
−
−
<$$>A.
• abK3_<=%=>(<%>
:
1
1
r
s
• abKK3_<%>(<%>
H
L-1
L-1
r
<%>
<%>
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
:
12
12
rr
ss
−
−
<>A
• abKKK3_<%>(<%>
:
2)1(
2)1(
rL
sL
−−
−−
<>A
<%>(<%>29
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:
/cUY)3)3)+V'9d3)WX
Y)9
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
3)
E<><>
∫
r
r
dwwp
0
)(
(23
r
<e>f'-$.)#$w
E$'-%gY)4X"39h#Dw353D
c%)Zh_49E)3Bih#C3b
Z
E<
Z
><>
∑
=
k
j
jr
rp
0
)(
(23Z=%%%j%
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:
dh33)kO"%Dh3Z3)3)(V3)
)'"9
!
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
EU3)Y)+3'.)35@33)lX
<r
m
>
MN
n
j
Z
E<
Z
>
∑
=
k
j
jr
rp
0
)(
3)'"
n
<z
i
>
N35@33)'"9
(
Z
o<n
Z
>
k
k
j
jz
szp =
∑
=0
)(
Z
%)'.)n
Z
)'
n
Z
o
<E<
Z
>>
Mục êu:#$&'(
Z
%)'.)#$&')n
Z
9
GUBc3)'"(p)'
q
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
a_h3)'"(p%)BiC]3^'))3
3_<$
%.
>(<$
%.
>
12
1
yy
yy
−
−
12
1
xx
xx
−
−
S.
12
12
xx
yy
−
−
<$$>A.
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)
J
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
EC#$ZV)'Dr^'s%5')3)lX
pZhZ5^'9EC)3Bi3)cX9
tu)@ZU2v_&u'%(UBcT%3)Y)Bw
3r' Pu)@().&u'&u239
I
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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
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:
L5'lDr#$^'s3)XpZh
lDr9L5'3)cX#PZ"3%)p
lDrb3).@39
G(4.7&.)D')MD''xtZ"3_F9
E3D''xtZ"3W#(b3"ZD6)<3,').3,
Zy(t>(()3)6<)3>9f6$[(UBc)'
E)
6)
N
1
∑
−
=
1
0
N
i
i
x
(
()3)6
N
1
∑
−
−
=
1
0
2
)(
N
i
meanx
i
Xr'x
iancevar
GUBc"3r'
z= J={(zJ I{
x x-mean (x-mean)
2
0
8
12
20
-10
-2
2
10
100
4
4
10
()3)6=J|H
B6(3)M
iancevar
q9
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
x x-mean (x-mean)
2
8
9
11
12
2
-1
1
2
4
1
1
4
G)3)6=|H9
}6(3)M
iancevar
9 J
Ý nghĩa:
G)3)6<)3>Bi_lY)Bw3r'$)).&3,6)9L5'()3)6
Zh~)Bw3r')'9
a_Z"3Bw3r'(23)'6)(()3)6Y)Z"33&)'9
Tiêu chuẩn chọn khối trong ảnh để làm rõ:
)3%• Xr'x9
d"3tT€T9
o<$%.>
),(
),(
yxf
yxEf
$.
6)Y)Z"3
o
6)Y)X
$.
Xr'xZ"3
o
Xr'xY)X9
(23•H9=%Z
=
=9H%Z
=9=%Z
=9H9
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++)
L5'
$.
RZ
=
o
(Z
o
R
$.
RZ
o
L5'b3
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
m = m + a[x][y];
m = m/(sizex*sizey);
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;
}
T
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
LC3)BiXu)@st3‚b<).Xt>%]bXtZU2
T$T9
tZh3)
o<$%.>e<%>ƒ<$%.>Ae<%=>ƒ<$%.>AjAe<=%=>ƒ<$%.>AjAe<%>ƒ<$A%.A>
/‚btC3)pi.(3c_9
E@^'tZh3)
<x%y>
∑
−=
a
as
∑
−=
++
b
bt
tysxftsw ),(),(
E
$ZU2Y)Xt%(C"v_Xt&u'9
)|(|ZU2w)Xt9
?[tZh3)t3@4<('M>9
a"3(23t'.5g%‚btCXt'9
GUBc‚bt'(‚bo)'
Co de :
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++)
for (t=-b; t<=b; t++) {
p = x+s;
H
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
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:
t6B3)<t'(,> (,UU3w)9
t6B3)‚3r3r'^'Z33„'$'%3„'$'•t33„'
'"3MD'9L3„''"3MD'w"6("89
El3rt6B3))'
"3r'(Pu)@<T$T>9EbX3V'%8WB&(&uƒ<$%.>).
&uU3w)9
void Sort(BYTE **a, int sizex, int sizey)
{
int i, j;
BYTE *b = *a;
BYTE temp;
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
LC3)Bib-X‚-)3_WX[Y)9
`D'&')t-X
- ab-X=3V#$+V'9
- ab-XZ=73_&'Y)#$2‚#$)339
- ab-XZ=Bt6#$)339
ab-XY))33V't3)B36%Z…3r'
∇
(,~)
)'
!
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
∇
)B<ƒ>
y
x
g
g
∂
∂
∂
∂
y
f
x
f
x
f
g
x
∂
∂
=
b-X6$
y
f
g
y
∂
∂
=
b-X6.
ab-X6$,~)
x
f
∂
∂
ƒ<$A%.>ƒ<$%.>
ab-X6.,~)
y
f
∂
∂
ƒ<$%.A>†ƒ<$%.>
aX2Y)(6)B36ƒZU3r'
/<$%.>)<
∇
ƒ>
22
yx
gg
+
L5'gW4)3p'D)g,'.r"3)9
/<$%.>
≈
‡
$
‡A‡
.
‡
ot3"3r'‚bT$T
z
1
z
2
z
3
z
4
z
5
z
6
z
7
z
8
z
9
ab-X62$
$
n
J
n
ab-X62.
.
n
!
n
L;6\,~)b-X6$)'
$
n
I
n
(b-X6.
.
n
J
n
!
q
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
E))3‚b
$
(
.
(t3‚b;69
/‚b;6ZU2ˆDZh&u'9}:6\7X
,~)b-X)'
$
x
f
∂
∂
<n
q
An
J
An
I
><n
An
An
T
>
(
.
y
f
∂
∂
<n
T
An
!
An
I
><n
An
H
An>
G35B23Bb‚b)'
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;
J
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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];
I
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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:
`D'&'Y)b-)3
- ab-)3=7(i#$+V'9
- ab-)3Z=7&'('"3Y)#$2‚#$)339
- ab-)3=Bt6#$)339
a,~)b-)3Y)X3V')'
x
f
2
2
∂
∂
ƒ<$A>Aƒ<$>†ƒ<$>
a,~)b-)3Y))335
f
2
∇
2
2
x
f
∂
∂
A
2
2
y
f
∂
∂
∇
)B36<b-XY)35>
ab-Y)•t3u))69
L8b3
ab-)362$
2
2
x
f
∂
∂
ƒ<$A%.>Aƒ<$%.>ƒ<$%.>
ab-)362.
2
2
y
f
∂
∂
ƒ<$%.A>Aƒ<$%.>ƒ<$%.>
ab-)3Y)
=
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
),(
2
yxf
∇
ƒ<$A%.>Aƒ<$%.>Aƒ<$%.A>Aƒ<$%.>Hƒ<$%.>
‰).(35B23Bb‚b)'
E)7XD‚b-)3)'
Ei.3)Bi‚bi9
Nâng cao độ nét của ảnh được cho bằng phương trình:
<$%.>ƒ<$%.>Az
f
2
∇
<$%.>{
E
5'‚b
5'‚bB
/#$&')p3,s=(2 D)3'x)_#$&'
)Z=99 9
a3-5'&')3,=%5'&')S 9
'x)Z
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
E)3,3<3,>()$%)3'._Z3)$(=j h
#)'
z${z.{
minmax
min]][[
−
−
yxg
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
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:
L)X[Y)Bi‚b•6CBihr3%^'
+2)'.
- •69
- "P(23\•6)X23t3‚b•69
- X‚b•6(23"9
T
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
dU3r'
_______
),( yxf
\•6%
/‚b•63_'B3„)'
)Z<$%.>ƒ<$%.>
_______
),( yxf
<$%.>ƒ<$%.>AZ9)Z<$%.>
ZtS=%Z3Z)t3‚b•6%Z3ZS)t3tWC9
/‚bo)'Bi_•6
)'<$%.>
2
22
2
σ
yx
e
+
−
σ
: Xr'x29
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;
}
H
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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;
}