Professional Documents
Culture Documents
De Thi Xu Ly Anh
De Thi Xu Ly Anh
Đề thi Xử Lý Ảnh
GV: Trần Tiến Đức
MỤC LỤC
L-1
(0,0 R
) L-1
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 = L-1-r;
g[x][y] = s;
1
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
}
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: L-1
Negativ
Ta có phương e trình: s=c
log
log(1+r)
Rõ ràng r=0 thì s=0
Ta cần có: r=L-1 thì s=L-1
L −1
c= log( 1 + L −1)
Intensit
Với L = 256 thì y c= 45.9859
Code:
void Logarithm(BYTE **f, (0,0) L-1 BYTE **g)
{
int x, y;
double r,s;
double c = (L-1)/log(1.0*L);
2
Đề 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:
Biến đổi lũy thừa được cho bằng phương S
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 γ=0,4
• γ>1: làm cho ảnh tối hơn.
γ=1
c: được tính như sau:
Ta thấy trên đồ thị:
• r=0 thì s=0 γ=1,5
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);
L-1
(r2,s2)toán biến đổi tuyến tính từng phần.
Câu 4. Xây dựng và cài đặt thuật
Đáp án:
3
(r1,s1)
r
L-1
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
y 2 − y1
Y= (x-x1)+y1
x 2 − x1
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];
4
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
r1 = rmin;
s1 = 0;
r2 = rmax;
s2 = L-1;
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.
Cân bằng histogram được cho bằng phương trình:
r
s=T(r)=(L-1) ∫ p r ( w)dw
0
sk=T(rk)=(L-1) ∑p r ( r j )
j =0
với k= 0,1,2,…,L-1
Code:
void HistogramEqualization(BYTE **f, BYTE **g)
5
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
{
double T[L];
int k, j, x, y;
BYTE r;
double s;
double p[L];
Histogram(f,p);
6
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Tính histogram của ảnh rồi suy ra hàm biến đổi histogram tự động
nj
pr(rj)=
MN
k
sk=T(rk)= ∑p r ( r j )
j =0
vk=G(zk)= ∑ p z ( z j ) =s k
j =0
7
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Để 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):
y − y1 x − x1 y 2 − y1
=
y 2 − y1 x 2 − x1
=>y= (x-x1)+y1
x 2 − x1
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;
8
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
else if (z<z5)
pz[z] = (pz5-pz4)/(z5-z4)*(z-z4) + pz4;
else
pz[z] = (pz6-pz5)/(z6-z5)*(z-z5) + pz5;
// 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.
9
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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;
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));
LocalHistogram(w,m,n,p);
LocalHistogramEqualization(p,T);
r = f[x][y];
g[x][y] = (int)((L-1)*T[r]);
10
Đề 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:
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ị kỳ vọng) và variance (phương sai). Xem xét các ví dụ sau:
Ta có:
N −1
1
mean=
N
∑x
i =0
i
và
N −1
∑( xi −mean )
1 2
variance=
N i =0
x x-mean (x-mean)2
0 -10 100
8 -2 4
12 2 4
20 10 10
variance = 208/4 = 52
deviation = var iance =7.21
11
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
x x-mean (x-mean)2
8 2 4
9 -1 1
11 1 1
12 2 4
Variance=10/4=2.5
Deviation= var iance =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.
E f( x, yNếu
) msxy<=k0mG và k1 <=
G <=k2
sxy
G
G(x,y)=
f ( x, y )
msxy: mean của khối ảnh
mG: mean của toàn bộ ảnh
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];
12
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
m = m/(sizex*sizey);
return m;
}
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));
Free2D((void **)w);
return;
}
13
Đề 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:
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 :
a b
g(x,y)= ∑ ∑w( s, t ) f ( x + s, y + t )
s =−a t =−b
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:
1 1 1 1 1 2 1
1
x 1 1 1 16 2 4 2
9
1 1 1 x 1 2 1
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;
}
14
Đề 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;
}
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.
15
Đề 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;
}
w = (BYTE **)Alloc2D(m,n,sizeof(BYTE));
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 :
16
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
∂f
gx ∂ x
∇ =grad(f)=
g ∂f
=
y ∂ y
trong đó:
∂f
gx =
∂x : đạo hàm cấp một theo x
∂f
gy =
∂y :đạo hàm cấp một theo y
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
17
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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;
}
18
Đề 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;
}
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;
ConvolutionInt(f,M,N,gx,Sobelx,m,n,TRUE);
ConvolutionInt(f,M,N,gy,Sobely,m,n,TRUE);
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];
19
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
r = Mag[x][y];
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:
∂f
=f(x+1) – f(x)
∂x
Định nghĩa đạo hàm cấp hai của hàm một chiều như sau:
∂2 f
=f(x+1) + f(x-1) – 2f(x)
∂2 x
Định nghĩa đạo hàm cấp hai của hàm hai biến là:
∂2 f ∂2 f
∇2 f = +
∂x 2 ∂y 2
20
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
∂2 f
=f(x,y+1)+f(x,y-1)-2f(x,y)
∂y 2
Ta mở rộng thêm các mặt nạ đào hàm cấp hai như sau :
21
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Đơ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:
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 ] − min
g[x][y]= 255
max − min
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;
}
22
Đề 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);
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âng cao độ nét của ảnh dùng mặt nạ làm nhòe thường dùng trong công nghệ in ảnh,
quá trình gồm các bước sau đây:
23
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Mặt nạ làm nhòe được biểu diễn bằng các phương trình sau:
_______
gmask(x,y)=f(x,y) - f ( x, y )
g(x,y) = f(x,y) + k.gmask(x,y)
k được chọn > 0, khi k=1 ta gọi là mặt nạ làm nhòe, khi k>1 ta gọi là lọc tăng
cường.
Mặt nạ Gauss dùng để làm nhòe ảnh được cho bằng phương trình :
x2 +y 2
gauss(x,y)= −
2σ 2
e
σ : độ lệch chuẩn được cho trước.
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;
}
24
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
r = r + w[s+a][t+b]*f[p][q];
}
g[x][y] = r;
}
return;
}
sum = 0;
for (x=0; x<m; x++)
for (y=0; y<n; y++)
sum += Gauss[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);
25
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
return;
}
26
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Ta lấy tập B dời đi một độ dời z sao cho tập vừa dời là tập con của A.
Code:
void Erosion(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL border)
{
BOOL flag;
a = m/2;
b = n/2;
if (border) {
bx = 0;
by = 0;
}
else {
bx = a;
by = b;
}
27
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Lấy tập dời đi một độ dời z sao cho tập vừa dời giao với tập A khác rỗng.
Lưu ý phương trình này dựa trên tập phản xạ của B, nhưng do B thường là đối
xứng nên = B.
Code:
void Dilation(BYTE **f, int M, int N, BYTE **B, int m, int n, BYTE **g, BOOL border)
{
a = m/2;
b = n/2;
BOOL flag;
if (border) {
bx = 0;
by = 0;
}
else {
28
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
bx = a;
by = b;
}
return;
}
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);
29
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Free2D((void **)temp);
return;
}
A • B = (A B) B
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;
}
Câu 18. Xây dựng và cài đặt thuật toán trích biên.
Đáp án:
Biên của tập A kí hiệu là Đầu tiên ta bào mòn A bởi B, lấy ảnh A ban đầu
Code:
void Boundary(BYTE **f, BYTE **g)
{
int x, y;
BYTE **temp;
BYTE **B;
30
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
f[x][y] = 255;
int m = 3, n = 3;
B = (BYTE **)Alloc2D(m,n,sizeof(BYTE));
Erosion(f,M,N,B,m,n,temp,FALSE);
Free2D((void **)B);
Free2D((void **)temp);
return;
}
Câu 19. Xây dựng và cài đặt thuật toán lấp lỗ trống.
Đáp án:
Cho một đối tượng ở bên trong có lỗ trống, mục đích là ta phải lấp lỗ trống này.
Lấp lỗ trống được cho bằng phương trình:
31
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Thuật toán ngừng khi Xk của bước trước sau không thay đổi.
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;
}
32
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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;
B[0][0] = 0; B[0][2] = 0;
B[2][0] = 0; B[2][2] = 0;
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;
}
Thoat:
33
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Free2D((void **)X);
Free2D((void **)B);
Free2D((void **)Ac);
return;
}
34
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 20. Xây dựng và cài đặt thuật toán phát hiện cạnh ảnh bằng đạo
hàm cấp hai.
Đáp án:
Có 3 bước cơ bản phải làm để phát hiện cạnh ảnh:
• Làm trơn ảnh để giảm nhiễu.
• Phát hiện những điểm ở trên cạnh.
• Bỏ những điểm ở trên cạnh không cần thiết.
Người ta dùng mặt nạ đạo hàm cấp hai để phát hiện cạnh ảnh, nhưng cạnh ảnh sẽ bị
dày lên gấp đôi, và ta phải xử lí trường hợp này.
Ngoài ra người ta dùng các mặt nạ đạo hàm cấp hai sau đây để phát hiện cạnh ảnh.
Nếu muốn phát hiện đường thẳng trong ảnh thì ta dung lần 4 mặt nạ này lần lượt quét
qua ảnh.
Ta gọi đầu ra tại 1 điểm ảnh là R1, R2, R3 và R4.
Code:
void LineDetectionLaplace(BYTE **f, BYTE **g)
{
int **temp;
35
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
int x, y, r;
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);
Free2D((void **)temp);
Free2D((void **)w);
return;
}
Câu 21. Xây dựng và cài đặt thuật toán phát hiện cạnh ảnh bằng đạo
hàm cấp một.
Đáp án:
Ta dùng mặt nạ đạo hàm cấp một để phát hiện cạnh ảnh.
Có 2 mặt nạ đạo hàm cấp một thường dùng là Sobel, Prewitt.
36
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Ta có thể kết hợp thêm với ngưỡng để lấy những điểm ảnh trên cạnh cho tốt.
Chẳng hạn ta lấy ngưỡng =33% giá trị max của đạo hàm cấp 1, nếu ta phát hiện điểm
ảnh nhỏ hơn ngưỡng thì ta bỏ qua.
Code:
void LineDetectionGradient(BYTE **f, BYTE **g)
{
int **temp;
int x, y, r;
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;
37
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
ConvolutionInt(f,M,N,temp,w,m,n,TRUE);
Câu 22. Xây dựng thuật toán phát hiện cạnh Marr – Hildreth.
Đáp án:
Ta có hàm Gauss
Được gọi là độ lệch chuẩn
Đạo hàm cấp 2 của hàm 2 chiều Gauss còn được gọi là Laplace của Gauss và viết tắt
là LoG.
Thuật toán Marr-Hildreth gồm các bước sau đây.
- Dùng mặt nạ Gauss để làm trơn ảnh
- Tính Laplace của ảnh ở bước 1.
- tìm điểm cắt 0 của ảnh đạo hàm cấp 2, điểm cắt 0 là điểm ảnh ở bước 2 mà
trước đó có giá trị dương và sau đó có giá trị âm và ngược lại.
38
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 23. Xây dựng thuật toán phát hiện cạnh Canny.
Đáp án:
Cho đến nay phương pháp phát hiện cạnh của Canny là tốt nhất.
Phương pháp của Canny dựa trên 3 mục tiêu sau đây:
• Tốc độ sai số thấp.
• Các điểm ở trên cạnh là đúng.
• Xóa bỏ các điểm thừa ở trên cạnh.
Ta có hàm Gauss:
Trong đó:
là phép chập.
f(x,y) là ảnh đầu vào.
G(x,y) là mặt nạ Gauss.
fs(x,y) là ảnh đã làm trơn.
Tiếp theo ta dung mặt nạ đạo hàm cấp 1 như Sobel hay Prewitt để phát hiện cạnh
của ảnh đã làm trơn.
Sau đó xóa bỏ đỉnh nhỏ, dùng ngưỡng kép và phân tích liên thông để phát hiện biên
không bị đứt nét.
Tóm lại, thuật toán phát hiện Canny gồm 4 bước:
• Bước 1: dùng mặt nạ Gauss làm trơn ảnh.
39
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
• Bước 2: tính ảnh đạo hàm cấp 1 và ảnh góc pha: M(x,y) và α(x,y).
• Bước 3: xóa những đỉnh nhỏ.
• Bước 4: dùng ngưỡng kép và phân tích liên thông để nối các cạnh bị đứt.
Ví dụ: ngưỡng thấp được chọn TL=0.04, ngưỡng cao được khoảng 2.5 TL.
Câu 24. Xây dựng thuật toán liên kết cạnh bằng xử lý cục bộ.
Đáp án:
Dùng mặt nạ đạo hàm cấp một như Sobel hay Prewitt để phát hiện cạnh của ảnh đã
làm trơn.
Bước 4: Phát hiện lổ trống theo hướng khác bằng cách là quay ảnh một góc , lặp lại
bước 3 và quay ngược trở lại
A được cho có thể là 0, -180o, 90o, -90o, 45o, -45o.
Câu 25. Xây dựng thuật toán liên kết cạnh bằng xử lý trên miền.
Đáp án:
Sau khi tách biên và lấy ngưỡng, ta được các điểm rời nhau. Bây giờ ta phải nối các
điểm đó lại với nhau.
Hình sau đây biểu diễn tập các điểm của một đường cong hở, có điểm đầu là A và
điểm cuối là B.
40
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Viết phương trình đường thẳng đi qua hai điểm A và B, tiếp theo ta tính khoảng cách từ
các điểm còn lại đến đường thẳng đó và chọn khoảng cách lớn nhất, trong trường hợp
này là điểm C. Viết phương trình đường thẳng qua AC và BC. Tính khoảng cách còn lại
từ các đỉnh và chọn khoảng cách lớn nhất D… Nối A B C D E F.Nếu khoảng cách từ
các điểm đến đường thẳng nhỏ hơn ngưỡng T thì ta dừng và không chia tiếp. Như vậy
ta đã xấp xỉ 1 đường đứt nét thành đường gấp khúc.
Hai vấn đề khó nhất là:
Thứ nhất làm sao ta biết được hai điểm ban đầu, thứ hai là sao biết được thứ tự của
đỉnh. Ta có thể chọn điểm bên phải nhất và bên trái nhất làm điểm ban đầu. Cách khác
là ta tìm những điểm xa nhất của đường cong. Còn bây giờ thuật toán phải cho trước
hai điểm ban đầu và cho trước các đỉnh theo thứ tự.
Thuật toán như sau:
Bước 1: cho trước P là tập hợp các đỉnh có thứ tự, cho trước hai đỉnh bắt đầu A và
B.
Bước 2: khai bao ngưỡng T, ví dụ cho T=5, khai báo 2 stacks là open và closed.
Bước 3: đặt điểm A vào stacks open và điểm B vào stacks closed. Đối với đường
cong khép kín thì bước 3 có thay đổi một chút, điểm A được đưa vào stacks open và
điểm B được đưa vào stacks open và stacks closed.
41
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Bước 4: viết phương trình đường thẳng của hai đỉnh sau cùng trong stacks closed
và stacks open.
Bước 5: Tính khoảng cách từ các đỉnh giữa hai đỉnh ở bước 4 với đường thẳng ở
bước 4 và chọn đỉnh có khoảng cách lớn nhất.
Bước 6: Nếu khoảng cách lớn nhất lớn hơn ngưỡng thì đưa đỉnh đó vào stack
opend và quay trở lại bước 4
Bước 7: Ngược lại, lấy đỉnh trong open và đưa vào closed.
Bước 8: Nếu open chưa rỗng thì đến bước 4.
Bước 9: đến khi nào open rỗng thì thôi, các đỉnh trong stacks closed là các đỉnh cần
tìm.
Câu 26. Xây dựng và cài đặt thuật toán biến đổi Hough.
Đáp án:
Mục đích của biến đổi Hough là để phát hiện ra đường thẳng và đường tròn, hoặc
đường bất kì. Thông thường nhất là dùng biến đổi Hough
để phát hiện đường thẳng.
Cho điểm xi, yi ở trong mặt phẳng x, y.
Phương trình đường thẳng y=ax+b.
Nếu đường thẳng đi qua điểm (xi,yi) thì nó sẽ là yi=axI +b.
Khi cho a, b thay đổi thì có rất nhiều đường thẳng đi qua
(xi,yi).
Ta có thêm một điểm (xj,yj) nữa thì cũng có vô số đường
thẳng đi qua (xj,yj).
Như vậy sẽ có một đường thẳng đi qua hai điểm (xi,yi) và (xj,yj).
Và đường thẳng đó sẽ có a, b giống nhau.
Yi= axi+b
Yj= axj+b
42
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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);
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));
}
FILE *fp;
_wfopen_s(&fp,L"LineHough.pgm",L"wb");
43
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Free2D((void **)Hough);
return;
44
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 27. Trình bày các bước lọc ảnh trong miền tần số.
Đáp án:
Lọc ảnh trong miền tần số gồm 7 bước sau đây:
Bước 1: Cho ảnh đầu vào f(x,y) có kích thước MxN. Mở rộng ảnh có kích thước là PxQ.
Cụ thể P=2M, Q=2N.
Bước 2: Thêm zero vào phần mở rộng, ta được ảnh fp(x,y).
Bước 3: Nhân fp(x,y) với (-1)x+y để dời F(0,0) vào tâm ảnh.
Bước 4: Biến đổi Fourier của ảnh ở Bước 3 ta được F(u,v).
Bước 5: Cho hàm lọc có giá trị thực H(u,v) đối xứng qua tâm (P/2,Q/2). Thực hiện phép
nhân
G(u,v) = F(u,v)H(u,v).
Bước 6: Thu được ảnh đã xử lý bằng biến đổi Fourier ngược, lấy phần thực và dời trở
lại gốc tọa độ
Bước 7: Bỏ phần đã mở rộng, ta thu được ảnh g(x,y) có kích thước MxN.
Biểu diễn bằng sơ đồ khối:
45
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 28. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần
số dùng bộ lọc lowpass lý tưởng.
Đáp án:
Lọc trong miền tần số được cho bằng phương trình:
trong đó:
D0 là tần số cắt.
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
46
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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));
// 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)
47
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
H[u][v] = 1;
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);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
Câu 29. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần
số dùng bộ lọc lowpass Butterworth.
Đáp án:
Lọc trong miền tần số được cho bằng phương trình:
48
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Trong đó :
D0 là tần số cắt
n : gọi là bậc bộ lọc
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
int x, y, u, v;
const int P = 1024;
const int Q = 1024;
double D0 = 10, Duv;
49
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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));
// 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);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
50
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 30. Xây dựng và cài đặt thuật toán làm trơn ảnh trong miền tần
số dùng bộ lọc lowpass Gauss.
Lọc trong miền tần số được cho bằng phương trình:
Trong đó:
: được gọi là độ lệch chuẩn
51
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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));
52
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
fft2d(FR,FI,P,Q,-1);
// 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);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
Câu 31. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số
dùng bộ lọc highpass lý tưởng.
Đáp án:
Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh
Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp:
53
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
trong đó:
D0 là tần số cắt.
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
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));
54
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
// 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;
}
// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
55
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
return;
}
Câu 32. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số
dùng bộ lọc highpass Butterworth.
Đáp án:
Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh
Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp:
trong đó:
n là bậc của bộ lọc, D0 là tần số cắt.
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
56
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Code:
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));
// 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));
57
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
Câu 33. Xây dựng và cài đặt thuật toán làm nét ảnh trong miền tần số
dùng bộ lọc highpass Gauss.
Đáp án:
Người ta dùng bộ lọc thông cao để làm tăng độ nét của ảnh
Bộ lọc thông cao (highpass) là hiệu của một và bộ lọc thông thấp:
58
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
trong đó:
D0 là tần số cắt.
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
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));
59
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
// 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));
}
// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
60
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Câu 34. Xây dựng và cài đặt thuật toán biến đổi Laplace trong miền
tần số.
Đáp án:
Ta có biến đổi Fourier của vi phân cấp n của hàm f(x)
Cụ thể biến đổi Fourier của vi phân cấp 2 của hàm một chiều là:
Mở rộng biến đổi fourier của vi phân cấp 2 của hàm hai chiều là:
vì j2 = -1
Vậy đạo hàm cấp 2 của ảnh là:
Đặt
Ta phải biến đổi H(u,v) để H(u,v) là đối xứng qua tâm của ảnh.
Sau đó ta dùng phép biến đổi Fourier ngược để được ảnh Laplace
Code:
void LaplaceFrequency(BYTE **f, BYTE **g)
{
61
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
62
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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;
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
Câu 35. Xây dựng và cài đặt thuật toán mặt nạ làm nhòe, lọc tăng
cường và lọc nâng tần số cao.
Đáp án:
Mặt nạ làm nhòe được cho bằng phương trình:
với HLP(u,v) là bộ lọc lowpass và F(u,v) là biến đổi Fourier của ảnh f.
63
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
hay
Biểu thức nằm trong cặp dấu ngoặc vuông được gọi là bộ lọc nâng tần số cao.
Tổng quát lọc nâng tần số cao được cho bằng phương trình:
trong đó k1 >= 0 điều khiển độ dời từ gốc và k2 >= 0 điều khiển sự tham gia của tần số
cao.
Cụ thể, bộ lọc highpass là bộ lọc Gauss có D0 = 40, k1 = 0.5, k2 = 0.75.
int x, y, u, v;
const int P = 1024;
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));
64
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
if ((x+y)%2 == 1)
FR[x][y] = -FR[x][y];
// Buoc 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
Câu 36. Xây dựng và cài đặt thuật toán lọc đồng hình.
Đáp án:
Ta có ảnh f(x,y) là tích của hai thành phần: độ chói và độ phản xạ.
65
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
với i là độ chói và r là độ phản xạ. Độ chói tham gia ở tần số thấp và độ phản xạ
tham gia ở tần số cao. Như vậy nếu ta muốn tăng độ tương phản và làm nét ảnh
thì phải giảm tần số thấp và nâng tần số cao.
Ta thấy 2 thành phần i và r được nhân với nhau nên không thể tách ra được.
Tuy nhiên ta định nghĩa:
khi đó:
Hay
Hàm lọc H(u,v) được cho sao cho có thể giảm tần số thấp và nâng tần số cao.
Xử lý trong miền tần số:
Do trước đó ta lấy logarit của ảnh nên bây giờ ta phải lấy ngược trở lại bằng
hàm mũ.
Ta có sơ đồ khối là:
66
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Người ta cho hàm lọc đồng hình H(u,v) như sau, để có thể nâng tần số cao và
giảm được tần số thấp.
Trong đó và
Phương trình của H(u,v) như sau:
D(u,v) là khoảng cách từ một điểm bất kì (u,v) đến tâm của ảnh
Cụ thể ta chọn:
Trong đó c là điều khiển độ dốc của hàm H(u,v).
Code:
void HomomorphicFiltering(BYTE **f, BYTE **g)
{
double **FR, **FI, **H, **gp;
67
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
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 6 Bien doi Fourier nguoc, lay phan thuc va nhan voi (-1)^(x+y)
fft2d(FR,FI,P,Q,1);
68
Đề thi Xử Lý Ảnh GV: Trần Tiến Đức
Free2D((void **)FR);
Free2D((void **)FI);
Free2D((void **)H);
Free2D((void **)gp);
return;
}
69