Cách làm âm ảnh được cho bằng phương trình: s=L-1-r trong đó L=256 là số lượng mức xám, r
là mức xám đầu vào, s là mức xám đầu ra
Quan sát đồ thị ta thấy: Mức xám đầu ra “ngược” với đầu vào, tức là thuật toán này biến ảnh
đen trở thành ảnh trắng và trắng thành đen
69 trang |
Chia sẻ: lylyngoc | Lượt xem: 1880 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Đề thi Xử lý ảnh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ĐỀ THI
Xử Lý Ảnh
Đề 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 ảnh được cho bằng phương trình: s=L-1-r trong đó L=256 là số lượng mức xám, r
là mức xám đầu vào, s là mức xám đầu ra
Quan sát đồ thị ta thấy: Mức xám đầu ra “ngược” với đầu vào, tức là thuật toán này biến ảnh
đen trở thành ảnh trắng và trắng thành đ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: 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:
Phương trình biến đổi:
s=c log(1+r)
trong đó:
r là mức xám đầu vào
s là mức xám đầu ra
c: hằng số dương
log(1+r): tránh trường hợp log = 0.
Quan sát đồ thị thấy đường log làm cho ảnh
trở nên sáng hơn.
Hằng số c được tính như sau:
Ta có phương trình: s=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
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: 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ến đổi lũy thừa được cho bằng phương trình:
s=crγ
với r là mức xám đầu vào, s là mức xám đầu ra,
c, γ là các hằng số dương.
γ<1: làm cho ảnh sáng hơn
γ>1: làm cho ảnh tối hơn.
c: được tính như sau:
Ta thấy trên đồ 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: 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ến đổi ảnh đen ít thành ảnh đen nhiều, làm cho ảnh trắng ít trở thành trắng nhiều. Tức là làm
tăng độ tương phản của ảnh (kéo giãn độ tương phản).
Ta có:
Phương trình đường thẳng đi qua 2 điểm (x1,y1) và (x2,y2) là:
12
1
yy
yy
=
12
1
xx
xx
Y=
12
12
xx
yy
(x-x1)+y1
Đoạn I: điểm (0,0) và (r1,s1)
S=
1
1
r
s
r
Đoạn II: điể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
Đoạn III: điểm (r2,s2) và (L-1,L-1)
S=
2)1(
2)1(
rL
sL
(r-r2)+s2
trong đó: (r1,s1) và (r2,s2) được cho trước.
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;
}
Câu 5. Xây dựng và cài đặt thuật toán cân bằng histogram.
Đáp án:
Mục đích của cân bằng histogram là làm cho histogram đồng đều. Khi đó ta làm tăng được độ
tương phản của ảnh.
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
6
Cân bằng histogram được cho bằng phương trình:
s=T(r)=(L-1)
r
r dwwp
0
)(
với pr(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ật độ 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:
sk=T(rk)=(L-1)
k
j
jr rp
0
)(
với 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;
}
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 histogram lúc nào cũng tốt, nên đôi khi ta phải đưa ảnh về histogram như
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ến đổi histogram tự động
pr(rj)=
MN
n j
sk=T(rk)=
k
j
jr rp
0
)(
Cho histogram mong muốn pz(zi)
Biến đổi histogram mong muốn.
vk=G(zk)= k
k
j
jz szp
0
)(
Cho rk, ta suy ra zk như sau:
zk = G
-1(T(rk))
Mục tiêu: có mức xám đầu vào rk, ta suy ra mức xám đầu ra zk.
Ví dụ cho histogram mong muốn như hình vẽ sau:
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
8
Để mô tả histogram mong muốn như hình vẽ, ta dùng phương trình đường thẳng đi qua hai
điểm (x1,y1) và (x2,y2):
12
1
yy
yy
=
12
1
xx
xx
=>y=
12
12
xx
yy
(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: 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:
Trong trườ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ả. Trong trường hợp đó ta phải dùng histogram cục bộ.
Chọn cửa sổ có kích thướ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
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: 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ệch đó. Nếu cân bằng histogram cục bộ tức cân bằng cho từng khối ảnh, ta sẽ
thấy được sự chênh lệch nhưng lại làm thay đổi ảnh.
Vì vậy ở phần này ta nêu ra tiêu chuẩn chọn khối ảnh để làm rõ.
Tiêu chuẩn chọn khối ảnh căn cứ vào 2 đại lượng thống kê là mean (giá trị trung bình hay giá trị
kz vọng) và variance (phương sai). Xem xét các ví dụ sau:
Ta có:
mean=
N
1
1
0
N
i
ix
và
variance=
N
1
1
0
2
)(
N
i
meanxi
= độ 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:
Variance (phương sai) dùng để đo sự phân tán của dữ liệu xa hay gần giá trị mean. Nếu variance
bằng không nghĩa là dữ liệu bằng nhau.
Để đo 2 khố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à phương sai, còn là độ lệch chuẩn.
Khối được chọn là 3*3.
G(x,y)=
),(
),(
yxf
yxEf
msxy: mean của khối ảnh
mG: 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, k0=0.4, k1=0.02, k2=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);
Nếu msxy<=k0mG và k1 G<= sxy<=k2 G
Nếu ngượ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:
Ngườ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 có kích thước
3x3.
Lọc trong không gian được cho bằng phương trình:
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)
Mặt nạ lọc người ta sẽ cho tùy vào bài toán cụ thể.
Tổng quát lọc trong không gian được cho bằng phương trình :
g(x,y)=
a
as
b
bt
tysxftsw ),(),(
Trong đó :
mxn là kích thước của bộ lọc, m và n thường là số lẻ để bộ lọc có phần tử trung tâm.
a=m/2 và b=n/2 là kích thước nữa bộ lọc.
Phép toán lọc trong không gian được gọi là tổng chập (convolution).
Đối với lọc tuyến tính, mặt nạ lọc thường là bộ lọc trung bình.
Ví dụ: mặt nạ lọc trung bình và mặt 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: 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 median đặc biệt hiệu quả khi trong ảnh có nhiễu xung, nhiễu xung còn được gọi là nhiễu
muối tiêu. Nhiễu muối tiêu là những đốm đen và đốm trắng trong ảnh.
Thực hiện lọc median như sau:
Lấy số liệu vào từng cửa sổ (3x3). Tạo mảng một chiều, sắp tăng dần và phần tử f(x,y) đượ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:
Người ta dùng đạo hàm cấp một hoặc cấp hai để làm tăng độ nét của ảnh.
Yêu cầu đaọ hàm cấp một:
- Đạo hàm cấp một bằng 0 trong miền có mức xám đồng đều.
- Đạo hàm cấp một khác 0 ở điểm đầu của mức xám bướ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ều được gọi là gradient, ký hiệu là và được định nghĩa như
sau :
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
17
=grad(f)=
y
x
g
g
=
y
f
x
f
trong đó:
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 theo x được định nghĩa là :
x
f
=f(x+1,y)-f(x,y)
Đạo hàm cấp một theo y được định nghĩa là :
y
f
=f(x,y+1) – f(x,y)
Độ lớn của vectơ gradient f kí hiệu là :
M(x,y)=mag( f)= 22 yx gg
Nếu tính căn bậc hai sẽ lâu nên ta tính trị tuyệt đối cho nhanh.
M(x,y)|gx|+|gy|
Gọi số liệu trong mặt nạ 3x3 là
z1 z2 z3
z4 z5 z6
z7 z8 z9
Đạo hàm cấp một theo hướng x là : gx = z8-z5
Đạo hàm cấp một theo hướng y là : gy = z6-z5
Nhưng Roberts đã định nghĩa đạo hàm cấp một theo x như sau : gx=z9-z5
và đạo hàm cấp một theo y là : gy=z8-z6
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
18
Ta có hai mặt nạ gx và gy và gọi là mặt nạ Roberts.
Mặt nạ Roberts có kích thước chẵn nên không có phần tử trung tâm. Do đó Sobel đã mở rộng
định nghĩa đạo hàm cấp một như sau :
gx=
x
f
=(z7+2z8+z9)-(z1+2z2+z3)
và gy=
y
f
=(z3+2z6+z9)-(z1+2z4+z)
Viết dưới dạng mặt 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: 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ủa đạo hàm cấp hai:
- Đạo hàm cấp hai bằng 0 ở vùng có mức xám đồng đều.
- Đạo hàm cấp hai khác 0 ở đầu và cuối của mức xám bướ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.
Định nghĩa đạo hàm cấp hai của hàm một chiều như sau:
x
f
2
2
=f(x+1) + f(x-1) – 2f(x)
Định nghĩa đạo hàm cấp hai của hàm hai biến là:
f2 =
2
2
x
f
+
2
2
y
f
: gradient (đạo hàm cấp một của hàm 2 biến)
Đạo hàm cấp 2 của ảnh còn được gọi là toán tử Laplace.
Nhắc lại:
Đạo hàm cấp hai theo hướng x:
2
2
x
f
=f(x+1,y)+f(x-1,y)-2f(x,y)
Đạo hàm cấp hai theo hướ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ết dưới dạng mặt nạ như sau :
Ta mở rộng thêm các mặt nạ đào hàm cấp hai như sau :
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[ f2 (x,y)]
Trong đó:
c=-1 nếu tâm mặt nạ âm
c=1 nếu tâm mặt nạ dương
Mức xám đầu ra sẽ có giá trị nhỏ hơn 0 và lớn hơn 255 nên ta phải chuẩn hóa để mức xám đầu
ra nằm trong khoảng 0..255.
Đơn giản nhất: nếu đầu ra có giá trị âm thì cho bằng 0, nếu đầ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 max vào 0…255 bằng công
thức sau :
g[x][y]=
minmax
min]][[
yxg
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