Renklerin benzerliğini kontrol etmek için algoritma


84

İki RGB rengini karşılaştıran ve benzerlikleri için bir değer üreten bir algoritma arıyorum (burada benzerlik "ortalama insan algısına göre benzer" anlamına gelir).

Herhangi bir fikir?

DÜZENLE :

Artık cevap veremediğim için soruya bir düzeltme olarak "çözümümü" koymaya karar verdim.

Renklerin karşılaştırmasını kendi başıma halledebilmek için uygulamamda (çok) küçük bir gerçek renk alt kümesi kullanmaya karar verdim. Yaklaşık 30 renkle çalışıyorum ve aralarında sabit kodlanmış mesafeler kullanıyorum.

Bir iPhone uygulaması olduğundan, Object-C ile çalıştım ve uygulama aşağı yukarı renkler arasındaki mesafeleri gösteren aşağıdaki tabloyu temsil eden bir matris.

görüntü açıklamasını buraya girin


R, G ve B değerlerini karşılaştırmak yeterli değil mi?
siyah ay

@Kai: Ben de aynı şeyi uygulamaya çalışıyorum. YUV yaklaşımıyla mı gittiniz yoksa başka tür bir renk alanı ve alan mesafesi mi seçtiniz?
Thariama

3
@Thariama Renklerin karşılaştırmasını kendi başıma halledebilmek için uygulamamda (çok) küçük bir gerçek renk alt kümesi kullanmaya karar verdim. Yaklaşık 50 renkle çalışıyorum ve aralarında sabit kodlanmış mesafeler kullanıyorum. Ancak okuduğum ve denediğim ve test ettiğim her şeyden 2 ^ 24 renk kullanırken YUV en iyi işi yaptı.
Kai Huppmann

@Kai: Kararınızı ve nedenlerini bana bildirdiğiniz için çok teşekkürler. Bu, RGB kullandığınız ve 50 renk kullanarak bir histogram oluşturduğunuz ve önceden tanımlanmış mesafeleri kullanarak alogitminizi hızlandırdığınız anlamına gelir, değil mi? algoritmanızı uygulamak için hangi dili kullandınız?
Thariama

@Thariama Bunu orijinal soruda bir düzenleme olarak koyun.
Kai Huppmann

Yanıtlar:


57

Öklid uzayındaki RGB mesafesi "ortalama insan algısına çok benzemiyor"

YUV renk alanını kullanabilirsiniz , bu faktörü dikkate alır:

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

Bu amaçla CIE renk uzayını da kullanabilirsiniz .

DÜZENLE:

YUV renk uzayının basit formüllerle hesaplanabilecek ucuz bir yaklaşım olduğunu belirteceğim. Ancak algısal olarak tek tip değildir. Algısal olarak tek tip, bir renk değerinde aynı miktarda bir değişikliğin, aynı görsel öneme sahip bir değişiklik üretmesi gerektiği anlamına gelir. Daha kesin ve titiz bir metriğe ihtiyacınız varsa, kesinlikle CIELAB renk alanını veya başka bir algısal olarak tek tip alanı (dönüştürme için basit formüller olmasa bile) dikkate almalısınız.


3
Teşekkür ederim! O halde Y'UV değerlerinin öklid uzayı mesafesi ile gidebilir miyim?
Kai Huppmann

Elbette, ama başka mesafeleri de kullanabilirsin.
Ghassen Hamrouni

2
Muhtemelen UV bileşenleri arasındaki öklid mesafesini hesaplamak istersiniz çünkü Y 'luma bileşenidir.
Ross

17
YUV'deki Öklid mesafesinin insanların farklılıkları algılayışını yansıttığı iddiasına kimse bir kaynak verebilir mi?
Bill

4
@ Fatura etmez. "sonuçlar" bölümüne buradan bakın: compuphase.com/cmetric.htm
kritzikratzi

23

CIE94 (DeltaE-1994) kullanmanızı tavsiye ederim , insan renk algısının iyi bir temsili olduğu söyleniyor. Bilgisayarla görü ile ilgili uygulamalarımda oldukça kullandım ve sonuçtan oldukça memnunum.

Bununla birlikte, böyle bir karşılaştırma yapmak hesaplama açısından pahalıdır:

  1. RGB to XYZ her iki renk için
  2. XYZ to LAB her iki renk için
  3. Diff = DeltaE94(LABColor1,LABColor2)

