2010-07-19 21 views
8

Tôi có số lượng ảnh khá lớn và bản đồ màu RGB (giả sử khoảng 100 màu). Làm thế nào tôi có thể nhóm các hình ảnh theo màu sắc và có được một cái gì đó như sau: http://labs.ideeinc.com/multicolr?Ảnh nhóm theo màu

ý tưởng hiện tại của tôi là thế này: Sử dụng ImageMagick, làm điều này cho mỗi bức ảnh:

  1. Thay đổi kích thước nó đến một kích thước nhỏ hơn để nó có thể được xử lý nhanh hơn.
  2. Quantize mà không cần phối màu bằng bản đồ màu đã chọn của tôi.
  3. Nhận ảnh của histogram để nhận được số lần mỗi màu xuất hiện.
  4. Lưu trữ các màu trong cơ sở dữ liệu, nhưng tôi chưa tìm ra cách tốt nhất để làm điều này cho các lần truy xuất nhanh.

Bạn có biết cách nào tốt hơn và hiệu quả hơn để thực hiện việc này không? Ngôn ngữ của tôi lựa chọn là PHP vì tất cả xử lý nặng sẽ được thực hiện bởi ImageMagick, và cơ sở dữ liệu là PostgreSQL. Cảm ơn bạn trước!

Trả lời

1

Tôi nhận thấy bạn đã tìm ra cách để có được những màu sắc phù hợp nhất từ ​​hình ảnh. Không thay đổi kích thước hình ảnh quá nhiều vì biểu đồ có thể trông khác.

Cơ sở dữ liệu có thể trông giống như thế:

bảng hình ảnh:

image_id | image_file 

bảng màu:

color_id | color_rgb 

image_color bảng:

image_id | color_id | color_percent 

color_percent cột w bệnh được sử dụng cho nhóm/nơi khoản

Bắt hình ảnh:

select 
    image_id 
    sum(color_percent)/count(color_percent) as relevance 
from 
    image_color 
where 
    color_id IN (175, 243) # the colors you want to involve in this search 
    and color_percent > 10 # this will drop results with lower significance 
group by 
    image_id 
order by 
    relevance 
+0

Tôi nghĩ color_id hơi thêm một chút. Nếu nó chỉ tham chiếu một color_rgb, tôi không nghĩ rằng bạn cần một khóa riêng biệt. – rfusca

+0

hoặc nó có thể tham khảo tên màu –

+0

Tôi sẽ đánh dấu đây là câu trả lời được chấp nhận, bởi vì đây là những gì tôi đã kết thúc. Nó không phải là hoàn hảo, nhưng tôi thích nó và nó đã được khá thú vị để làm. :) Kiểm tra: http://www.picof.net/colors/. Sự cố: Tôi không biết cách chọn ảnh có nhiều màu và sắp xếp chúng theo thứ gì đó quan trọng. Tôi đã thử sắp xếp chúng theo (color_A_percent + color_B_percent + ...) nhưng sau đó tôi sẽ nhận được các bức ảnh có 99% color_A và 1% color_B. – liviucmg

1

Màu sắc cơ bản là ba vectơ chiều (không phân biệt nếu chúng được biểu diễn như HSV, RGB, CMY [K]). Thật không may cơ sở dữ liệu quan hệ chủ yếu không phải là rất tốt làm việc trong hơn 1 chiều.

Nếu bạn giảm hình ảnh xuống một màu "trung bình" thì giải pháp trở nên đơn giản hơn một chút: Phân tích tầm thường có nghĩa là bạn cần so sánh hình ảnh mới với mọi hình ảnh hiện có để xác định mức độ tương tự . Tuy nhiên một cách tiếp cận tốt hơn sẽ là số hóa vectơ tìm các giá trị tương tự trong cơ sở dữ liệu.

ví dụ: cho màu 24 bit, 124, 39, 201 dưới dạng màu 1 bit: 0,0,1 dưới dạng 2 bit màu: 1,0,2 ....

Nếu bạn muốn xem nhiều màu hơn trong hình ảnh, sau đó tôi khuyên bạn nên giảm xuống các giá trị gần nhất của bản đồ màu cố định mà không cần truyền bá lỗi và xác định các màu 'N' hàng đầu được sử dụng nhiều nhất. Những gì bạn làm sau đó sẽ yêu cầu một số thử nghiệm và nỗ lực - phương pháp trên có trọng số tần số trong hình ảnh tạm thời có thể cần thiết hoặc bạn có thể chỉ cần bỏ đi bằng cách xem các hình ảnh có màu NM đầu khớp với NX của các giá trị được tính toán của bạn (với một số tinh chỉnh giá trị M và X).

C.

+0

Tôi đã tìm thấy một mô-đun PostgreSQL được gọi là "khối lập phương" có thể xử lý các chỉ mục đa chiều: http://www.postgresql.org/docs/8.4/static/cube.html. Tôi nghĩ tôi sẽ thử. vì có thể chọn ảnh dựa trên bất kỳ màu RGB nào, không chỉ các ảnh cụ thể từ bảng màu giới hạn. – liviucmg

+0

Tuyệt vời - Tôi đã học được điều gì đó mới mẻ. – symcbean

0

Tôi đã nhận thấy những gì bạn cần làm. Cách tốt nhất để giải quyết vấn đề đó là chuyển đổi hình ảnh của bạn từ cấu hình màu RGB sang CIE-LAB.
Sau đó, bạn có thể tính toán khoảng cách giữa hai màu trong không gian 3d.

M.M.

+0

Điều này có lợi thế nào so với giải pháp Cube postgres mà OP đã giải quyết không? – FoolishSeth