thuật toán sử dụng mặt nạ để làm rõ đường biên trong ảnh

12 6K 41
thuật toán sử dụng mặt nạ để làm rõ đường biên trong ảnh

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Ai mún có thêm code thì gửi mail cho mình nhé: ledinhchung.mta@gmail.com

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 đườ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. 1 Đị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ọngsự 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ênbiê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 yxfdyyxf fy y yxf dx yxfydxxf fx x yxf ),(),(),( ),(),(),( −+ ≈= ∂ ∂ −+ ≈= ∂ ∂ 2 trong đó 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. ( ) ( ) ( ) ( )        −+≈ ∂ ∂ −+≈ ∂ ∂ yxfyxf y f yxfyxf 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: ),(),(),( 22 0 jigjigAjig yx +== . Hướng của đạo hàm được tính: ) ),( ),( arctan(),( jig jig ji y x r = ϕ 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 H x = -2 0 2 3 -1 0 1 -1 -2 -1 H y = 0 0 0 1 2 1 1.1.3Toán tử Prewitt sử dụng 2 mặt nạ -1 0 1 H x = -1 0 1 -1 0 1 -1 -1 -1 H y = 0 0 0 1 1 1 Nhận xét: Các toán tử Gradient làm việc khá tốt khi độ sáng thay đổi khá 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à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) 4 Hệ 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 G x và G y . 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 ),(),(),( 22 0 jigjigAjig yx +== để 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) = |G x | + |G y | 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 0 0 , 45 0 , 90 0 , 135 0 , 180 0 , 225 0 , 270 0 , 315 0. 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ạ: 5 5 -3 5 5 5 H 1 = 5 0 -3 H 2 = -3 0 -3 -3 -3 -3 -3 -3 -3 -3 5 5 -3 -3 5 H 3 = -3 0 5 H 4 = -3 0 5 -3 -3 -3 -3 -3 5 5 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 yxfyxf xx f xx f −+ ∂ ∂ ≈       ∂ ∂ ∂ ∂ = ∂ ∂ [ ] [ ] ),1(),(2),1( ),1(),(),(),1( yxfyxfyxf yxfyxfyxfyxf −+−+≈ −−−−+≈ Tương tự: ( ) ),()1,( 2 2 yxfyxf yy f yy f −+ ∂ ∂ ≈         ∂ ∂ ∂ ∂ = ∂ ∂ 6 [ ] [ ] )1,(),(2)1,( )1,(),(),()1,( −+−+≈ −−−−+≈ yxfyxfyxf yxfyxfyxfyxf 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ạ : 010 141 010 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:           − −− − =           −−− −− −−− =           − −− − = 121 242 121 H 111 181 111 H 010 141 010 H 321 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; 7 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 = 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]; //tinh gia tri Gradient alpha = Math.Sqrt(Gx * Gx + Gy * Gy); //alpha =(Math .Abs (Gx )+Math .Abs (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; 8 } } 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] + 9 3 * 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; } 10 [...]... 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ạ. .. 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 12 ...} 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++) { . 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. . 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 H x = -2 0 2 3 -1 0 1 -1 -2 -1 H y = 0 0 0 1 2 1 1.1. 3Toán tử Prewitt sử dụng 2 mặt nạ -1 0 1 H x = -1 0 1 -1. 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á

Ngày đăng: 29/03/2014, 08:18

Từ khóa liên quan

Mục lục

  • I.Phát biểu bài toán

  • II.Hướng giải quyết bài toán

    • 1.Phương pháp Gradient

      • 1.1Kỹ thuật Gradient

        • 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.1.3Toán tử Prewitt sử dụng 2 mặt nạ

        • 2.Phương pháp Laplace

        • III.Thuật toán

          • 1.Gradient

            • 1.1:Gradient sử dụng toán tử Sobel

            • 1.2:Gradient sử dụng toán tử Prewitt

            • 1.3:Gradient sử dụng toán tử Robert

            • 1.4:Gradient sử dụng toán tử Kirsh

            • 2.Kỹ thuật Laplace

            • IV.Chương trình Demo

            • IV.Kết luận

Tài liệu cùng người dùng

Tài liệu liên quan