Thuật toán Sobel là một thuật toán sử dụng trong xử lý ảnh để phát hiện độ dốc của pixel tại mỗi điểm ảnh. Nó được sử dụng chủ yếu để tìm biên của đối tượng trong ảnh. Thuật toán này dựa trên việc tính đạo hàm bậc nhất của ảnh theo hướng dọc và ngang.
Mô hình toán học của thuật toán Sobel:
Cho một ma trận ảnh đen trắng I, ta có thể tính đạo hàm bậc nhất theo hướng ngang ([imath]G_x [/imath]) và theo hướng dọc ([imath]G_y [/imath]) bằng cách sử dụng hai ma trận lọc Sobel ([imath]S_x[/imath] và
[imath]S_y[/imath]):
[imath]G_x = I \ast S_x[/imath]
[imath]G_y = I \ast S_y [/imath]
Trong đó ∗ là phép toán tích chập (convolution), và ma trận lọc Sobel có thể được định nghĩa như sau:
[imath]\begin{array}{c} S_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} \end{array} [/imath]
[imath]\begin{array}{c} S_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} \end{array} [/imath]
Sau đó, độ dốc tổng cộng ([imath] G[/imath]) tại mỗi điểm ảnh có thể được tính bằng cách sử dụng công thức:
[imath]G = \sqrt{G_x^2 + G_y^2} [/imath]
Dưới đây là một đoạn mã minh họa cách sử dụng thuật toán Sobel trong OpenCV C++ để phát hiện biên của một ảnh:
Đoạn mã trên sử dụng hàm cv::Sobel của OpenCV để tính độ dốc theo hướng ngang và dọc, sau đó kết hợp chúng để tạo ra ảnh phát hiện biên.
Kết quả:
Mô hình toán học của thuật toán Sobel:
Cho một ma trận ảnh đen trắng I, ta có thể tính đạo hàm bậc nhất theo hướng ngang ([imath]G_x [/imath]) và theo hướng dọc ([imath]G_y [/imath]) bằng cách sử dụng hai ma trận lọc Sobel ([imath]S_x[/imath] và
[imath]S_y[/imath]):
[imath]G_x = I \ast S_x[/imath]
[imath]G_y = I \ast S_y [/imath]
Trong đó ∗ là phép toán tích chập (convolution), và ma trận lọc Sobel có thể được định nghĩa như sau:
[imath]\begin{array}{c} S_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} \end{array} [/imath]
[imath]\begin{array}{c} S_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} \end{array} [/imath]
Sau đó, độ dốc tổng cộng ([imath] G[/imath]) tại mỗi điểm ảnh có thể được tính bằng cách sử dụng công thức:
[imath]G = \sqrt{G_x^2 + G_y^2} [/imath]
Dưới đây là một đoạn mã minh họa cách sử dụng thuật toán Sobel trong OpenCV C++ để phát hiện biên của một ảnh:
Đoạn mã trên sử dụng hàm cv::Sobel của OpenCV để tính độ dốc theo hướng ngang và dọc, sau đó kết hợp chúng để tạo ra ảnh phát hiện biên.
Kết quả:

Sửa lần cuối: