4.2.5.1. Phơng pháp.
B
ớc 1 : Tìm các điểm biên. Kiểm tra điểm biên nào có thể xóa đợc thì thực hiện xóa.
B
ớc 2 : Thuật toán kiểm tra điểm (x,y) có là điểm biên hay không, thực hiện I(x,y) =
1 nếu I(x,y)≥θ
BOOL IsBorder(int x, int y) { If (Image[x-1][y] ==0 || Image[x][y-1] ==0 || Image[x-1][y-1] ==0 || Image[x][y] ==0) return TRUE; return FALSE; }
Điều kiện xoá điểm biên phải đảm bảo:
Không làm mất tính chất lu thông.
Không tạo ra lỗ hổng.
Không làm mất điểm cụt.
Các điểm còn lại thuộc trục trung vị.
Bất biến với phép quay tịnh tiến.
Với các điều kiện trên, ta có thể xoá các điểm P nh sau: A: các điểm có giá trị bằng P.
B: các điểm có giá trị khác P. *: các điểm tuỳ ý.
B
ớc 3 : Thuật toán kiểm tra điều kiện xóa của điểm (x,y) đợc thực hiện nh sau:
BOOL IsDeletable(int x, int y)
{
BOOL p1 = image[x - 1, y - 1], int p2 = image[x, y - 1],
p3 = image[x + 1, y - 1], int p4 = image[x - 1, y],
p5 = image[x + 1, y], p6 = image[x - 1, y + 1],
p7 = image[x, y + 1], p8 = image[x + 1, y + 1];
if ((p1 + p2 + p3) == 0 && (p6 * p7 * p8 > 0)) return TRUE; if ((p1 + p4 + p6) == 0 && (p3 * p5 * p8 > 0)) return TRUE; if ((p1 + p2 + p4) == 0 && (p5 * p7 * p8 > 0)) return TRUE; if ((p6 + p7 + p8) == 0 && (p1 * p2 * p3 > 0)) return TRUE; if ((p3 + p5 + p8) == 0 && (p1 * p4 * p6 > 0)) return TRUE; if ((p5 + p7 + p8) == 0 && (p1 * p2 * p4 > 0)) return TRUE; if ((p2 + p3 + p5) == 0 && (p4 * p6 * p7 > 0)) return TRUE;
if ((p4 + p6 + p7) == 0 && (p2 * p3 * p5 > 0)) return TRUE; return FALSE;
}
B
ớc 4 : Việc tìm xơng đợc thực hiện nh sau:
void MakeBone()
{ BOOL Manh = FALSE;
Stack S;
S.Empty(); // Khởi tạo ngăn xếp rỗng
while (!Manh)
{ Manh = TRUE;
for (int i=0; i<M; i++) for (int j=0; j<N; j++)
if (IsBorder(i,j))
if (IsDeletable(i,j)) // Đẩy các điểm có thể xoá đợc { S.Push(i,j); //vào ngăn xếp
Manh = FALSE; }
while (!S.IsEmpty) //Xoá tất cả các điểm trong ngăn xếp
{ S.Pop(i,j); Image[i][j] = 0; } } } 4.2.5.2 Kết quả thực thi.
Hình 4.5: ảnh đã đợc tìm xơng