Ai mún có thêm code thì gửi mail cho mình nhé: ledinhchung.mta@gmail.com
Trang 1
MỤC LỤC
ĐỒ ÁN MÔN HỌC XỬ LÍ ẢNH
Đề bài(9):Tìm hiểu các thuật toán sử dụng mặt nạ để làm rõ đường biên trong
ảnh.
I.Phát biểu bài toán
Biên là một vấn đề quan trọng trong trích chọn đặc điểm nhằm tiến tới hiểu ảnh Cho đến nay chưa có định nghĩa chính xác về biên, trong mỗi ứng dụng người
ta đưa ra các độ đo khác nhau về biên, một trong các độ đo đó là độ đo về sự thay đổi đột ngột về cấp xám.
Một điểm ảnh có thể coi là điểm biên nếu ở đó có sự thay đổi đột ngột về mức xám.Tập hợp các điểm biên tạo thành biên hay đường bao của ảnh
Ví dụ: Đối với ảnh đen trắng, một điểm được gọi là điểm biên nếu nó là điểm đen có ít nhất một điểm trắng bên cạnh
Trang 2Định nghĩa toán học của biên ở trên là cơ sở cho các kỹ thuật phát hiện biên Điều quan trọng là sự biến thiên giữa các điểm ảnh là nhỏ, trong khi đó biến thiên
độ sáng của điểm biên (khi qua biên) lại khá lớn Xuất phát từ cơ sở này người ta thường sử dụng 2 phương pháp phát hiện biên sau:
• Phương pháp phát hiện biên trực tiếp: phương pháp này nhằm làm nổi
đường biên dựa vào biến thiên về giá trị độ sáng của điểm ảnh Kỹ thuật chủ yếu là dùng kỹ thuật đạo hàm Nếu lấy đạo hàm bậc nhất của ảnh ta có phương pháp Gradient, nếu lấy đạo hàm bậc 2 ta có kỹ thuật Laplace.
• Phương pháp gián tiếp: Nếu bằng cách nào đấy ta phân ảnh thành các vùng
thì đường phân ranh giữa các vùng đó chính là biên.
Trong phạm vi bài viết chỉ tìm hiểu phương pháp thứ nhất:phương pháp phát hiện biên trực tiếp theo 2 phương pháp Gradient và Laplace.
II.Hướng giải quyết bài toán
Từ định nghĩa về điểm biên và biên đã nêu ở trên người ta thường sử dụng hai phương pháp: phát hiện biên trực tiếp(sẽ được trình bày trong bài viết này) và phương pháp phát hiện biên gián tiếp.Trong phương pháp phát hiện biên trực tiếp hai kỹ thuật được sử dụng là Gradient và Laplace.
1.Phương pháp Gradient
Cơ sở toán học:Gradient là phương pháp dò biên cục bộ dựa vào cực đại của đạo hàm Gradient là một Vector có các thành phần biểu thị tốc độ thay đổi giá trị điểm ảnh theo hai hướng x và y.Các thành phần của Gradient được tính :
dy
y x f dy y x f fy y
y
x
f
dx
y x f y dx x f fx x
y
x
f
) , ( ) ,
( )
,
(
) , ( ) , (
)
,
(
− +
≈
=
∂
∂
− +
≈
=
∂
∂
Trang 3trong đó dx và dy là khoảng cách (tính bằng số điểm ảnh )theo 2 hướng x và y Thường dx=dy=1.
− +
≈
∂
∂
− +
≈
∂
∂
y x f y
x f y f
y x f y x f x f
, 1
,
, ,
1
Biên độ của Gradient được tính tại điểm (i,j) kí hiệu là g(i,j)được tính theo công
thức:
) , ( )
, ( )
,
( i j A0 g 2 i j g 2 i j
Hướng của đạo hàm được tính:
) ) , (
) , ( arctan(
) , (
j i g
j i g j
i
y
x
ϕ
Trong kỹ thuật Gradient người ta chia thành 2 kỹ thuật:Kỹ thuật Gradient dùng toán tử Gradient đạo hàm theo 2 hướng và Kỹ thuật Gradient lấy đạo hàm theo 8 hướng chính:Bắc,Nam,Đông,Tây,Đông Bắc,Tây Bắc,Đông Nam,Tây Nam
1.1Kỹ thuật Gradient
Kỹ thuật này dùng một cặp mặt nạ H1 và H2 trực giao(theo hai hướng vuông góc).Các toán tử đạo hàm được dùng khá nhiều.Sau đây là một số toán tử tiêu biểu
1.1.1Toán tử Robert:dùng 2 mặt nạ.
1.1.2Toán tử Sobel:dùng 2 mặt nạ:
-1 0 1
Trang 4-1 0 1
1.1.3Toán tử Prewitt sử dụng 2 mặt nạ
-1 0 1
Nhận xét:
Các toán tử Gradient làm việc khá tốt khi độ sáng thay đổi khá rõ nét khi qua biên Khi sự thay đổi độ sáng chậm miền chuyển tiếp trải rộng thì phương pháp Gradient tỏ ra kém hiệu quả
Trong 3 toán tử được thực hiện ở trên, toán tử Prewitt đơn giản hơn Sobel nhưng lại nhạy cảm với nhiễu hơn, một vấn đề quan trong khi giải quyết với đạo hàm Toán tử Robert đơn giản nhất nhưng không tốt hơn 2 toán tử trên vì nó nhạy cảm với nhiễu nhất
Mặt khác, toán tử Robert (mask cỡ 2*2) rất khó được thi hành vì không có trung tâm rõ ràng
Còn đối với Sobel và Prewitt thì sử dụng mask 3*3
Prewitt: Gx = z7 + z8 + z9) - (z1+ z2 + z3)
Gy = (z3 + z6 + z9) – (z1 + z4 + z7)
Sobel: Gx = (z7 + 2z8 + z9) - (z1+ 2z2 + z3)
Gy = (z3 + 2z6 + z9) – (z1 + 2z4 + z7)
Trang 5Hệ số 2 được dùng để đạt được vài sự làm phẳng bằng cách đưa ra tầm quan trọng hơn tới điểm trung tâm Thuật toán Prewitt và Sobel là trong số cái tốt nhất được sử dụng trong thực hành cho việc tính toán gradient số Masks Prewitt đơn giản hơn để thi hành hơn mask Sobel, nhưng Sobel lại có đặc điểm chặn nhiễu mạnh hơn một tí.
Thêm nữa, khi mask Prewitt và Sobel được dùng để tính Gx và Gy Những mask này đưa ra kết quả đẳng hướng chỉ cho cạnh ngang và dọc vì thế ngay cả khi chúng
ta sử dụng công thức
) , ( )
, ( )
, ( i j A0 g 2 i j g 2 i j
để tính gradient, kết quả chỉ đẳng hướng chỉ cho cạnh trong những hướng đó.
Một tiếp cận được sử dụng thường xuyên để xấp xỉ gradient bởi giá trị tuyệt đối:
G(i,j) = |Gx| + |Gy|
Nhưng trong trường hợp này, cả hai công thức trên cùng cho cùng kết quả.
1.2 Toán tử La bàn: sử dụng 8 mặt nạ theo 8 hướng 00, 450, 900, 1350, 1800, 2250,
2700, 3150
Có nhiều toán tử la bàn khác nhau ở đây chỉ xét toán tử tiêu biểu Kirsh sử dụng 8 mặt nạ:
Trang 6
Biên độ của Gradient được tính theo phương pháp này là:
G(i,j)=Max( |g(i,j)| ,i=1,2,3…8).
2.Phương pháp Laplace
Khi mức xám thay đổi chậm,miền chuyển tiếp trải rộng thì phương pháp
Gradient tỏ ra không hiệu quả khi đó phương pháp Laplace sử dụng đạo hàm bậc hai đạt hiệu quả cao hơn.
Toán tử Laplace được định nghĩa:
2
2 2
2
2
y
f x
f
f
∂
∂ +
∂
∂
=
∇
( ( 1 , ) ( , ) )
2
2
y x f y x f x x
f x x
f
− +
∂
∂
≈
∂
∂
∂
∂
=
∂
∂
) , 1 ( ) , ( 2 ) , 1 (
) , 1 ( ) , ( )
, ( ) , 1 (
y x f y x f y x f
y x f y x f y x f y x f
− +
− +
≈
−
−
−
− +
≈
Tương tự:
( ( , 1 ) ( , ) )
2
2
y x f y
x f y y
f y
y
f
− +
∂
∂
≈
∂
∂
∂
∂
=
∂
∂
Trang 7[ ] [ ]
) 1 , ( ) , ( 2 )
1
,
(
) 1 , ( ) , ( )
, ( ) 1
,
(
− +
− +
≈
−
−
−
− +
≈
y x f y x f y
x
f
y x f y x f y x f y
x
f
Từ đó toán tử Laplace được tính:
∇2 f= f(x+1,y) + f(x,y+1) - 4f(x,y) + f(x-1,y) + f(x,y-1)
=>Mặt nạ :
0 1 0
1 4 1
0 1 0
H
−
=
Trong thực tế có nhiều mặt nạ được sử dụng.Sau đây là một số mặt nạ tiêu biểu:
−
−
−
−
=
−
−
−
−
−
−
−
−
=
−
−
−
−
=
1 2 1
2 4
2
1 2 1
H 1 1 1
1 8
1
1 1 1 H
0 1 0
1 4
1
0 1 0
III.Thuật toán
1.Gradient
1.1:Gradient sử dụng toán tử Sobel
int[,] M;Bitmap bmp;
int h = bmp.Height;
Trang 8int w = bmp.Width;
int[,] result = new int[h, w];
int Gx, Gy;
double alpha;
for (int i = 1; i < h - 1; i++)
{
for (int j = 1; j < w - 1; j++)
{
//huong x
Gx = M[i - 1, j + 1] + 2 * M[i, j + 1] + M[i + 1, j + 1];
Gx -= M[i - 1, j - 1] + 2 * M[i, j - 1] + M[i + 1, j -1]; //huong y
Gy = M[i + 1, j - 1] + 2 * M[i + 1, j] + M[i + 1, j + 1];
Gy -= M[i - 1, j - 1] + 2 * M[i - 1, j] + M[i - 1, j +1];
alpha = Math.Sqrt(Gx * Gx + Gy * Gy);
if (alpha > teta)
result[i, j] = 255;
else
result[i, j] = 0;
}
}
1.2:Gradient sử dụng toán tử Prewitt
int[,] M ;Bitmap bmp;
int h = bmp.Height;
int w = bmp.Width;
int[,] result = new int[h, w];
int Gx, Gy;
double alpha;
int threshold;
for (int i = 1; i < h - 1; i++)
{
for (int j = 1; j < w - 1; j++)
{
Gx = M[i - 1, j + 1] + M[i, j + 1] + M[i + 1, j + 1];
Gx -= M[i - 1, j - 1] + M[i, j - 1] + M[i + 1, j - 1];
Gy = M[i + 1, j - 1] + M[i + 1, j] + M[i + 1, j + 1];
Gy -= M[i - 1, j - 1] + M[i - 1, j] + M[i - 1, j + 1];
alpha = Math.Sqrt(Gx * Gx + Gy * Gy);
if (alpha > threshold)
result[i, j] = 255;
else
result[i, j] = 0;
Trang 9}
}
1.3:Gradient sử dụng toán tử Robert
int[,] M ; Bitmap bmp;
int h = bmp.Height;
int w = bmp.Width;
int[,] result = new int[h, w];
int Gx, Gy;
double alpha;
int threshold;
threshold;
for (int i = 0; i < (h - 1); i++)
{
for (int j = 0; j < (w - 1); j++)
{
Gx = M[i + 1, j + 1] - M[i, j];
Gy = M[i, j + 1] - M[i + 1, j];
alpha = Math.Sqrt(Gx * Gx + Gy * Gy);
if (alpha > threshold)
result[i, j] = 255;
else
result[i, j] = 0;
}
}
1.4:Gradient sử dụng toán tử Kirsh
int[,] M = laydulieuanh.Apply(bmp);
int h = bmp.Height;
int w = bmp.Width;
int[,] result = new int[h, w];
int Gx, Gy;
double alpha;
int threshold;
threshold = (int)teta;
int[] A = new int[8];
int MaxA;
for (int i = 1; i < h - 1; i++)
{
for (int j = 1; j < w - 1; j++)
{
A[0] = 5 * M[i - 1, j - 1] + 5 * M[i - 1, j] + 5 * M[i - 1, j + 1];
A[0] -= 3 * M[i, j - 1] + 3 * M[i, j + 1] + 3 * M[i + 1, j - 1] +
Trang 103 * M[i + 1, j] + 3 * M[i + 1, j + 1];
A[1] = -3 * M[i - 1, j - 1] + 5 * M[i - 1, j] + 5 * M[i - 1, j + 1]; A[1] -= 3 * M[i, j - 1] - 5 * M[i, j + 1] + 3 * M[i + 1, j - 1] +
3 * M[i + 1, j] + 3 * M[i + 1, j + 1]; A[2] = -3 * M[i - 1, j - 1] - 3 * M[i - 1, j] + 5 * M[i - 1, j + 1]; A[2] -= 3 * M[i, j - 1] - 5 * M[i, j + 1] + 3 * M[i + 1, j - 1] +
3 * M[i + 1, j] - 5 * M[i + 1, j + 1]; A[3] = -3 * M[i - 1, j - 1] - 3 * M[i - 1, j] - 3 * M[i - 1, j + 1]; A[3] -= 3 * M[i, j - 1] - 5 * M[i, j + 1] + 3 * M[i + 1, j - 1] –
5 * M[i + 1, j] - 5 * M[i + 1, j + 1]; A[4] = -3 * M[i - 1, j - 1] - 3 * M[i - 1, j] - 3 * M[i - 1, j + 1];
A[4] -= 3 * M[i, j - 1] + 3 * M[i, j + 1] - 5 * M[i + 1, j - 1] –
5 * M[i + 1, j] - 5 * M[i + 1, j + 1]; A[5] = -3 * M[i - 1, j - 1] - 3 * M[i - 1, j] - 3 * M[i - 1, j + 1];
A[5] -= -5 * M[i, j - 1] + 3 * M[i, j + 1] - 5 * M[i + 1, j - 1] –
5 * M[i + 1, j] + 3 * M[i + 1, j + 1]; A[6] = 5 * M[i - 1, j - 1] - 3 * M[i - 1, j] - 3 * M[i - 1, j + 1]; A[6] -= -5 * M[i, j - 1] + 3 * M[i, j + 1] - 5 * M[i + 1, j - 1] +
3 * M[i + 1, j] + 3 * M[i + 1, j + 1]; A[7] = 5 * M[i - 1, j - 1] + 5 * M[i - 1, j] - 3 * M[i - 1, j + 1]; A[7] -= -5 * M[i, j - 1] + 3 * M[i, j + 1] + 3 * M[i + 1, j - 1] +
3 * M[i + 1, j] + 3 * M[i + 1, j + 1];
MaxA = Math.Abs(A[0]);
for (int jj = 0; jj < 8; jj++)
{
if (Math.Abs(A[jj]) >= MaxA)
MaxA = Math.Abs(A[jj]);
}
if (MaxA > threshold)
result[i, j] = 255;
else
result[i, j] = 0;
}
Trang 11}
2.Kỹ thuật Laplace
int[,] M ;
Bitmap bmp;
int h = bmp.Height;
int w = bmp.Width;
int[,] result = new int[h, w];
int Gx, Gy;
double alpha;
for (int i = 1; i < h - 1; i++)
{
for (int j = 1; j < w - 1; j++)
{
//huong x
Gx = 4 * M[i, j] - M[i, j + 1] - M[i + 1, j] - M[i, j - 1] - M[i - 1, j]; //tinh gia tri Gradient
Gy = 0;
alpha = Math.Sqrt(Gx * Gx + Gy * Gy);
if (alpha > teta)
result[i, j] = 255;
else
result[i, j] = 0; } }
IV.Chương trình Demo
Trang 12Chức năng chính:-Tách biên của ảnh theo nhiều phương pháp khác nhau.
-Lưu ảnh sau khi đã tách biên.
IV.Kết luận
Các phương pháp phát hiện biên sử dụng các mặt nạ tương đối hiệu quả,khả năng tách biên khá tốt.Tuy nhiên tùy vào từng ảnh sáng tối khác nhau mà lựa chọn phương pháp, mặt nạ cho hiệu quả ngoài ra giá trị ngưỡng để phân biệt vùng biên
và vùng ảnh cũng rất quan trọng.Vì vậy việc lựa chọn giá trị biên hay mặt nạ nào là hết sức quan trọng ảnh hưởng trực tiếp đến việc phát hiện biên của ảnh.