"Mesafe"

6 Cevap php

Ben doğru bir sayı ya da bir şey olarak iki renk arasındaki mesafeyi temsil eden bir fonksiyonun arıyorum.

Örneğin ben HEX değerleri veya RGB dizilerin bir dizi var için arıyorum ve ben belirli bir renk için dizideki en benzer rengi bulmak istiyorum

örn. Ben bir RGB değeri ve dizideki 'yakın' renk döndürülen bir fonksiyonu geçmek

6 Cevap

Each color is represented as a tuple in the hex code. To determine close matches you need need to subtract each RGB component seperatly.

Örnek:

Color 1: #112233 
Color 2: #122334
Color 3: #000000

Difference Between color1 and color2: R=1,  G=1   B=1  = 0x3 
Difference Between color3 and color1: R=11, G=22, B=33 = 0x66

So color 1 and color 2 are closer than
1 and 3.

edit

Yani yakın adında renk istiyorum? Her rengin onaltılık değerleri ile bir dizi oluşturmak, bunu yineleme ve adını döndürür. Bu gibi bir şey;

function getColor($rgb)
{
	// these are not the actual rgb values
	$colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);

	$largestDiff = 0;
	$closestColor = "";
	foreach ($colors as $name => $rgbColor)
	{
		if (colorDiff($rgbColor,$rgb) > $largestDiff)
		{
			$largestDiff = colorDiff($rgbColor,$rgb);
			$closestColor = $name;
		}

	}
	return $closestColor;

}

function colorDiff($rgb1,$rgb2)
{
	// do the math on each tuple
	// could use bitwise operates more efeceintly but just do strings for now.
	$red1 = hexdec(substr($rgb1,0,2));
	$green1 = hexdec(substr($rgb1,2,2));
	$blue1 = hexdec(substr($rgb1,4,2));

	$red2 = hexdec(substr($rgb2,0,2));
	$green2 = hexdec(substr($rgb2,2,2));
	$blue2 = hexdec(substr($rgb2,4,2));

	return abs($red1 - $red2) + abs($rgreen1 - $green2) + abs($blue2 - $blue2) ;

}

Here is a paper on the subject, hangi iyi bir cevap vermelidir.

Ben ilk HSL / HSV dönüştürme de iyi bir fikir olacağını düşünüyordum, ama sonra fark ettim ki S & aşırı değerlerinde L / V, H önemli değildir, ve ortada, bu en önemli.

Eğer akıllıca olacaktır RGB uzayda kaldıkları, basit bir çözüm istiyor sanırım. Ben kartezyen mesafe kullanmak istiyorum. Eğer renk R G B Ri Gi Bi birkaç saat için karşı düşünüyorsanız i, istediğiniz i Bu en aza indirir

(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2

Öncelikle size renk karşılaştırmaları (vb RGB, HSV, HSL, CMYK) meydana istediğiniz inci uygun renk alanı seçmek zorunda.

Eğer 3-dimenionsal RGB uzayda iki nokta birbirine ne kadar yakın bilmek istiyorum varsayarsak, aralarında Pisagor mesafeyi hesaplayabilir, yani,

d2 = (r1 - r2)**2 + (g1 - g2)**2 + (b1 - b2)**2;

Bu aslında size mesafenin karesini verir. (Sadece kare değerleri karşılaştırarak eğer karekök almak gerekli değildir.)

Bu eşit R, G ve B değerleri tedavi etmek istediğinizi varsayar. Eğer bunlardan tonlamayla içine RGB dönüştürmek ne olur gibi tek tek renk bileşenleri, ağırlık ederseniz, mesafe her dönem için bir katsayı eklemek zorunda, yani,

d2 = 30*(r1-r2)**2 + 59*(g1-g2)**2 + 11*(b1-b2)**2;

Bu% 30 kırmızı +% 59 yeşil +% 11 mavi gri tonlara RGB popüler dönüĢtüğünü.

Update

Bu son denklemi muhtemelen olmalıdır

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;

Çok basit bir yaklaşım üç boyut arasında özetlenmiştir mesafe hesaplamak için. Örnek simple_distance için ("12,10,255", "10,10,250") = 7

* Square_distance ("12,10,255", "10,10,250") = 2: Bu yol bileşenleri çok daha fazla "ceza" olacağını olmak - Bir daha sofistike bir yaklaşım her bileşenleri için mesafelerin bir kare çekmek ve bu özetlemek olacaktır 2 +0 * 0 5 * 5 = 29.

Tabii ki renklerin listesini üzerinden yineleme ve yakın olanı bulmak zorunda kalacak.

Eğer HSL veya HSV için RGB değeri dönüştürebilirsiniz. sonra renkleri karşılaştırmak kolay: tonu tarafindan renkler ilk, sonra doygunluk tarafından, daha sonra parlaklık tarafından. çıkan sırayla, birbirlerine yanındaki 2 renk algısal olarak çok yakın olarak görünecektir.

etrafında o renk atkılar dikkat: 0 ile 255 arasında değişen bir renk tonu için, 0 bir renk tonu ve 255 bir renk tonu çok yakındır.

http://en.wikipedia.org/wiki/HSL_and_HSV Eğer HSL, RGB dönüştürmek sağlayacak formül için HSL üzerinde wikipedia makalesine bakın

(Diğer renk alanlarda, Lab gibi, daha iyi sonuçlar verebilir unutmayın, ancak dönüşüm daha karmaşık)

en matematiksel Bu açıklayalım:

distance(A(h,s,l), B(h,s,l)) = (A(h)-B(h)) * F^2 + (A(s)-B(s)) * F + (A(l)-B(l))

F özenle seçilmiş bir faktördür (256 gibi bir şey ...) burada

the above formula does not take into account the hue wraparound...

Renk algısı doğrusal because the human eye is more sensitive to certain colors than others. değil

Eğer özel bir formülü kullanmanız gerekir.

Bakın here.