Giáo trình Xử lý hình ảnh - Phần 2 - Đỗ Năng Toàn

Chương 3:
BIÊN VÀ CÁC PHƯƠNG PHÁP PHÁT HIỆN BIÊN
3.1. GIỚI THIỆU
Biên là 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. 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. Tập hợp các điểm biên tạo nên biên hay đường bao của
đối tượng. Xuất phát từ cơ sở này người ta thường sử dụng hai phương
pháp phát hiện biên cơ bản:
Phát hiện biên trực tiếp: Phương pháp này làm nổi biên dựa vào sự
biến thiên mức xám của ảnh. Kỹ thuật chủ yếu dùng để phát hiện biên ở
đây là dựa vào sự biến đổi cấp xám theo hướng. Cách tiếp cận theo đạo
hàm bậc nhất của ảnh dựa trên kỹ thuật Gradient, nếu lấy đạo hàm bậc hai
của ảnh dựa trên biến đổi gia ta có kỹ thuật Laplace.
Phát hiện biên gián tiếp: Nếu bằng cách nào đó ta phân được ảnh
thành các vùng thì ranh giới giữa các vùng đó gọi là biên. Kỹ thuật dò biên
và phân vùng ảnh là hai bài toán đối ngẫu nhau vì dò biên để thực hiện phân
lớp đối tượng mà khi đã phân lớp xong nghĩa là đã phân vùng được ảnh và
ngược lại, khi đã phân vùng ảnh đã được phân lớp thành các đối tượng, do đó
có thể phát hiện được biên.
Phương pháp phát hiện biên trực tiếp tỏ ra khá hiệu quả và ít chịu ảnh
hưởng của nhiễu, song nếu sự biến thiên độ sáng không đột ngột, phương
pháp tỏ ra kém hiệu quả, phương pháp phát hiện biên gián tiếp tuy khó cài
đặt, song lại áp dụng khá tốt trong trường hợp này. 
pdf 45 trang thiennv 08/11/2022 3220
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Xử lý hình ảnh - Phần 2 - Đỗ Năng Toàn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfgiao_trinh_xu_ly_hinh_anh_phan_2_do_nang_toan.pdf