Formüller (sözde kod):


CIELAB renk uzayını kullandığım için bu yöntemi tercih ettim, teşekkürler.
Sergey Voronezhskiy

XYZ'den LAB'ye "Hunter-Lab" gibi mi?
Zuks

1
Boşver ... Delta E 1994'ün CIE-L * ab değerlerini kullandığını görebiliyorum
Zuks

15

Burada renk uzaklıkları konusunda mükemmel bir yazı var: http://www.compuphase.com/cmetric.htm

Kaynağın kaybolması durumunda yazarın sonucu, iki RGB rengi arasındaki mesafeye en düşük maliyetli yaklaşımın bu formül ( C kodunda) kullanılarak elde edilebileceğidir .

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

14

İnsan algısı kromada yoğunluktan daha zayıftır.

Örneğin, ticari videoda, YCbCr / YPbPr renk uzayları (Y'UV olarak da adlandırılır) renk bilgisinin çözünürlüğünü azaltır ancak luma'yı (Y) korur. 4: 2: 0 ve 4: 2: 2 gibi dijital video sıkıştırmada, nispeten zayıf algı nedeniyle kroma bit hızını azaltır.

Luma'ya (Y) göre daha yüksek ve kromaya göre daha az öncelik veren bir mesafe işlevi hesaplayabileceğinizi düşünüyorum.

Ayrıca, düşük yoğunlukta, insan görüşü neredeyse siyah beyazdır. Bu nedenle, düşük luma (Y) için kromaya gittikçe daha az ağırlık uyguladığınız için öncelik işlevi doğrusal değildir.

Daha bilimsel formüller: http://en.wikipedia.org/wiki/Color_difference


3

Renk algısı Öklidsel değildir. Herhangi bir mesafe formülü aynı anda hem yeterince iyi hem de korkunç olacaktır. Öklid mesafesine dayalı herhangi bir ölçü (RGB, HSV, Luv, Lab, ...) benzer renkler için yeterince iyi olacak ve deniz mavisine yakın olduğunu gösterecektir. Ancak yakın olmayan değerler için keyfi olabilir. Örneğin, kırmızı yeşile mi yoksa maviye mi yakın?

Charles Poynton'ın Renk SSS bölümünden :

XYZ ve RGB sistemleri, algısal tekdüzelik sergilemekten uzaktır. XYZ'nin makul şekilde algısal olarak tekdüze bir alana dönüşümü bulmak, CIE'de on yıl veya daha fazla zaman harcadı ve sonunda tek bir sistem üzerinde anlaşma sağlanamadı.


Teşekkür ederim. Ve bu harika, ilginç bir bağlantı. Amacım için kırmızının yeşile mi yoksa maviye mi yakın olduğunu söylemek o kadar da önemli değil, ama açık grinin beyaza daha yakın olduğunu sonra açık kırmızı olduğunu ve umarım (ama henüz emin değilim) YUV bunu başarır.
Kai Huppmann

-5

RGB küpündeki renk benzerliği, öklid mesafesi ile ölçülür (pisagor formülü kullanın).

DÜZENLEME: İkinci bir düşünceye göre, bu diğer renk alanlarının çoğu için de geçerli olmalıdır.


6
Hayır, RGB alanındaki Öklid mesafesi, insan gözünün renkler arasındaki farklılıkları algılama şekline karşılık gelmez. Lab gibi renk uzaylarının yaratılmasının tüm nedeni budur.
Bill

Hayır. Öklid mesafesi, herhangi bir kartezyen uzayda mesafeyi ölçmenin bir yoludur. mesafeyi ölçer, benzerliği değil! şimdi öklid mesafesinin ve benzerlik sorusunun çakıştığı farklı bir vektör uzayı (cie veya yuv gibi) seçebilir veya farklı bir ölçü kullanabilirsiniz. ancak rgb + euclidean tatmin edici sonuçlar vermiyor.
kritzikratzi

Ben de bunu düşündüm, ancak daha sonra sınırlı sayıda renge sahip bir çizim programı açın (örneğin, önceden ayarlanmış 216 varsayılan paleti olan kerpiç flaş) ve bu formülü teste tabi tuttuğunuzda, çok hızlı bir şekilde hayal kırıklığına uğrarsınız. açıkça kahverengiye ihtiyaç var, vb.
Dmitry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.