Thị giác máy tính với OpenCV-Python Bài 4, Phần 7: Đường viền trong hình ảnh

Thị giác máy tính với OpenCV-Python Bài 4, Phần 7: Đường viền trong hình ảnh

Thị giác máy tính với OpenCV-Python Bài 4, Phần 7: Đường viền trong hình ảnh

14:03 - 04/01/2022

Trong phần này chúng ta sẽ tìm hiểu đường viền hình ảnh thông qua các hàm cv2.findContours() và cv2.drawContours().

Thị giác máy tính với OpenCV-Python Bài 7 Phần 3: Nhận diện khuôn mặt
Thị giác máy tính với OpenCV-Python Bài 7 Phần 2: Phát hiện người đi bộ trong video
Thị giác máy tính với OpenCV-Python Bài 7 Phần 1: Phát hiện người đi bộ trong hình ảnh
Thị giác máy tính với OpenCV-Python Bài 6 Phần 2: Phép trừ nền
Thị giác máy tính với OpenCV-Python Bài 6 Phần 1: Bắt bám đối tượng với Meanshift và Camshift

Khái niệm cơ bản về đường viền

Đường viền (contour) có thể được giải thích đơn giản là một đường cong nối tất cả các điểm liên tục (dọc theo đường biên), có cùng màu hoặc cường độ. Các đường viền là một công cụ hữu ích để phân tích hình dạng, phát hiện và nhận dạng đối tượng.

Một số ghi chú quan trọng đối với thao tác tìm đường viền của hình ảnh:

- Sử dụng hình ảnh nhị phân giúp tăng độ chính xác tìm đường viền, vì vậy, trước khi tìm các đường viền, hãy áp dụng tính năng phát hiện ngưỡng hoặc cạnh bất thường.

- Hàm findContours sửa đổi hình ảnh nguồn, vì vậy, tốt nhất nên lưu ảnh nguồn vào một số biến khác.

- Trong OpenCV, đối tượng được tìm thấy có màu trắng, còn nền để ở màu đen.

Hãy xem cách tìm đường viền của một hình ảnh nhị phân dưới đây:

  1. import numpy as np
  2. import cv2
  3.     
  4. im = cv2.imread('test.jpg')
  5. imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
  6. ret,thresh = cv2.threshold(imgray, 127, 255, 0)
  7. contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Cú pháp: cv2.findContours(src, contour_retrieval, contours_approximation)

Có ba đối số trong hàm cv2.findContours(), đối số đầu tiên là hình ảnh nguồn, đối số thứ hai là chế độ truy xuất đường viền, thứ ba là phương pháp xấp xỉ đường viền. Kết quả trả về là một danh sách Python của tất cả các đường viền trong hình ảnh. Mỗi đường viền riêng lẻ là một mảng Numpy gồm các tọa độ (x, y) của các điểm biên của đối tượng.

Làm thế nào để vẽ các đường viền?

Để vẽ các đường viền, hàm cv2.drawContours được sử dụng. Nó cũng có thể được sử dụng để vẽ bất kỳ hình dạng nào miễn là bạn có các điểm ranh giới của nó.

Đối số đầu tiên là hình ảnh nguồn, đối số thứ hai là các đường viền dưới dạng danh sách Python, đối số thứ ba là chỉ mục của các đường viền (hữu ích khi vẽ đường viền riêng lẻ. Để vẽ tất cả các đường viền, hãy truyền -1) và các đối số còn lại là màu sắc, độ dày,...

Để vẽ tất cả các đường viền trong một hình ảnh:

  1. cv2.drawContours(img, contours, -1, (0,255,0), 3)
  2. imshow(“All Contours”, img)
  3. cv2.waitKey(0)
  4. cv2.destroyAllWindows()

Để vẽ một đường viền riêng lẻ, giả sử vẽ đường viền thứ tư:

  1. cv2.drawContours(img, contours, 3, (0,255,0), 3)

Trong hầu hết các trường hợp, phương án dưới đây được sử dụng:

  1. cnt = contours[4]
  2. cv2.drawContours(img, [cnt], 0, (0, 255, 0), 3)

Ở phần tiếp theo chúng ta sẽ cũng tìm hiểu một số thao tác với đường viền.

 

(Sưu tầm)
VIỆN IMC
Tòa nhà IMC Tower, Số 176 Trường Chinh, Phường Khương
Thượng, Quận Đống Đa, Thành phố Hà Nội, Việt Nam
Tel/Fax : (+84) 24 3566 6232 / 24 3566 6234
Email: contact@imc.org.vn   Website: https://imc.org.vn