Rate this post

Đường bao được định nghĩa 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 độ. Hôm nay hãy cùng W3seo tìm hiểu về contours và cách sử dụng nó trong openCV

Giới thiệu về Contours

Contours trong OpenCV là một khái niệm trung tâm trong lĩnh vực xử lý hình ảnh và phân tích dữ liệu hình ảnh. Chúng đại diện cho các đường viền của đối tượng trong một hình ảnh, giúp phát hiện và hiểu rõ hình dạng cũng như kích thước của các đối tượng. Việc sử dụng contours có thể rất đa dạng, từ việc nhận dạng hình dạng đến việc theo dõi đối tượng trong chuỗi video.

Trong OpenCV, contours được tạo ra từ hình ảnh nhị phân thông qua các thuật toán như phát hiện cạnh. Khi một contours được xác định, nó có thể được sử dụng để đo lường diện tích, chu vi, tâm trọng tâm, và định hình hình dạng của đối tượng. Điều này mở ra nhiều khả năng ứng dụng thực tế, từ việc phân loại các phần tử trong hình ảnh y tế cho đến việc nhận dạng đối tượng trong các hệ thống tự động hóa công nghiệp.

Tầm quan trọng của contours trong phân tích hình ảnh không thể phủ nhận. Chúng giúp máy tính hiểu và phân biệt các đối tượng trong một hình ảnh, là bước đầu tiên quan trọng trong nhiều ứng dụng xử lý hình ảnh hiện đại. Dù cho ứng dụng có phức tạp đến mức nào, từ nhận dạng khuôn mặt đến xe tự lái, khả năng phân tích contours chính xác và hiệu quả luôn là chìa khóa để đạt được kết quả mong muốn.

Làm Việc với Contours trong OpenCV

Trong OpenCV, việc làm việc với contours bắt đầu bằng việc tìm chúng trong một hình ảnh. Điều này thường được thực hiện thông qua hàm findContours(), một trong những hàm chính của OpenCV cho việc phát hiện contours. Hàm này phân tích một hình ảnh nhị phân và trả về một danh sách các contours phát hiện được, cùng với thông tin về cấu trúc hình học của chúng.

Để tìm contours, bạn cần chuẩn bị hình ảnh bằng cách thực hiện các bước như chuyển đổi sang ảnh xám, áp dụng ngưỡng (thresholding) hoặc phát hiện cạnh. Sau khi xác định contours, bạn có thể sử dụng hàm drawContours() để vẽ chúng lên một hình ảnh, giúp phân tích và hiển thị rõ ràng các đường viền tìm được.

Xét ví dụ cơ bản: Tìm contours trong một hình ảnh. Bạn bắt đầu bằng việc đọc hình ảnh và chuyển đổi nó thành một hình ảnh xám. Tiếp theo, bạn áp dụng một phương pháp ngưỡng để phân biệt rõ ràng các đối tượng so với nền. Sau đó, sử dụng hàm findContours() để phát hiện contours. Kết quả sẽ là một danh sách các contours được tìm thấy, mỗi contour là một chuỗi các điểm trong không gian 2D.

Hàm drawContours() sau đó có thể được sử dụng để vẽ các contours này trên hình ảnh gốc hoặc trên một hình ảnh trống để dễ dàng quan sát. Việc này giúp bạn nắm bắt được hình dáng và vị trí của các đối tượng trong hình ảnh.

Làm việc với contours trong OpenCV không chỉ giới hạn ở việc tìm và vẽ chúng. Bạn cũng có thể sử dụng các phân tích tiếp theo như tính toán diện tích, chu vi, xác định trung tâm trọng tâm, hoặc thậm chí là nhận dạng hình dạng dựa trên các contours được tìm thấy. Điều này mở ra một loạt các khả năng ứng dụng trong các lĩnh vực như phân loại hình ảnh, theo dõi đối tượng, và nhiều hơn nữa.

Xử Lý và Phân Tích Contours

Phân tích contours trong OpenCV không chỉ giới hạn ở việc nhận dạng chúng, mà còn mở rộng ra việc hiểu và sử dụng các đặc điểm của chúng. Các kỹ thuật phân tích thường bao gồm việc xác định diện tích và chu vi của contours. Diện tích giúp đánh giá kích thước tổng thể của đối tượng, trong khi chu vi cung cấp thông tin về độ dài tổng của đường viền. Điều này có thể rất hữu ích trong các tình huống như phân loại hình ảnh, nơi kích thước và hình dạng của đối tượng đóng vai trò quan trọng.

Ngoài ra, việc xác định trung tâm trọng tâm của một contour là một phần quan trọng khác của quy trình phân tích. Điều này giúp xác định vị trí tương đối của đối tượng trong không gian hình ảnh. Đối với hình dạng, OpenCV cung cấp các công cụ để so sánh và phân biệt contours dựa trên hình dạng của chúng, điều này có thể hữu ích trong việc nhận dạng đối tượng.

