Thuật toán lấy cạnh xử lý ảnh
Trong tuần này, mình sẽ giới thiệu về thuật toán tìm cạnh trong xử lý ảnh. Show What is an edge ?Trong ảnh số, những điểm ảnh có cường độ ảnh sáng thay đổi mạnh so với các điểm xung quanh thường được gọi là các điểm cạnh (edge point). Cạnh (edge) là tập hợp các điểm cạnh tạo nên một hình dạng có ý nghĩa nào đó liên quan đến thông tin hình dạng và cấu trúc của đối tượng trong ảnh, ví dụ đường bao của một khuôn mặt, cấu trúc vành mũ, ... Tách cạnh là quá trình trích rút các thông tin tin cạnh bằng các phép toán xử lý ảnh. Ví dụ như ta có một bức ảnh và ta lấy một đường kẻ ngang rồi ta sẽ lấy mức xác theo đường thằng đó, ta sẽ thấy được sự thay đổi mức xám ở các ví trị. GradientKhi nhắc đến sự thay đổi đổi thì ta thường nhắc tới Gradient. Gradient của hàm cho biết hàm tăng mạnh như thế nào.
Gradient không chỉ tính bằng đạo hàm bậc 1, ta cũng thể tính bằng đạo hàm bậc. Với độ biến đổi của mức sáng bên trên ta tính được đạo hàm bậc 1, bậc 2 và công thức tương ứng như sau: Edge detection using derivativesTa có 2 cách để phát hiện cạnh sử dụng đạo hàm là:
Đạo hàm trong không gian 2 chiều được tính như sau: Tuy nhiên để áp dụng cho ảnh số, việc xấp xỉ hóa đạo hàm của hàm rời rạc là cần thiết. Xấp xỉ đạo hàm bậc nhất hàm gradient được tính như sau (1): Độ lớn của Gradient cho biết cường đọi của cạnh tại điểm (x,y)(x,y) : Trong ảnh số, ta có các bước để tính gradient như sau:
Nếu ta tính gradient bằng phương pháp thông thường theo kiểu duyệt theo hàng và cột rồi tính thì rất mất thời gian, có cách nào làm nhanh hơn không ? Và ta có cách dùng phép toán sử dụng kernel ta học ở bài trước để tính toán. Various kernels used to compute the gradientỞ đây, mình sẽ giới thiệu cho các bạn những kernel được sử dụng rộng rãi nhất trong xử lý ảnh. Đầu tiền ta có cái nhìn tổng quan về các kernel được giới thiệu như sau: Pixel Difference masksKernel này thể hiện rõ công thức đạo hàm bậc 1 theo x và theo y bên trên (1) với -1 đằng sau số 1 vì ở đây ta thực hiện phép toán Convolution nên nó đảo ngược . Ví dụ của một ảnh sử dụng kernel trên như sau: Kết quả cho ra không được tốt cho lắm, vì thế ta sẽ tìm các hiểu tìm hiểu các kernel khác cho kết quả tốt hơn. Robert maskRoberts masks tính gradient theo đường chéo giữa 2 điểm. Kernel đạo hàm theo x và y như sau: Kết quả với cùng một ảnh gốc ở ví dụ pixel difference masks với Robert mask như sau: Ta thấy kết quả sẽ đậm hơn theo đường chéo mà không phải ngang hay dọc như ở kernel trước, Kernel kích thước 2 x 2 thường khó để cài đặt bởi tính toán của chính không rõ ràng. Do đó, cửa sổ kích thước 3 x 3 thường được sử dụng. Prewitt maskPrewitt mask được định nghĩa như sau: Ta có một ví dụ sử dụng Prewitt mask. Sobel maskMột biến thể khác của Prewitt mask sử dụng tăng trọng số của điểm trung tâm lên 2 là Sobel mask. Giá trị 2 được sử dụng để làm mượt ảnh và cũng để đánh giá điểm trung tâm quan trọng hơn các điểm khác. Và đây là kết quả khi sử dụng Sobel mask với bức ảnh đầu vào: Laplace gradientCác kernel ở trên đều tính gradient dựa trên đạo hàm bậc 1, với gradient đạo hàm bậc 2 theo cả hai chiều hay còn gọi là Laplace trong miền liên tục được nghĩa như sau: Trong miền liên tục, công thức trên được xấp xỉ thành: Ta có Laplace mask hay đại diện cho hàm H bên trên được nghĩa là: Kết quả khi sử dụng Laplace mask khi sử dụng Laplace mask: Ta thấy kết quả đẹp hơn nhiều ở ví trị đầu,... nhưng vẫn chưa tốt vì còn lấy các giá trị ở phần nền cỏ tạo ra các chấm rời rạc vì nhiệm vụ của tách cạnh là lấy ra những cạnh liền mạch có giá trị. Ta có cái nhìn tổng quan khi áp dụng 5 kernel khác nhau để tách cạnh như sau: More advanced edge detectionLaplacian of a Gaussian (LoG) edge detectionKhông như các thuật toán trước tính gradient sử dụng các phép toán tuyến tính, thuật toán này tính theo hàm gaussian. Các bước thực hiện thuật toán như sau:
Ví dụ về các bước thực hiện của LoG edge như sau: Canny edge detectionPhương pháp tách cạnh Canny sử dụng thuật toán có nhiều bước để tìm cạnh trong ảnh. Nó được phát triển bởi John F. Canny vào năm 1986. Hoạt động của phương pháp này có thể tóm tắt như sau:
Trong opencv, ta muốn sử dụng thuật toán Canny chỉ cần sử dung câu lệnh đơn giản sau:
Với ảnh cameraman.png bạn có thể tải về máy: Và kết quả nó sẽ như sau: Bạn có hiểu rõ hơn các tham số của hàm Canny() trong tài liệu cv2.Canny Tài liệu tham khảo
|