78
Đề 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: 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: 1 S R (0, 0) L-1 L-1

De thi xu ly anh

Embed Size (px)

Citation preview

Page 1: De thi xu ly anh

Đề 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:

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];

1

S

R(0,0)

L-1

L-1

Page 2: De thi xu ly anh

Đề 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:

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=

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;

}

2

Intensity

log

L-1

L-1(0,0)

Negative

Page 3: De thi xu ly anh

Đề 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 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=

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;

}

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:

3

γ=0,4

γ=1

γ=1,5

S

R

s

L-1

L-1r

(r2,s2)

(r1,s1)

Page 4: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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à:

=

Y= (x-x1)+y1

Đoạn I: điểm (0,0) và (r1,s1)

S= r

Đoạn II: điểm (r1,s1) và (r2,s2)

S= (r-r1)+s1

Đoạn III: điểm (r2,s2) và (L-1,L-1)

S= (r-r2)+s2

trong đó: (r1,s1) và (r2,s2) được cho trước.

Code:

void PiecewiseLinear(BYTE **f, BYTE **g)

4

Page 5: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

{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.

Cân bằng histogram được cho bằng phương trình:

s=T(r)=(L-1)

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:

5

Page 6: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

sk=T(rk)=(L-1)

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.

6

Page 7: De thi xu ly anh

Đề 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

pr(rj)=

sk=T(rk)=

Cho histogram mong muốn pz(zi)

Biến đổi histogram mong muốn.

vk=G(zk)=

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:

7

Page 8: De thi xu ly anh

Đề 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= (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 taz1 = 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)

pz[z] = (pz4-pz3)/(z4-z3)*(z-z3) + pz3;

8

Page 9: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

else if (z<z5)pz[z] = (pz5-pz4)/(z5-z4)*(z-z4) + pz4;

elsepz[z] = (pz6-pz5)/(z6-z5)*(z-z5) + pz5;

// Chuan hoa pz sao cho tong xac suat bang 1sum = 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 anhHistogram(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 histogramBYTE 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

Page 10: De thi xu ly anh

Đề 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;

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]);

}

10

Page 11: De thi xu ly anh

Đề 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ó:

mean=

variance=

= độ lệch chuẩn =

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 = =7.21

11

Page 12: De thi xu ly anh

Đề 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

Variance=10/4=2.5

Deviation= =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)=

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);return m;

12

Nếu msxy<=k0mG và k1 G<= sxy<=k2 G

Nếu ngược lại

Page 13: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

}

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];

elseg[x][y] = f[x][y];

}

Free2D((void **)w);return;

}

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.

13

Page 14: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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)=

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++)

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;

14

1 1 11 1 11 1 1 x

1 2 12 4 21 2 1

Page 15: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;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;

15

Page 16: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

}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 :

=grad(f)= =

trong đó:

: đạo hàm cấp một theo x

16

Page 17: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

:đạo hàm cấp một theo y

Đạo hàm cấp một theo x được định nghĩa là :

=f(x+1,y)-f(x,y)

Đạo hàm cấp một theo y được định nghĩa là :

=f(x,y+1) – f(x,y)

Độ lớn của vectơ gradient f kí hiệu là :

M(x,y)=mag( f)=

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

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= =(z7+2z8+z9)-(z1+2z2+z3)

17

Page 18: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

và gy= =(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;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;

}

18

Page 19: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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];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;}

19

Page 20: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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(x+1) + f(x-1) – 2f(x)

Định nghĩa đạo hàm cấp hai của hàm hai biến là:

= +

: 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:

=f(x+1,y)+f(x-1,y)-2f(x,y)

Đạo hàm cấp hai theo hướng y:

=f(x,y+1)+f(x,y-1)-2f(x,y)

Đạo hàm cấp hai của ảnh là:

=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 :

20

Page 21: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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[ (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:

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]= 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;

21

Page 22: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;

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 Laplaceint min;min = temp[0][0];int max;max = temp[0][0];

for (x=0; x<M; x++)

22

Page 23: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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â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:

- Làm nhòe ảnh.- Lấy ảnh gốc trừ với ảnh đã làm nhòe ta được một ảnh mới gọi là mặt nạ làm nhòe.- Cộng mặt nạ làm nhòe với ảnh gốc.

Kí hiệu: : là ảnh đã làm nhòe,

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) -

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 :

gauss(x,y)=

23

Page 24: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

: độ 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;

}

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;

}

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 GaussGauss = (double **)Alloc2D(m,n,sizeof(double));for (x=-m/2; x<=m/2; x++)

