2010-07-19 18 views
8

Çok fazla sayıda fotoğrafım ve bir RGB renkli haritanım var (yaklaşık 100 renk). Resimleri renkli olarak nasıl gruplandırabilirim ve aşağıdaki gibi bir şey elde edebilirim: http://labs.ideeinc.com/multicolr?Gruptaki fotoğraflara göre renkler

Benim şu anki düşüncesi şudur: ImageMagick kullanarak, her fotoğraf için bunu: daha hızlı işlenebilmesi böylece

  1. daha küçük bir boyuta yeniden boyutlandırma. Seçtiğim renk haritasını kullanarak titizlik olmadan
  2. Quantize.
  3. Her rengin kaç kez görüneceğini öğrenmek için fotoğrafın histogram fotoğrafını çekin.
  4. Renkleri bir veritabanında depolayın, ancak hızlı geri alma için bunu yapmanın en iyi yolunun ne olduğunu anlayamadım.

Bunu yapmak için daha iyi ve daha verimli bir yol biliyor musunuz? Tercih edilen dilim PHP'dir, çünkü tüm ağır işlemler ImageMagick tarafından yapılacak ve veritabanı PostgreSQL'dir. Önceden teşekkürler!

cevap

1

Görüntünün en alakalı renklerini nasıl alacağınızı zaten anladığınızı görüyorum. Görüntüleri yeniden boyutlandırmayın çünkü histogram farklı görünebilir.

görüntü tablosu:

image_id | image_file 

renk tablosu:

color_id | color_rgb 

image_color tablosu:

image_id | color_id | color_percent 

color_percent sütun w

veritabanı böyle bir şey görünebilir

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

Sanırım color_id biraz fazladan. Sadece bir color_rgb'ye referans veriyorsa, ayrı bir anahtara ihtiyacınız olduğunu düşünmüyorum. – rfusca

+0

ya da –

+0

renk ismine başvurabilirim, bunu kabul edilen cevap olarak işaretleyeceğim çünkü yaptığım şey bu. Mükemmel değil, ama hoşuma gitti ve yapmak çok eğlenceliydi. :) Check it out: http://www.picof.net/colors/. Sorunlar: Fotoğrafları birden fazla renkle nasıl seçeceğinizi ve bunları önemli bir şeye göre nasıl sipariş edeceğimi bilmiyorum. Onları sipariş vermeyi denedim (color_A_percent + color_B_percent + ...) ama sonra% 99 color_A ve% 1 color_B içeren fotoğraflar elde ediyorum. – liviucmg

1

Renk (bunlar HSV, RGB, CMY [K] olarak temsil edilir bakılmaksızın) esas olarak üç boyutlu vektörlerdir: hasta maddeleri

Alma görüntü gruplama/için kullanılabilir. Ne yazık ki ilişkisel veritabanı çoğunlukla 1'den fazla boyutta çalışmakta çok iyi değildir.

Görüntüyü tek bir "ortalama" renge küçültürseniz, çözüm biraz daha basit hale gelir: Önemli bir analiz, benzerlik düzeyini belirlemek için mevcut her görüntüyle yeni bir görüntüyü karşılaştırmanız gerektiğini belirtir. . Ancak, veri tabanındaki benzer değerleri bulmak için vektörü sayısallaştırmak daha iyi bir yaklaşım olacaktır.

örn. 24 bit renk 124, 39, 201 bit renk 1 olarak: 0,0,1 bit renk 2 olarak: 1,0,2 ....

sen daha renklere bakmak isterseniz görüntüyü, daha sonra sabit bir renk haritasının en yakın değerlerine hata yayılımı olmadan ve en çok kullanılan 'en üstteki renkleri tanımlayarak indirmenizi tavsiye ederim. Bundan sonra yapmanız gereken bazı deneme ve çaba gerektirecektir - aradaki görüntüdeki frekans için yukarıda belirtilen yöntem gerekli olabilir veya en üstteki NM renklerinin hesaplanan değerlerin NX değerleriyle eşleştiği görüntülere (yani M ve X değerlerinin ayarlanması).

C.

+0

Çok boyutlu dizinlerle ilgilenebilen "küp" adı verilen bir PostgreSQL modülü buldum: http://www.postgresql.org/docs/8.4/static/cube.html. Sanırım deneyeceğim. sınırlı bir paletten sadece belirli olanları değil, herhangi bir RGB rengine göre fotoğrafları seçebilmenin mümkün olması gerektiğinden. – liviucmg

+0

Cool - Yeni bir şey öğrendim. – symcbean

0

Ne yapman gerektiğini farkettim. Bu sorunu çözmenin en iyi yolu, görüntünüzü RGB'den CIE-LAB renk profiline dönüştürmektir.
Daha sonra, iki renk arasındaki mesafeyi 3d uzayda hesaplayabilirsiniz.

M.M.

+0

Bu, OP'ye dayanan küplere göre postgres'e kıyasla avantajlara sahip mi? – FoolishSeth