Có gì mới?
Diễn đàn ứng dụng xử lý ảnh công nghiệp trong sản xuất

Đây là một tin nhắn khách mời. Đăng ký một tài khoản miễn phí ngay hôm nay để trở thành một thành viên! Sau khi đăng nhập, bạn sẽ có thể tham gia trang web này bằng cách thêm các chủ đề và bài đăng của riêng bạn, cũng như kết nối với các thành viên khác thông qua hộp thư đến riêng của bạn!

C/C++ Thuật toán Sobel

Ngôn ngữ C/C++

hieule

Thành viên BQT
CTO
Admin
Dev Leader
Machine Vision Expert
Green Industry
Tham gia
21/10/2023
Bài viết
24
Điểm
1,039
Nơi ở
Việt Nam
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ả:

Sobel2.png
 
Sửa lần cuối:
Top