Contours là một trong những công cụ mạnh mẽ nhất trong OpenCV, được sử dụng rộng rãi trong xử lý ảnh và thị giác máy tính. Chúng giúp xác định hình dạng, phát hiện đối tượng và phân đoạn hình ảnh. Bài viết này sẽ giới thiệu chi tiết về contours, cách sử dụng chúng trong OpenCV và các ứng dụng thực tế.
Contours Là Gì?
Định Nghĩa
Contours là đường viền xung quanh các đối tượng trong hình ảnh. Nói cách khác, contours là một đường không đứt quãng, dọc theo biên giới của các đối tượng với nền. Chúng giúp xác định hình dạng và kích thước của các đối tượng trong hình ảnh.
Tính Năng Chính
- Phát Hiện Đối Tượng: Giúp xác định và phân đoạn các đối tượng trong hình ảnh.
- Đo Lường Kích Thước: Tính toán diện tích, chu vi và các thuộc tính hình học khác của đối tượng.
- Xác Định Hình Dạng: Phân loại các đối tượng dựa trên hình dạng của chúng.
Tìm Kiếm Và Vẽ Contours
Bước 1: Đọc Và Hiển Thị Hình Ảnh
Đầu tiên, chúng ta sẽ đọc và hiển thị hình ảnh sử dụng OpenCV.
import cv2 import matplotlib.pyplot as plt # Đọc hình ảnh image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE) # Hiển thị hình ảnh plt.imshow(image, cmap='gray') plt.title('Original Image') plt.show()
Bước 2: Chuyển Đổi Hình Ảnh Sang Định Dạng Nhị Phân
Để tìm kiếm contours, hình ảnh cần được chuyển đổi sang định dạng nhị phân.
# Chuyển đổi hình ảnh sang nhị phân ret, binary = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) # Hiển thị hình ảnh nhị phân plt.imshow(binary, cmap='gray') plt.title('Binary Image') plt.show()
Bước 3: Tìm Kiếm Contours
Sử dụng hàm cv2.findContours()
để tìm kiếm các contours trong hình ảnh.
# Tìm kiếm contours contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) print(f'Number of contours found: {len(contours)}')
Bước 4: Vẽ Contours
Sử dụng hàm cv2.drawContours()
để vẽ các contours trên hình ảnh gốc.
# Tạo bản sao của hình ảnh gốc để vẽ contours contour_image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) # Vẽ contours cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 3) # Hiển thị hình ảnh với contours plt.imshow(contour_image) plt.title('Contours') plt.show()
Các Ứng Dụng Thực Tế Của Contours
Ứng Dụng 1: Phát Hiện Đối Tượng
Contours được sử dụng rộng rãi để phát hiện các đối tượng trong hình ảnh, từ nhận diện biển số xe, phát hiện khuôn mặt, đến đếm số lượng đối tượng.
Ứng Dụng 2: Đo Lường Kích Thước
Contours giúp đo lường kích thước của các đối tượng trong hình ảnh, bao gồm diện tích, chu vi, và các thuộc tính hình học khác. Điều này hữu ích trong các ứng dụng như kiểm tra chất lượng sản phẩm và phân tích hình dạng.
# Tính toán diện tích và chu vi của contour đầu tiên area = cv2.contourArea(contours[0]) perimeter = cv2.arcLength(contours[0], True) print(f'Area: {area}') print(f'Perimeter: {perimeter}')
Ứng Dụng 3: Xác Định Hình Dạng
Contours giúp xác định và phân loại các đối tượng dựa trên hình dạng của chúng. Ví dụ, bạn có thể sử dụng contours để phân loại các đối tượng hình tròn, hình chữ nhật, hoặc hình tam giác.
# Tìm kiếm contours đơn giản approx = cv2.approxPolyDP(contours[0], 0.01 * perimeter, True) if len(approx) == 3: shape = "Triangle" elif len(approx) == 4: shape = "Rectangle" else: shape = "Circle" print(f'Shape: {shape}')
Tối Ưu Hóa Và Cải Thiện Kết Quả
Tối Ưu Hóa Tìm Kiếm Contours
Khi tìm kiếm contours, bạn có thể sử dụng các phương pháp khác nhau để tối ưu hóa kết quả. Ví dụ, cv2.RETR_EXTERNAL
chỉ tìm kiếm các contours ngoài cùng, giúp giảm số lượng contours và tập trung vào các đối tượng lớn.
Lọc Contours Dựa Trên Kích Thước
Bạn có thể lọc các contours dựa trên diện tích hoặc chu vi để loại bỏ các đối tượng không mong muốn hoặc nhiễu.
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 100] print(f'Number of filtered contours: {len(filtered_contours)}')
Kết Luận
Contours là một công cụ mạnh mẽ trong OpenCV, cung cấp nhiều khả năng cho việc xử lý ảnh và phân tích hình dạng. Bằng cách hiểu rõ và sử dụng hiệu quả contours, bạn có thể phát triển nhiều ứng dụng thị giác máy tính hữu ích và mạnh mẽ.
Hãy bắt đầu thực hành với các ví dụ trên để làm quen với contours và áp dụng chúng vào các bài toán thực tế của bạn.
Tham Khảo
Để hiểu rõ hơn về contours và các kỹ thuật liên quan trong OpenCV, bạn có thể tham khảo các tài liệu và nguồn sau:
Những nguồn tham khảo này sẽ cung cấp thêm kiến thức và công cụ để bạn nâng cao kỹ năng của mình trong việc sử dụng OpenCV và các ứng dụng của nó.