Nội dung text: Giáo trình Xử lý hình ảnh - Phần 2 - Đỗ Năng Toàn

  1. * Xác định cặp nền – vùng xuất phát Cặp nền vùng xuất phát được xác định bằng cách duyệt ảnh lần lượt từ trên xuống dưới và từ trái sang phải điểm đem đầu tiên gặp được cùng với điểm trắng trước đó (theo hướng 4) để tạo nên cặp nền vùng xuất phát. * Xác định cặp nền vùng tiếp theo Đầu vào: pt, dir Ví dụ: (3, 2) 4 Point orient []= {(1,0);(1;-1);(0;-1);(-1;-1);(-1;0);(-1,1);(0,1);(1,1)}; //Hàm tìm hướng có điểm đen gần nhất BYTE GextNextDir(POINT pt, BYTE dir) { BYTE pdir= (dir + 7)%8; do{ if(getpixel(pt. x+orient [pdir]. x,pt.y+orient [pdir]. y))==BLACK) return pdir; pdir = (pdir + 7) %8; }while(pdir ! = dir); return. ERR; //Điểm cô lập } //Gán giá trị cho bước tiếp theo pdir = GetNextDir(pt, dir); if(pdir==ERR) //Kiểm tra có là điểm cô lập không? return. ERR; //Điểm cô lập pt. x = pt. x + orient [pdir]. x; pt. y = pt. y + orient [pdir]. y ; Để tính giá trị cho hướng tiếp theo ta lập bảng dựa trên giá trị pdir đã tính được trước đó theo các khả năng có thể xảy ra: 42
  2. pdir Điểm trắng trước đó Trắng so với đen mới 0 1 2 1 2 4 2 3 4 3 4 6 4 5 6 5 6 0 6 7 0 7 0 2 ⇒ Do đó công thức để tính hướng tiếp theo sẽ là : dir= ((pdir+3)/ 2 * 2)%8 ; 43
  3. Chương 4: XƯƠNG VÀ CÁC KỸ THUẬT TÌM XƯƠNG 4.1. GIỚI THIỆU Xương được coi như hình dạng cơ bản của một đối tượng, với số ít các điểm ảnh cơ bản. Ta có thể lấy được các thông tin về hình dạng nguyên bản của một đối tượng thông qua xương. Một định nghĩa xúc tích về xương dựa trên tính continuum (tương tự như hiện tượng cháy đồng cỏ) được đưa ra bởi Blum (1976) như sau: Giả thiết rằng đối tượng là đồng nhất được phủ bởi cỏ khô và sau đó dựng lên một vòng biên lửa. Xương được định nghĩa như nơi gặp của các vệt lửa và tại đó chúng được dập tắt. a) Ảnh gốc b) Ảnh xương Hình 4.1. Ví dụ về ảnh và xương Kỹ thuật tìm xương luôn là chủ đề nghiên cứu trong xử lý ảnh những năm gần đây. Mặc dù có những nỗ lực cho việc phát triển các thuật toán tìm xương, nhưng các phương pháp được đưa ra đều bị mất mát thông tin. Có thể chia thành hai loại thuật toán tìm xương cơ bản: • Các thuật toán tìm xương dựa trên làm mảnh • Các thuật toán tìm xương không dựa trên làm mảnh 4.2. TÌM XƯƠNG DỰA TRÊN LÀM MẢNH 4.2.1. Sơ lược về thuật toán làm mảnh Thuật toán làm mảnh ảnh số nhị phân là một trong các thuật toán quan trọng trong xử lý ảnh và nhận dạng. Xương chứa những thông tin bất biến về cấu trúc của ảnh, giúp cho quá trình nhận dạng hoặc vectơ hoá sau này. 44
  4. Thuật toán làm mảnh là quá trình lặp duyệt và kiểm tra tất cả các điểm thuộc đối tượng. Trong mỗi lần lặp tất cả các điểm của đối tượng sẽ được kiểm tra: nếu như chúng thoả mãn điều kiện xoá nào đó tuỳ thuộc vào mỗi thuật toán thì nó sẽ bị xoá đi. Quá trình cứ lặp lại cho đến khi không còn điểm biên nào được xoá. Đối tượng được bóc dần lớp biên cho đến khi nào bị thu mảnh lại chỉ còn các điểm biên. Các thuật toán làm mảnh được phân loại dựa trên phương pháp xử lý các điểm là thuật toán làm mảnh song song và thuật toán làm mảnh tuần tự. Thuật toán làm mảnh song song, là thuật toán mà trong đó các điểm được xử lý theo phương pháp song song, tức là được xử lý cùng một lúc. Giá trị của mỗi điểm sau một lần lặp chỉ phụ thuộc vào giá trị của các láng giềng bên cạnh (thường là 8-láng giềng) mà giá trị của các điểm này đã được xác định trong lần lặp trước đó. Trong máy có nhiều bộ vi xử lý mỗi vi xử lý sẽ xử lý một vùng của đối tượng, nó có quyền đọc từ các điểm ở vùng khác nhưng chỉ được ghi trên vùng của nó xử lý. Trong thuật toán làm mảnh tuần tự các điểm thuộc đối tượng sẽ được kiểm tra theo một thứ tự nào đó (chẳng hạn các điểm được xét từ trái qua phải, từ trên xuống dưới). Giá trị của điểm sau mỗi lần lặp không những phụ thuộc vào giá trị của các láng giềng bên cạnh mà còn phụ thuộc vào các điểm đã được xét trước đó trong chính lần lặp đang xét. Chất lượng của thuật toán làm mảnh được đánh giá theo các tiêu chuẩn được liệt kê dưới đây nhưng không nhất thiết phải thoả mãn đồng thời tất cả các tiêu chuẩn. • Bảo toàn tính liên thông của đối tượng và phần bù của đối tượng • Sự tương hợp giữa xương và cấu trúc của ảnh đối tượng • Bảo toàn các thành phần liên thông • Bảo toàn các điểm cụt • Xương chỉ gồm các điểm biên, càng mảnh càng tốt • Bền vững đối với nhiễu • Xương cho phép khôi phục ảnh ban đầu của đối tượng • Xương thu được ở chính giữa đường nét của đối tượng được làm mảnh • Xương nhận được bất biến với phép quay. 45
  5. 4.2.2. Một số thuật toán làm mảnh Trong phần này điểm qua một số đặc điểm, ưu và khuyết điểm của các thuật toán đã được nghiên cứu. 1o. Thuật toán làm mảnh cổ điển là thuật toán song song, tạo ra xương 8 liên thông, tuy nhiên nó rất chậm, gây đứt nét, xoá hoàn toàn một số cấu hình nhỏ. 2o. Thuật toán làm mảnh của Toumazet bảo toàn tất cả các điểm cụt không gây đứt nét đối tượng. Tuy nhiên, thuật toán có nhược điểm là rất chậm, rất nhạy cảm với nhiễu, xương chỉ là 4-liên thông và không làm mảnh được với một số cấu hình phức tạp 3o. Thuật toán làm mảnh của Y.Xia dựa trên đường biên của đối tượng, có thể cài đặt theo cả phương pháp song song và tuần tự. Tốc độ của thuật toán rất nhanh. Nó có nhược điểm là gây đứt nét, xương tạo ra là xương giả (có độ dày là 2 phần tử ảnh). 4o. Thuật toán làm mảnh của N.J.Naccache và R.Shinghal. Thuật toán có ưu điểm là nhanh, xương tạo ra có khả năng khôi phục ảnh ban đầu của đối tượng. Nhược điểm chính của thuật toán là rất nhạy với nhiễu, xương nhận được phản ánh cấu trúc của đối tượng thấp. 5o. Thuật toán làm mảnh của H.E.Lu P.S.P Wang tương đối nhanh, giữ được tính liên thông của ảnh, nhưng lại có nhược điểm là xương tạo ra là xương 4-liên thông và xoá mất một số cấu hình nhỏ. 6o. Thuật toán làm mảnh của P.S.P Wang và Y.Y.Zhang dựa trên đường biên của đối tượng, có thể cài đặt theo phương pháp song song hoặc tuần tự, xương là 8-liên thông, ít chịu ảnh hưởng của nhiễu. Nhược điểm chính của thuật toán là tốc độ chậm. 7o. Thuật toán làm mảnh song song thuần tuý nhanh nhất trong các thuật toán trên, bảo toàn tính liên thông, ít chịu ảnh hưởng của nhiễu. Nhược điểm là xoá hoàn toàn một số cấu hình nhỏ, xương tạo ra là xương 4-liên thông. 4.3. TÌM XƯƠNG KHÔNG DỰA TRÊN LÀM MẢNH Để tách được xương của đối tượng có thể sử dụng đường biên của đối tượng. Với điểm p bất kỳ trên đối tượng, ta bao nó bởi một đường biên. Nếu như có nhiều điểm biên có cùng khoảng cách ngắn nhất tới p thì p nằm trên trục trung vị. Tập tất cả các điểm như vậy lập thành trục trung vị hay xương của đối tượng. Việc xác định xương được tiến hành thông qua hai bước: 46
  6. • Bước thứ nhất, tính khoảng cách từ mỗi điểm ảnh của đối tượng đến điểm biên gần nhất. Như vậy cần phải tính toán khoảng cách tới tất cả các điểm biên của ảnh. • Bước thứ hai, khoảng cách ảnh đã được tính toán và các điểm ảnh có giá trị lớn nhất được xem là nằm trên xương của đối tượng. 4.3.1. Khái quát về lược đồ Voronoi Lược đồ Voronoi là một công cụ hiệu quả trong hình học tính toán. Cho hai điểm Pi, Pj là hai phần tử của tập Ω gồm n điểm trong mặt phẳng. Tập các điểm trong mặt phẳng gần Pi hơn Pj là nửa mặt phẳng H(Pi, Pj) chứa điểm Pi và bị giới hạn bởi đường trung trực của đoạn thẳng PiPj. Do đó, tập các điểm gần Pi hơn bất kỳ điểm Pj nào có thể thu được bằng cách giao n-1 các nửa mặt phẳng H(Pi, Pj): V(Pi) = ∩ H(Pi, Pj) i≠j (i= 1, ,n) (4.1) Định nghĩa 4.1 [Đa giác/Sơ đồ Voronoi] Sơ đồ Voronoi của Ω là hợp của tất cả các V(Pi) Vor(Ω) = ∪ V(Pi) Pi∈Ω (là một đa giác) (4.2) Định nghĩa 4.2 [Đa giác Voronoi tổng quát] Cho tập các điểm Ω, đa giác Voronoi của tập con U của Ω được định nghĩa như sau: V(U) = {P| ∃v ∈ U, ∀w ∈ Ω \ U : d(P,v) < d(P,w)} = ∪ V(Pi) Pi ∈ U (4.3) 4.3.2. Trục trung vị Voronoi rời rạc Định nghĩa 4.3 [Bản đồ khoảng cách - Distance Map] Cho đối tượng S, đối với mỗi (x, y)∈S, ta tính giá trị khoảng cách map(x, y) với hàm khoảng cách d(.,.) như sau: ∀(x, y)∈S: map(x, y) = min d[(x, y), (xi, yi)] (4.4) i trong đó (xi, yi) ∈ B(S) - tập các điểm biên của S Tập tất cả các map(x, y), kí hiệu là DM(S), được gọi là bản đồ khoảng cách của S. Chú ý: Nếu hàm khoảng cách d(.,.) là khoảng cách Euclide, thì phương trình (4.4) chính là khoảng cách ngắn nhất từ một điểm bên trong đối tượng tới biên. Do đó, bản đồ khoảng cách được gọi là bản đồ khoảng cách Euclide EDM(S) của S. Định nghĩa trên được dùng cho cả hình rời rạc lẫn liên tục. 47
  7. Định nghĩa 4.4 [Tập các điểm biên sinh] Cho map(x, y) là khoảng cách ngắn nhất từ (x, y) đến biên (theo định nghĩa 4.3). Ta định nghĩa: map-1(x, y) = {p| p ∈B(S), d(p, (x, y)):=map(x, y)} Khi đó tập các điểm biên sinh ^B(S) được định nghĩa bởi: ^B(S) = ∪map-1(x, y), (x, y)∈ S (4.5) Do S có thể chứa các đường biên rời nhau, nên ^B(S) bao gồm nhiều tập con, mỗi tập mô tả một đường biên phân biệt: ^B(S)={B1(S), BN(S)} (4.6) Định nghĩa 4.5 [Trục trung vị Voronoi rời rạc (DVMA)] Trục trung vị Voronoi rời rạc được định nghĩa là kết quả của sơ đồ Voronoi bậc nhất rời rạc của tập các điểm biên sinh giao với hình sinh S : DVMA(^B(S)) = Vor(^B(S)) ∩ S (4.7) 4.3.3. Xương Voronoi rời rạc Định nghĩa 4.6 [Xương Voronoi rời rạc - DiscreteVoronoi Skeleton] Xương Voronoi rời rạc theo ngưỡng T, kí hiệu là SkeDVMA(^B(S),T) (hoặc Ske(^B(S),T)) là một tập con của trục trung vị Voronoi: SkeDVMA(^B(S),T)= {(x,y)| (x,y)∈DVMA(^B(S)), Ψ(x,y) > T} (4.8) Ψ: là hàm hiệu chỉnh. Dễ thấy nếu ngưỡng T càng lớn thì càng thì số lượng điểm tham gia trong xương Vonoroi càng ít (Hình 4.2). a) b) c) d) Hình 4.2. Xương Voronoi rời rạc ảnh hưởng của các hàm hiệu chỉnh khác nhau. (a) Ảnh nhị phân. (b) Sơ đồ Voronoi. (c) Hiệu chỉnh bởi hàm Potential, T=9.0. (d) Hiệu chỉnh bởi hàm Potential, T=18.0 48
  8. 4.3.4. Thuật toán tìm xương Trong mục này sẽ trình bày ý tưởng cơ bản của thuật toán tìm xương và mô tả bằng ngôn ngữ tựa Pascal. Tăng trưởng: Việc tính toán sơ đồ Voronoi được bắt đầu từ một điểm sinh trong mặt phẳng. Sau đó điểm sinh thứ hai được thêm vào và quá trình tính toán tiếp tục với đa giác Voronoi đã tìm được với điểm vừa được thêm vào đó. Cứ như thế, quá trình tính toán sơ đồ Voronoi được thực hiện cho đến khi không còn điểm sinh nào được thêm vào. Nhược điểm của chiến lược này là mỗi khi một điểm mới được thêm vào, nó có thể gây ra sự phân vùng toàn bộ các đa giác Voronoi đã được tính. Chia để trị: Tập các điểm biên đầu tiên được chia thành hai tập điểm có kích cỡ bằng nhau. Sau đó thuật toán tính toán sơ đồ Voronoi cho cả hai tập con điểm biên đó. Cuối cùng, người ta thực hiện việc ghép cả hai sơ đồ Voronoi trên để thu được kết quả mong muốn. Tuy nhiên, việc chia tập các điểm biên thành hai phần không phải được thực hiện một lần, mà được lặp lại nhiều lần cho đến khi việc tính toán sơ đồ Voronoi trở nên đơn giản. Vì thế, việc tính sơ đồ Voronoi trở thành vấn đề làm thế nào để trộn hai sơ đồ Voronoi lại với nhau. Thuật toán sẽ trình bày ở đây là sự kết hợp của hai ý tưởng ở trên. Tuy nhiên, nó sẽ mang nhiều dáng dấp của thuật toán chia để trị. Hình 4.3 minh hoạ ý tưởng của thuật toán này. Mười một điểm biên được chia thành hai phần (bên trái: 1- 6, bên phải: 7-11) bởi đường gấp khúc δ, và hai sơ đồ Voronoi tương ứng Vor(SL) và Vor(SR). Để thu được sơ đồ Vornonoi Vor(SL ∪ SR), ta thực hiện việc trộn hai sơ đồ trên và xác định lại một số đa giác sẽ bị sửa đổi do ảnh hưởng của các điểm bên cạnh thuộc sơ đồ kia. Mỗi phần tử của δ sẽ là một bộ phận của đường trung trực nối hai điểm mà một điểm thuộc Vor(SL) và một thuộc Vor(SR). Trước khi xây dựng δ, ta tìm ra phần tử đầu và cuối của nó. Nhìn vào hình trên, ta nhận thấy rằng cạnh δ1 và δ5 là các tia. Dễ nhận thấy rằng việc tìm ra các cạnh đầu và cuối của δ trở thành việc tìm cạnh vào tα và cạnh ra tω. δ 3 1 tα 7 CH(SL) 1 11 CH(S ) 6 R 4 9 2 10 t 5 ω 8 δ5 Hình 4.3. Minh hoạ thuật toán trộn hai sơ đồ Voronoi 49
  9. Sau khi đã tìm được tα và tω, các điểm cuối của tα được sử dụng để xây dựng phần tử đầu tiên của δ (δ1 trong hình trên). Sau đó thuật toán tìm điểm giao của δ với Vor(SL) và Vor(SR). Trong ví dụ trên, δ đầu tiên giao với V(3). Kể từ đây, các điểm nằm trên phần kéo dài δ sẽ gần điểm 6 hơn điểm 3. Do đó, phần tử tiếp theo δ2 của δ sẽ thuộc vào đường trung trực của điểm 6 và điểm 7. Sau đó điểm giao tiếp theo của δ sẽ thuộc và Vor(SL); δ bây giờ sẽ đi vào V(9) và δ2 sẽ được thay thế bởi δ3. Quá trình này sẽ kết thúc khi δ gặp phần tử cuối δ5. Trên đây chỉ là minh hoạ cho thuật trộn hai sơ đồ Voronoi trong chiến lược chia để trị. Tuy nhiên, trong thuật toán sẽ trình bày ở đây thì sự thực hiện có khác một chút. Tập các điểm ảnh không phải được đưa vào ngay từ đầu mà sẽ được quét vào từng dòng một. Giả sử tại bước thứ i, ta đã thu được một sơ đồ Voronoi gồm i-1 hàng các điểm sinh Vor(Si-1). Tiếp theo, ta quét lấy một hàng Li các điểm ảnh từ tập các điểm biên còn lại. Thực hiện việc tính sơ đồ Voronoi Vor(Li) cho hàng này, sau đó trộn Vor(Si-1) với Vor(Li). Kết quả ta sẽ được một sơ đồ mới, và lại thực hiện việc quét hàng Li+1 các điểm sinh còn lại v.v Quá trình này sẽ kết thúc khi không còn điểm biên nào để thêm vào sơ đồ Voronoi. Do Vor(Li) sẽ có dạng răng lược (nếu Li có k điểm thì Vor(Li) sẽ gồm k-1 đường thẳng đứng), nên việc trộn Vor(Si-1) với Vor(Li) có phần đơn giản hơn. v5 p8 p9 v2 p10 v δ p6 v p 1 tω 4 v3 7 tα p5 p4 v6 Các điểm thuộc p1 p2 p3 S i-1 Hình 4.4. Minh hoạ thuật toán thêm một điểm biên vào sơ đồ Voronoi Giải thuật trên có thể được mô tả bằng ngôn ngữ tựa Pascal như sau: Procedure VORONOI (*Si: Tập các điểm của i dòng quét đầu tiên, 0 <= i <=iMAX, Vor(Si) sơ đồ Vorronoi của Si *) 50
  10. Begin i:=0; Si:=rỗng; While (i<imax ∧ Si ⊂ straight_line) do Begin (*Khởi tạo sơ đồ Voronoi cho đến khi nó chứa ít nhất một đỉnh*) increment i; GetScanLine Li; Vor(Si) = VoroPreScan(Vor(Si-1, Li)); End While (i < imax) do Begin Increment i; GetScanLine Li; Vor(Li) := các đường trung trực sinh bởi các điểm sinh thuộc Li Vor(Si) := VoroLink(Vor(Si-1), Vor(Li)); End End. Giả sử xét trên hệ toạ độ thực. Ảnh vào được quét từ dưới lên. Toạ độ y (biến i) tương ứng với từng dòng quét được tăng dần theo từng dòng. Trong thủ tục trên, hàm quan trọng nhất là hàm VoroLink, hàm này thực hiện việc trộn sơ đồ Voronoi của Li-1 dòng đã được quét trước đó với sơ đồ Voronoi của dòng hiện tại thứ i. Trong vòng lặp trên, hàm VoroPreScan là một biến thể của hàm VoroLink, có nhiệm vụ khởi tạo sơ đồ Voronoi và thoát khỏi vòng lặp ngay khi nó thành lập được sơ đồ Voronoi chứa ít nhất một đỉnh. Hàm VoroLink thực hiện việc trộn hai sơ đồ Voronoi Vor(Si-1) và Vor(Li) với nhau để thành Vor(Si). 51
  11. Chương 5: CÁC KỸ THUẬT HẬU XỬ LÝ 5.1. RÚT GỌN SỐ LƯỢNG ĐIỂM BIỂU DIỄN 5.1.1. Giới thiệu Rút gọn số lượng điểm biểu diễn là kỹ thuật thuộc phần hậu xử lý. Kết quả của phần dò biên hay trích xương thu được 1 dãy các điểm liên tiếp. Vấn đề đặt ra là hiệu có thể bá bớt các điểm thu được để giảm thiểu không quan lưu trữ và thuận tiện cho việc đối sách hay không. Bài toán: Cho đường cong gồm n điểm trong mặt phẳng (x1, y1), (x2, y2) (xn,yn). Hãy bỏ bớt 1 số điểm thuộc đường cong sao cho đường cong mới nhận được là (Xi1; Yi1), (Xi2; Yi2) (Xim; Yim) “gần giống” với đường cong ban đầu. * Một số độ đo “gần giống” + Chiều dài (chiều rộng) của hình chữ nhật nhá nhất chứa đường cong + Khoảng cách lớn nhất từ đường cong đến đoạn thẳng nối 2 đầu mót của đường cong + Tỷ lệ giữa chiều dài và chiều rộng của hình chữ nhật nhá nhất chứa đường con + Số lần đường cong cắt đoạn thẳng nối 2 đầu mót 5.1.2. Thuật toán Douglas Peucker 5.1.2.1. Ý tưởng h > θ θ Hình 5.1. Đơn giản hóa đường công theo thuật toán Douglas Peucker Ý tưởng cơ bản của thuật toán Douglas-Peucker là xét xem khoảng cách lớn nhất từ đường cong tới đoạn thẳng nối hai đầu mút đường cong (xem Hình 5.1) có lớn hơn ngưỡng θ không. Nếu điều này đúng thì điểm xa nhất được giữ lại làm điểm chia đường cong và thuật toán được thực hiện 52
  12. tương tự với hai đường cong vừa tìm được. Trong trường hợp ngược lại, kết quả của thuật toán đơn giản hoá là hai điểm đầu mút của đường cong. Thuật toán Douglas-Peucker: • Bước 1: Chọn ngưỡng θ. • Bước 2: Tìm khoảng cách lớn nhất từ đường cong tới đoạn thẳng nối hai đầu đoạn đường cong h. • Bước 3: Nếu h ≤ θ thì dừng. • Bước 4: Nếu h > θ thì giữ lại điểm đạt cực đại này và quay trở lại bước 1. Nhận xét: Thuật toán này tỏ ra thuận lợi đối với các đường cong thu nhận được mà gốc là các đoạn thẳng, phù hợp với việc đơn giản hoá trong quá trình véctơ các bản vẽ kỹ thuật, sơ đồ thiết kế mạch in v.v 5.1.2.2. Chương trình //Hàm tính đường cao từ dinh đến đoạn thẳng nối hai điểm dau, cuoi float Tinhduongcao (POINT dau, POINT cuoi, POINT dinh) { floot h; ⎢⎢tính đường cao returm h ; } //Hàm đệ quy nhằm đánh dấu loại bỏ các điểm trong đường cong void DPSimple(POINT *pLINE,int dau,int cuoi,BOOL *chiso,float θ) { int i, index = dau; float h, hmax = 0; for(i = dau + 1; i hmax) { hmax = h; index = i; 53
  13. } } if(hmax ≤ θ) for(i= dau + 1; i < cuoi, i++) chiso[i] = FALSE; else { DPSimple(PLINE, dau, index, chiso, θ); DPSimple(PLINE, index, cuoi, chiso, θ) ; } } //Hàm rút gọn số lượng điểm DouglasPeucker int DouglasPeucker(POINT *pLINE, int n, float θ) { int i, j; BOOL chiso [MAX_PT]; for(i = 0; i < m; i++) //Tất cả các điểm được giữ lại chiso[i] = TRUE; DPSimple(pLINE, 0, n – 1, chiso, θ); for(i = j = 0; i < n; i ++) if (chiso [i] ==TRUE) pLINE[j++] = pLINE[i]; return j; } 5.1.3. Thuật toán Band width 5.1.3.1. Ý tưởng Trong thuật toán Band Width, ta hình dung có một dải băng di chuyển từ đầu mút đường cong dọc theo đường cong sao cho đường cong nằm trong di băng đó cho đến khi có điểm thuộc đường cong chạm vào biên của dải băng, điểm này sẽ được giữ lại. Quá trình này được thực hiện với phần còn lại của đường cong bắt đầu từ điểm vừa tìm được cho đến khi hết đường cong. Cụ thể như sau: 54
  14. P3 P2 P4 di dk P1 P5 Hình 5.2. Đơn giản hóa đường cong với thuật toán Band Width Bắt đầu bằng việc xác định điểm đầu tiên trên đường cong và coi đó như là một điểm chốt (P1). Điểm thứ ba (P3) được coi là điểm động. Điểm giữa điểm chốt và điểm động (P2) là điểm trung gian. Ban đầu khoảng cách từ điểm trung gian đến đoạn thẳng nối điểm chốt và điểm động được tính toán và kiếm tra. Nếu khoảng cách tính được này nhỏ hơn một ngưỡng θ cho trước thì điểm trung gian có thể bỏ đi, tiến trình tiếp tục với điểm chốt là điểm chốt cũ, điểm trung gian là điểm động cũ và điểm động là điểm kế tiếp sau điểm động cũ. Trong trường hợp ngược lại, khoảng cách tính được lớn hơn ngưỡng θ cho trước thì điểm trung gian sẽ được giữ lại, tiến trình tiếp tục với điểm chốt là điển trung gian, điểm trung gian là điểm động cũ và điểm động là điểm kế tiếp sau điểm động cũ. Tiến trình được lặp cho đến hết đường cong (Hình 5.2 minh họa thuật toán Band-Width). Thuật toán Band-Width: • Bước 1: Xác định điểm đầu tiên trên đường cong và coi đó như là một điểm chốt (P1). Điểm thứ ba (P3) được coi là điểm động. Điểm giữa điểm chốt và điểm động (P2) là điểm trung gian. • Bước 2: Tính khoảng cách từ điểm trung gian đến đoạn thẳng nối hai điểm chốt và điểm động. • Bước 3: Kiểm tra khoảng cách tìm được nếu nhỏ hơn một ngưỡng θ cho trước thì điểm trung gian có thể bỏ đi. Trong trường hợp ngược lại điểm chốt chuyển đến điểm trung gian. • Bước 4: Chu trình được lặp lại thì điểm trung gian được chuyển đến điểm động và điểm kế tiếp sau điểm động được chỉ định làm điểm động mới Nhận xét: Thuật toán này tăng tốc độ trong trường hợp đường ống chứa nhiều điểm, điều đó có nghĩa là độ lệch giữa các điểm trong đường thẳng là nhỏ, hay độ dày nét của đường được véctơ hoá là mảnh. 55
  15. 5.1.3.2. Chương trình //Hàm tính đường cao từ đỉnh đến đoạn thẳng nối hai điểm dau, cuoi float Tinhduongcao(POINT dau, POINT cuoi, POINT dinh) { floot h; ⎢⎢tính đường cao returm h ; } //Hàm đệ quy nhằm đánh dấu loại bỏ các điểm trong đường cong void BWSimple(POINT *pLINE, int chot, int tg, BOOL *chiso, float θ, int n) { if(Tinhduongcao(pLINE[chot], pLINE[tg+1], pLINE[tg]) ≤ θ) chiso[tg] = 0; else chot = tg; tg = tg + 1 if(tg < n - 1) BWSimple (pLINE, chot, tg, chiso, θ, n) ; } //Hàm rút gọn số lượng điểm BandWidth int BandWidth(POINT *pLINE, int n, floot θ) { int i, j; BOOL chiso [MAX_PT]; for (i = 0; i < n; i++) chiso[i]= TRUE; //Tất cả các điểm được giữ lại BWSimple(pLINE, 0, 1, chiso, θ, n); for(i= j= 0; i < n; i++) if(chiso [i]== TRUE) 56