Lọc và lựa chọn contours dựa trên các thuộc tính cụ thể là một phần quan trọng của quy trình xử lý. Có thể lọc contours dựa trên kích thước, hình dạng, hoặc các đặc điểm hình học khác. Điều này giúp loại bỏ nhiễu hoặc các đối tượng không mong muốn khỏi phân tích. Ví dụ, bạn có thể chọn loại bỏ các contours nhỏ hơn một kích thước nhất định để tập trung vào các đối tượng lớn hơn trong hình ảnh.

Trong một số trường hợp, phân tích contours cũng có thể bao gồm việc sử dụng các thuật toán phức tạp như phát hiện cạnh và hình dạng cụ thể để phân loại chính xác hơn. Điều này đòi hỏi việc kết hợp kiến thức sâu về xử lý hình ảnh và thống kê.

Các bước xử lý Contours trong OpenCV

Trong OpenCV, để xử lý contours, chúng ta có thể thực hiện các bước sau:

  1. Tiền xử lý ảnh (Preprocessing):
    • Chuyển đổi ảnh sang ảnh đen trắng (grayscale) nếu cần thiết.
    • Áp dụng các phép biến đổi như làm mờ (blurring) hoặc làm nổi bật biên (edge enhancement) để loại bỏ nhiễu và tăng cường đặc trưng.
  2. Tìm contours:
    • Áp dụng phương pháp phát hiện biên như Canny Edge Detection hoặc Thresholding để tạo ra ảnh nhị phân.
    • Sử dụng hàm findContours trong OpenCV để tìm các contours trong ảnh nhị phân.
    • Đảm bảo chỉ lấy các contours cần thiết bằng cách xác định ngưỡng diện tích tối thiểu hoặc loại bỏ các contours nhỏ.
  3. Xử lý và lọc contours:
    • Làm mờ contours bằng cách sử dụng Gaussian Blur hoặc Median Blur để làm giảm độ rối và loại bỏ chi tiết không mong muốn.
    • Loại bỏ các contours không cần thiết bằng cách xác định tiêu chí như diện tích, chu vi hoặc hình dạng.
    • Tiếp giáp (approximate) các contours để giảm số lượng điểm và làm nổi bật hình dạng chính.
  4. Trích xuất thông tin từ contours:
    • Tính toán diện tích, chu vi, hướng, tọa độ bounding box và các đặc trưng khác của các contours.
    • Sử dụng các hàm như contourArea, arcLength, boundingRect để lấy thông tin cần thiết từ các contours.
  5. Vẽ và hiển thị contours:
    • Sử dụng hàm drawContours để vẽ contours lên ảnh gốc hoặc ảnh khác.
    • Hiển thị ảnh kết quả để kiểm tra và xem các contours đã được xử lý và lọc.

Các bước trên chỉ là một hướng dẫn tổng quan và có thể thay đổi tùy thuộc vào nhu cầu và tình huống cụ thể. Tuy nhiên, chúng cung cấp một khung cơ bản để xử lý và làm việc với contours trong OpenCV.

Xem thêm Sử dụng Python Computer Vision với OpenCV

Vẽ Đường Viền sử dụng OpenCV

OpenCV cung cấp hàm cv2.drawContours() để vẽ các đường viền, hay còn gọi là contours, trong hình ảnh. Hàm này không chỉ giúp vẽ contours mà còn có khả năng vẽ bất kỳ hình dạng nào khác nếu bạn cung cấp các điểm giới hạn của hình dạng đó. Cú pháp của hàm cv2.drawContours() như sau:

cv2.drawContours(image, contours, contourIdx, color, thickness)

Trong đó:

  • image: Đối tượng hình ảnh mà bạn muốn vẽ lên.
  • contours: Danh sách các contours, thường là kết quả từ hàm findContours().
  • contourIdx: Chỉ số của contour cần vẽ. Để vẽ tất cả các contours, sử dụng giá trị -1.
  • color: Màu sắc của contours dưới dạng (B,G,R).
  • thickness: Độ dày của đường viền. Để vẽ một đường viền đặc, sử dụng giá trị âm.

Ví dụ, để vẽ tất cả các contours trên một hình ảnh, bạn có thể sử dụng lệnh sau:

cv2.drawContours(image, contours, -1, (0,255,0), 3)

Trong trường hợp bạn chỉ muốn vẽ một contour cụ thể, chẳng hạn contour thứ ba trong danh sách, bạn chỉ cần thay đổi chỉ số contour tương ứng:

cv2.drawContours(image, contours, 2, (0,255,0), 3)

Ở đây, 2 là chỉ số của contour thứ ba (vì chỉ số bắt đầu từ 0), (0,255,0) là màu xanh lá cây trong không gian màu BGR, và 3 là độ dày của đường viền.

Sử dụng hàm này, bạn có thể dễ dàng trực quan hóa các đường viền tìm được trong hình ảnh, từ đó giúp phân tích hình ảnh trở nên dễ dàng và chính xác hơn. Đây là một công cụ hữu ích trong các ứng dụng như phân loại hình ảnh, theo dõi đối tượng, và nhận dạng hình dạng.

Phương Pháp Xấp Xỉ Đường Viền trong OpenCV

