2013-06-03 27 views
5

Tôi có hình ảnh đa màu.Nhận ưu thế màu opencv

enter image description here

Tôi muốn tính màu chủ đạo của hình ảnh. màu chủ đạo là màu đỏ, tôi muốn lọc màu đỏ. tôi đang làm mã sau trong opencv nhưng nó không thực hiện.

inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output); 

Làm cách nào để tôi có được màu chủ đạo? Dự án cuối cùng của tôi sẽ tự xác định màu tối đa của đối tượng. Phương pháp tốt nhất cho việc này là gì?

Trả lời

7

Phương pháp tốt nhất là phân tích biểu đồ.

Vấn đề của bạn là cổ điển "tìm điểm cao nhất và diện tích dưới đỉnh". Bởi có một tập tin hình ảnh (giả sử chúng ta chỉ mất kênh thứ ba vì đơn giản):

histogram

Bạn sẽ phải tìm đỉnh cao nhất trong biểu đồ đó. Phương pháp đơn giản nhất là chỉ cần truy vấn X mà Y được tối đa hóa. Các phương pháp nâng cao hơn hoạt động với cửa sổ - chúng trung bình giá trị Y của 10 điểm dữ liệu liên tiếp, v.v.

Ngoài ra, hoạt động trong không gian màu HSV hoặc YCrCb. HSV là tốt bởi vì kênh "Huế" dịch rất gần với những gì bạn có nghĩa là "màu". RGB thực sự không phù hợp để phân tích hình ảnh.

+0

biểu đồ riêng cho các kênh R, G và B sẽ không giúp tìm màu chủ đạo. Bạn cần một biểu đồ duy nhất trong đó một thùng đơn là một RGB ba. Tất nhiên kích thước sẽ tăng theo cấp số nhân với số kênh nhưng 3 kênh vẫn có thể quản lý được, bạn có thể sử dụng một vùng chứa như 'std :: unordered_multiset' như một giải pháp hợp lý –

+1

Tất nhiên, điều đó sẽ trở thành vấn đề 3 chiều, phức tạp hơn nhiều để thiết lập. –

9

Bạn nên quantize (giảm số lượng màu) hình ảnh của bạn trước khi tìm kiếm màu thường xuyên nhất.

Tại sao? Hãy tưởng tượng hình ảnh có 100 pixel của (0,0,255) (màu xanh int RGB), 100 pixel của (0,0,254) (gần như màu xanh - bạn thậm chí sẽ không tìm thấy sự khác biệt) và 150 pixel của (0,255,0) (màu xanh lục). Màu sắc thường xuyên nhất ở đây là gì? Rõ ràng, nó là màu xanh lá cây. Nhưng sau khi lượng tử hóa, bạn sẽ có 200 pixel màu xanh lam và 150 pixel màu xanh lục.

Đọc cuộc thảo luận này: How to reduce the number of colors in an image with OpenCV?. Dưới đây là ví dụ đơn giản:

int coef = 200; 
Mat quantized = img/coef; 
quantized = quantized*coef; 

Và đây là những gì tôi đã có sau khi áp dụng nó:

enter image description here

Ngoài ra bạn có thể sử dụng k-means hoặc ca có nghĩa là để làm điều đó (đây là nhiều cách hiệu quả).

Các vấn đề liên quan