for (y=-n/2; y<=n/2; y++)

24

Page 25: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;}

25

Page 26: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Ch ng 9 g m câu 6 câu t câu 14 đ n câu 19ươ ồ ừ ế

Câu 14. Xây d ng và cài đ t thu t toán ự ặ ậ Erosion.Đáp án:

Erosion là bào mòn.

Cho A và B là 2 tập trong Z, bào mòn A bởi B kí hiệu là .

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){

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;

26

Page 27: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;}

Câu 15. Xây d ng và cài đ t thu t toán ự ặ ậ Dilation.Đáp án:

Dilation là giãn nở

Cho A và B là 2 tập trong Z, giãn nở A bởi B kí hiệu là được định nghĩa là:

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){

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;

}

27

Page 28: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

else {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;}

Câu 16. Xây d ng và cài đ t thu t toán Opening.ự ặ ậĐáp án:

Opening của tập A bởi phần tử cấu trúc B ký hiệu là , được định nghĩa như sau:

Opening thường dùng để xóa nhiễu.

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);

28

Page 29: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Dilation(temp,M,N,B,m,n,g,FALSE);Free2D((void **)temp);return;

}

Câu 17. Xây d ng và cài đ t thu t toán Closing.ự ặ ậĐáp án:

Closing của tập A bởi phần tử cấu trúc B ký hiệu là A • B và được định nghĩa như sau:

A • B = (A B) B

Closing thường dùng để lấp những 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;

}

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 trừ đi ảnh

đã bào mòn, ta sẽ được biên.

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++)

29

Page 30: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

if (f[x][y] < 128)f[x][y] = 0;

elsef[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;

}

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:

30

Page 31: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Thuật toán ngừng khi Xk của bước trước và sau không thay đổi.

Ghi chú: X là ảnh có kích thước bằng ả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;

31

Page 32: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

elsec[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;

32

Page 33: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

}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;

}

33

Page 34: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Ch ng 10 g m 7 câu t câu 20 đ n câu 26ươ ồ ừ ế

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.

Điểm ảnh cần lấy có

Khi lập trình có 4 đầu ra, ta lấy điểm ảnh có Rmax.

Lưu ý tổng các hệ số trong mặt nạ đều = 0

Mục đích là khi quét mặt nạ qua vùng ảnh có độ sáng đồng đều thì đầu ra sẽ = 0.

Code:

void LineDetectionLaplace(BYTE **f, BYTE **g){

int **temp;int x, y, r;

34

Page 35: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 1int 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;

}

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.

35

Page 36: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Gọi gx là ảnh đạo hàm theo hướng x.

gy là ảnh đạo hàm theo hướng y.

Ảnh độ lớn:

hay dùng công thức xấp xỉ.

Ảnh của hướng (direction) hay là ảnh góc pha:

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;

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;

36

Page 37: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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

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

}

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

được gọi là phương sai

Ta dùng hàm Gauss để làm trơn ảnh và lọc nhiễu.

Suy ra đạo hàm cấp 2 của Gauss

Đạ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.

37

Page 38: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Ta thường cho = 4 và kích thước của bộ lọc là n = 6

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:

Ta dùng hàm Gauss để làm trơn ảnh và xóa nhiễu:

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:

38

Page 39: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Bước 1: dùng mặt nạ Gauss làm trơn ảnh. 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 1: Tính M(x,y) và α(x,y)

Bước 2: Tạo ảnh nhị phân g, theo công thức sau đây.

TM là ngưỡng, A là góc của cạnh cần quan tâm, TA là phạm vi góc

Bước 3: Quét từng dòng qua ảnh và lấp những lổ trống, nếu chiều dài của lổ trống đó không vượt quá K.

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.

39

Page 40: De thi xu ly anh

Đề 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.

40

Page 41: De thi xu ly anh

Đề 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

41

Page 42: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Dùng mặt phẳng a, b không biết được kích thước ảnh là bao nhiêu vì cho ảnh chạy từ -∞, ∞ và b: -∞, ∞

Để khắc phục a, b có thể ra tới ∞, thì ta chuyển phương trình đường thẳng qua tọa độ cực:

Do các điểm ảnh có tọa độ x dương, y dương nên chạy từ -900

đến 900 và phạm vi của là , trong đó D là khoảng

cách xa nhất giữa 2 góc đối diện ở 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));

}

42

Page 43: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;

}

43

Page 44: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Ch ng 4 g m 10 câu t câu 27 đ n câu 36ươ ồ ừ ế

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:

44

Page 45: De thi xu ly anh

