2011-10-14 33 views
7

Tôi có khoảng 3000 hình ảnh và 13 màu khác nhau (nền của phần lớn các hình ảnh này là màu trắng). Nếu màu chính của hình ảnh là một trong 13 màu khác nhau, tôi muốn chúng được liên kết.phát hiện màu chính trong Python

Tôi đã xem các câu hỏi tương tự như Image color detection using python yêu cầu thuật toán màu trung bình. Tôi đã sao chép khá nhiều mã, sử dụng Thư viện hình ảnh Python và biểu đồ, và làm cho nó hoạt động - nhưng tôi thấy rằng nó không quá đáng tin cậy để xác định màu sắc chính.

Bất kỳ ý tưởng nào? Hoặc các thư viện có thể giải quyết vấn đề này?

Cảm ơn trước!

: EDIT: Cảm ơn các bạn - tất cả các bạn đều nói điều tương tự, để tạo "nhóm" và tăng số lượng nhóm với mỗi pixel gần nhất của hình ảnh. Tôi dường như nhận được rất nhiều hình ảnh trở về "Trắng" hoặc "Beige", cũng là nền tảng của hầu hết các hình ảnh này. Có cách nào để làm việc xung quanh hoặc bỏ qua nền?

Xin cảm ơn một lần nữa.

+0

định nghĩa của bạn về màu sắc là gì? một bộ ba rgb? (r/g, b/g)? màu sắc từ không gian hsv? – Simon

+0

xin lỗi vì sự mơ hồ - tôi có nghĩa là RGB triplet – dchang

Trả lời

9

Bạn có thể sử dụng chức năng getcolors để nhận danh sách tất cả các màu trong hình ảnh. Nó trả về một danh sách các bản ghi trong các hình thức:

(N, COLOR) 

nơi N là số lần so với màu COLOR xảy ra trong hình ảnh. Để có được màu sắc xảy ra tối đa, bạn có thể vượt qua danh sách để các max chức năng:

>>> from PIL import Image 
>>> im = Image.open("test.jpg") 
>>> max(im.getcolors(im.size[0]*im.size[1])) 
(183, (255, 79, 79)) 

Lưu ý rằng tôi đã thông qua im.size[0]*im.size[1] đến getcolors chức năng bởi vì đó là maxcolors giá trị lớn nhất (xem the docs để biết chi tiết).

+0

Thư viện hình ảnh có được gọi là một cái gì đó khác không? –

+0

Tôi hiểu rồi. 'từ hình ảnh nhập PIL ' –

2

Cá nhân tôi sẽ chia không gian màu thành 8-16 màu chính, sau đó cho mỗi pixel tôi sẽ tăng nhóm màu gần nhất lên một. Khi kết thúc, màu của nhóm có số điểm ảnh cao nhất sẽ thắng.

Về cơ bản, hãy suy nghĩ số trung bình thay vì trung bình. Bạn chỉ thực sự quan tâm đến màu sắc trong hình ảnh, trong khi màu trung bình thường mang lại cho bạn một màu hoàn toàn mới.

1

Vì bạn đang cố gắng kết hợp một số lượng nhỏ các màu có từ trước, bạn có thể thử một cách tiếp cận khác. Kiểm tra từng hình ảnh đối với tất cả các màu và xem hình nào phù hợp nhất.

Để thực hiện trận đấu, tôi bắt đầu bằng cách thay đổi kích thước từng hình ảnh thành kích thước nhỏ hơn để giảm số lượng công việc bạn sẽ làm cho mỗi; nhận thức của chúng tôi về màu sắc của hình ảnh không quá phụ thuộc vào số lượng chi tiết. Đối với mỗi pixel của hình ảnh nhỏ hơn, hãy tìm xem 13 màu nào là gần nhất. Nếu nó nằm trong ngưỡng nào đó, hãy nhấn vào một bộ đếm cho màu đó. Vào cuối bất kỳ số nào trong số 13 có số lượng cao nhất là người chiến thắng.

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