Đề 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 bs=L-1-r ng mc xám, r
là mu vào, s là mu ra
Quan th ta thy: Mu vào, tc là thut toán này bin nh
thành nh trng và trng 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:
bii:
s=c log(1+r)
t
r là mu vào
s là mc u ra
c: hng s
ng hp log = 0.
Quan sát th thng 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 cn có: r=L-1 thì s=L-1
c=
)11log(
1
L
L
Vi 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:
Bic cho b
s=cr
vi r là mu vào, s là mu 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:
Bii u, làm cho nh trng ít tr thành trng nhiu. Tc là làm
n ca n).
Ta có:
ng thm (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:
Ma cân bng u
n ca nh.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
6
Cân bc cho b
s=T(r)=(L-1)
r
r
dwwp
0
)(
vi p
r
(w) : Xác sut xy ra mc xám w
Trong xác sut, tích phân ca hàm m là hàm phân phi. Công thc trên có w là bin liên
tc, ta không th lp trình nó. Ta phi dùng công thc ri rc:
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 phi cân bng hit, nnh v
ta mong mun.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
7
Tính histogram ca nh ri suy ra hàm bii histogram t ng
p
r
(r
j
)=
MN
n
j
s
k
=T(r
k
)=
k
j
jr
rp
0
)(
Cho histogram mong mun p
z
(z
i
)
Bii histogram mong mun.
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ó mu vào r
k
, ta suy ra mu 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 mung 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 hp 2 mc xám k nhau chênh lch quá nh, nu ta cân bng histogram t ng
s không có kt qung hi dùng histogram cc b.
Chn ca s c l có phn t trung tâm, ví d: m=n=3, cân bng histogram ca
d liu ly t ca s và thay phn t trung tâm bng phn t mi.
Đề 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:
Nu s chênh lch mc xám quá nh thì cân bng histogram cho toàn b nh s không thy
c s chênh lu cân bng histogram cc b tc cân bng cho tng khi nh, ta s
thc s chênh l li nh.
Vì vy phn này ta nêu ra tiêu chun chn khi làm rõ.
Tiêu chun chn khi ng thng kê là mean (giá tr trung bình hay giá tr
k vng) và variance ( sau:
Ta có:
mean=
N
1
1
0
N
i
i
x
và
variance=
N
1
1
0
2
)(
N
i
meanx
i
= lch chun =
iancevar
Ví d: Cho 2 nhóm 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 =
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 ca d liu xa hay gn giá tr mean. Nu variance
b liu bng nhau.
i d liu vi nhau thì mean và variance ca khi phi gn bng nhau.
Tiêu chuẩn chọn khối trong ảnh để làm rõ:
2
: là , còn lch chun.
Khc chn là 3*3.
G(x,y)=
),(
),(
yxf
yxEf
m
sxy:
mean ca khi nh
m
G
: mean ca toàn b nh
sxy:
lch chun khi nh
G:
lch chun ca toàn b nh.
vi 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);
Nu m
sxy
<=k
0
m
G
và k
1 G
<=
sxy
<=k
2 G
Nc li
Đề 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 mt ca s nh c gi là mt n (hay b lc), chng hn b lc
3x3.
Lc 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)
Mt n lc i ta s cho tùy vào bài toán c th.
Tng quát lc cho b :
g(x,y)=
a
as
b
bt
tysxftsw ),(),(
:
mxc ca b lng là s l b lc có phn t trung tâm.
a=m/2 và b=n/2 là c na b lc.
Phép toán lc c gi là tng chp (convolution).
i vi lc tuyn tính, mt n lng là b lc trung bình.
Ví d: mt n lc trung bình và mt 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:
Lc median (lc trung v) là ly v trí chính gia.
Lc bit hiu qu khi trong nh có nhiu xung, nhic gi là nhiu
mui tiêu. Nhiu mui tiêu là nhm trng trong nh.
Thc hin l
Ly s liu vào tng ca s (3x3). To mng mt chiu, sn và phn t c thay
bng phn t chính gia.
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 cp mt hoc c nét ca nh.
Yêu c hàm cp mt:
- o hàm cp mt bng 0 trong min có mu.
- o hàm cp mt khác 0 iu ca mc hoc mc xám thoai thoi.
- o hàm cp mt khác 0 dc theo mc xám thoai thoi.
o hàm cp mt ca hàm hai chic gi là gradient, ký hiu 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 cp mt theo x
y
f
g
y
:o hàm cp mt theo y
o hàm cp mt :
x
f
=f(x+1,y)-f(x,y)
o hàm cp mt the :
y
f
=f(x,y+1) f(x,y)
ln c gradient f kí hiu là :
M(x,y)=mag(
f)=
22
yx
gg
Nc hai s lâu nên ta tính tr tuyi 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 hàm cp mt ng x là : g
x
= z
8
-z
5
o hàm cp mt theo ng y là : g
y
= z
6
-z
5
o hàm cp mt : g
x
=z
9
-z
5
vo hàm cp mt theo y là : g
y
=z
8
-z
6
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
18
Ta có hai mt n g
x
và g
y
và gi là mt n Roberts.
Mt n c chn nên không có phn t rng
o hàm cp mt :
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)
Vii dng mt 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 cu co hàm cp hai:
- o hàm cp hai bng 0 vùng có mu.
- o hàm cp hai khác 0 u và cui ca mc hoc mc xám thoai thoi.
- o hàm cp hai bng 0 dc theo mc xám thoai thoi.
o hàm cp hai ca hàm mt chi
x
f
2
2
=f(x+1) + f(x-1) 2f(x)
nh o hàm cp hai ca hàm hai bin là:
f
2
=
2
2
x
f
+
2
2
y
f
o hàm cp mt ca hàm 2 bin)
o hàm cp 2 ca c gi là toán t Laplace.
Nhc li:
o hàm cp hai ng x:
2
2
x
f
=f(x+1,y)+f(x-1,y)-2f(x,y)
o hàm cp hai ng y:
2
2
y
f
=f(x,y+1)+f(x,y-1)-2f(x,y)
o hàm cp hai ca 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 vii dng mt n :
Ta m rng thêm các mt n p hai :
Tùy bài toán mà ta dùng mt n cho phù hp.
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 nu tâm mt n âm
c=1 nu tâm mt n
Mu ra s có giá tr nh i chu mu
ra nm trong khong 0 255.
n nht: nu ra có giá tr âm thì cho bng 0, nu ra >255 thì cho bng 255.
Chun 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 phi chuyn khong min ng công
thc 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 ca nh dùng mt n làm nhòe ng dùng trong công ngh in nh, quá trình
g
- Làm nhòe nh.
- Ly nh gc tr vi c mt nh mi gi là mt n làm nhòe.
- Cng mt n làm nhòe vi nh gc.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
24
Kí hiu:
_______
),( yxf
: là
Mt n c biu din b
gmask(x,y)=f(x,y) -
_______
),( yxf
g(x,y) = f(x,y) + k.gmask(x,y)
k c chn > 0, khi k=1 ta gi là mt n làm nhòe, khi k>1 ta gi là lng.
Mt n Gauss làm nhòe nh c cho b :
gauss(x,y)=
2
22
2
yx
e
: lch chun 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;
}