Đề 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 đó F(u,v) là biến đổi Fourier của ảnh f.

Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp).

Có 3 loại bộ lọc thông thấp thông dụng:

Bộ lọc lowpass lý tưởng, Butterworth, Gauss.

Bộ lọc lowpass lý tưởng không thể chế tạo được bằng phần cứng do quán tính của linh kiện điện tử. Tuy nhiên ta có thể lập trình bằng phần mềm. Bộ lọc lowpass lý tưởng đượ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

Đồ thị của bộ lọc lowpass lý tưởng

45

Page 46: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Lowpass ly tuongfor (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;

46

Page 47: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

elseH[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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

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:

Trong đó F(u,v) là biến đổi Fourier của ảnh f.

Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp).

Có 3 loại bộ lọc thông thấp thông dụng:

Bộ lọc lowpass lý tưởng, Butterworth, Gauss.

Bộ lọc lowpass Butterworth được cho bằng phương trình

47

Page 48: De thi xu ly anh

Đề 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

Đồ thị của bộ lọc 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;

48

Page 49: De thi xu ly anh

Đề 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));

// Buoc 1 va 2 Mo rong anh va them zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Lowpass Butterworthfor (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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

49

Page 50: De thi xu ly anh

Đề 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 đó F(u,v) là biến đổi Fourier của ảnh f.

Để làm trơn trong miền tần số ta dùng bộ lọc lowpass (thông thấp).

Có 3 loại bộ lọc thông thấp thông dụng:

Bộ lọc lowpass lý tưởng, Butterworth, Gauss.

Bộ lọc lowpass Gauss được cho bằng phương trình

Trong đó:

: được gọi là độ lệch chuẩn

: được gọi là phương sai.

Cho nên ta được:

với 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

50

Page 51: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

Đồ thị của bộ lọc 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 zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

51

Page 52: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

// Lowpass Gaussfor (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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

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:

Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss.

Bộ lọc highpass lý tưởng được cho bằng phương trình:

52

Page 53: De thi xu ly anh

Đề 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

Đồ thị của bộ lọc highpass lý tưởng

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 zerofor (x=0; x<M; x++)

for (y=0; y<N; y++)

53

Page 54: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Highpass idealfor (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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

54

Page 55: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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:

Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss.

Bộ lọc highpass Butterworth được cho bằng phương trình:

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

Đồ thị của bộ lọc highpass Butterworth:

Code:

55

Page 56: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (x=0; x<M; x++)

for (y=0; y<N; y++)if (gp[x][y] > 255)

56

Page 57: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;}

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:

Ta có 3 loại bộ lọc highpass thông dụng là: lý tưởng, Butterworth, Gauss.

Bộ lọc highpass Gauss đượ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

Đồ thị của bộ lọc highpass Gauss:

57

Page 58: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H

// Highpass Gaussfor (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));

58

Page 59: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

}

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];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

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à:

59

Page 60: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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){

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 zerofor (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

60

Page 61: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 Fourierfft2d(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];

elsegp[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;

61

Page 62: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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

elseg[x][y] = (int)r;

}

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:

Trong miền tần số thì

với HLP(u,v) là bộ lọc lowpass và F(u,v) là biến đổi Fourier của ảnh f.

là biến đổi Fourier ngược.

Nâng cao độ nét của ảnh dùng mặt nạ làm nhòe được cho bằng phương trình:

g(x,y) = f(x,y) + k*gmask(x,y)

Nếu k=1 ta gọi là mặt nạ làm nhòe. Nếu k>1 ta gọi là lọc tăng cường.

Biểu diễn trong miền tần số:

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:

62

Page 63: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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.

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 zerofor (x=0; x<M; x++)

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

// Buoc 3 Doi vao tam anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*H// High Frequency Emphasisfor (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);

63

Page 64: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

for (x=0; x<P; x++)for (y=0; y<Q; y++)

if ((x+y)%2 == 1)gp[x][y] = -FR[x][y];

elsegp[x][y] = FR[x][y];

// Buoc 7 Bo phan them vaofor (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;}

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ạ.

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 đó:

64

Page 65: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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ố:

Suy ra ảnh đã xử lý:

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à:

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.

65

Page 66: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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;

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

66

Page 67: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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 anhfor (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 Fourierfft2d(FR,FI,P,Q,-1);

// Buoc 5 Tao H va F*Hdouble 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];

elsegp[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 vaofor (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);

67

Page 68: De thi xu ly anh

Đề thi Xử Lý Ảnh GV: Trần Tiến Đức

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

return;}

68