Trong OpenCV, phương pháp xấp xỉ đường viền là một yếu tố quan trọng trong hàm cv2.findContours(). Đây là đối số thứ ba trong hàm và đóng vai trò quyết định trong việc xác định cách lưu trữ các điểm của contours. Mặc định, hàm này lưu trữ các tọa độ (x, y) của tất cả các điểm trên ranh giới của một hình dạng. Tuy nhiên, không phải lúc nào cũng cần thiết phải lưu trữ từng điểm trên đường viền.

Ví dụ, khi sử dụng cv2.CHAIN_APPROX_NONE như một đối số, hàm sẽ lưu trữ tất cả các điểm trên contours. Điều này có thể hữu ích trong các tình huống đòi hỏi độ chính xác cao, nhưng trong nhiều trường hợp, việc lưu trữ từng điểm không cần thiết và có thể gây lãng phí bộ nhớ.

Một phương pháp phổ biến khác là cv2.CHAIN_APPROX_SIMPLE. Phương pháp này chỉ lưu trữ các điểm cuối cùng của các đoạn thẳng trong contours, giúp giảm lượng dữ liệu cần lưu trữ. Ví dụ, trong trường hợp của một hình chữ nhật, thay vì lưu trữ tất cả các điểm dọc theo các cạnh, cv2.CHAIN_APPROX_SIMPLE sẽ chỉ lưu trữ bốn điểm tại các góc của hình chữ nhật.

So sánh hai phương pháp này trên cùng một hình ảnh, ví dụ với một hình chữ nhật, có thể thấy rõ sự khác biệt: Sử dụng cv2.CHAIN_APPROX_NONE có thể lưu trữ hàng trăm điểm cho contours, trong khi cv2.CHAIN_APPROX_SIMPLE chỉ lưu trữ bốn điểm cần thiết để mô tả hình dạng đó.

Do đó, việc lựa chọn phương pháp xấp xỉ đường viền phù hợp phụ thuộc vào nhu cầu cụ thể của từng ứng dụng. Trong khi cv2.CHAIN_APPROX_NONE cung cấp độ chính xác cao hơn, cv2.CHAIN_APPROX_SIMPLE giúp tối ưu hóa việc sử dụng bộ nhớ và tăng hiệu suất xử lý.

Trong hình ảnh chữ nhật ở trên, hình ảnh đầu tiên hiển thị các điểm sử dụng với cv.CHAIN_APPROX_NONE (734) và hình ảnh thứ hai hiển thị điểm với cv2.CHAIN_APPROX_SIMPLE (chỉ 4 điểm) . Chúng ta có thể thấy sự khác biệt giữa cả hai hình ảnh.

Xem thêm Các tính năng của OpenCV mà bạn không thể bỏ qua vào năm 2022

Ứng dụng của Contours trong xử lý ảnh

Contours trong xử lý ảnh có nhiều ứng dụng hữu ích. Dưới đây là một số ví dụ về ứng dụng của Contours:

  1. Phát hiện và định vị đối tượng: Contours có thể được sử dụng để phát hiện và định vị các đối tượng trong ảnh. Với việc xác định các đặc trưng của contours như diện tích, chu vi và hình dạng, ta có thể nhận biết và phân loại các đối tượng khác nhau trong ảnh.
  2. Phát hiện biên độc lập: Contours có thể được sử dụng để phát hiện các biên độc lập trong ảnh. Bằng cách tìm các contours có diện tích nhất định và loại bỏ các contours nhỏ, ta có thể xác định được các vùng chứa các biên độc lập.
  3. Đo lường kích thước và hình dạng: Contours cung cấp thông tin về diện tích, chu vi, hình dạng và hướng của các đối tượng trong ảnh. Điều này cho phép ta đo lường và phân tích kích thước, tỉ lệ, góc xoay và các đặc trưng hình học khác của các đối tượng.
  4. Định vị và nhận dạng vật thể: Bằng cách sử dụng contours, ta có thể định vị và nhận dạng các vật thể trong ảnh. Các đặc trưng của contours như diện tích, hình dạng và sự kết hợp có thể được sử dụng để so sánh với các mẫu đã biết và nhận dạng các vật thể tương ứng.
  5. Xử lý ảnh và phân vùng: Contours có thể được sử dụng để xử lý ảnh và phân vùng các vùng quan trọng trong ảnh. Bằng cách sử dụng các phép biến đổi hình học và xử lý contours, ta có thể tách riêng các vùng quan tâm và áp dụng các phương pháp xử lý tiếp theo.
  6. Phân tích chữ viết tay: Contours có thể được sử dụng để phân tích và nhận dạng chữ viết tay. Bằng cách xác định các contours của các ký tự, ta có thể tách riêng chữ viết tay và áp dụng các thuật toán nhận dạng chữ viết tay để xử lý.

Tóm lại, contours trong xử lý ảnh có nhiều ứng dụng quan trọng như phát hiện và định vị đối tượng, phân tích hình dạng, phân vùng và nhận dạng vật thể. Chúng cung cấp một phương pháp mạnh mẽ để xử lý và trích xuất thông tin từ ảnh.

Xem thêm Cách đọc, hiển thị và lưu hình ảnh trong OpenCV

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now