返回首页

{A}{S0}说明
这个小方法提供了一种算法来找到最近的(或quot;最similarquot)的颜色在一个给定的quot; colorspacequot相比,一个给定的单一颜色。这是通过搜索至少在两种颜色之间的欧几里德距离。欧氏距离,可以计算出在任意一个n维空间。在此实现,价值α-组件给定的颜色quot; approximatequot;不使用。在示例中,我使用一个有点Julijan Sribar()代码写入收到quot;网站colorsquot;作为样本的色彩空间。 webcolor的空间实际上是RGB空间的子空间。该算法
是很简单的计算两点之间的欧氏距离。首先,转换的三色组成部分,双值:

double dbl_input_red = Convert.ToDouble(input_color.R);

double dbl_input_green = Convert.ToDouble(input_color.G);

double dbl_input_blue = Convert.ToDouble(input_color.B);

进一步明确了quot;相似性measurequot;(其实这是距离)。这项措施已被初始化一个任意值必须大于最大可能的距离(基本上这是白人和黑人之间的距离)。
该算法找到最小距离很简单:
Color nearest_color = Color.Empty;

foreach (object o in WebColors)

{

	// compute the Euclidean distance between the two colors

	// note, that the alpha-component is not used in this example

	dbl_test_red = Math.Pow(Convert.ToDouble(((Color)o).R) - dbl_input_red, 2.0);

	dbl_test_green = Math.Pow(Convert.ToDouble

		(((Color)o).G) - dbl_input_green, 2.0);

	dbl_test_blue = Math.Pow(Convert.ToDouble

		(((Color)o).B) - dbl_input_blue, 2.0);

	// it is not necessary to compute the square root

	// it should be sufficient to use:

	// temp = dbl_test_blue + dbl_test_green + dbl_test_red;

	// if you plan to do so, the distance should be initialized by 250000.0

	temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red);

	// explore the result and store the nearest color

	if(temp == 0.0)

	{

		// the lowest possible distance is - of course - zero

		// so I can break the loop (thanks to Willie Deutschmann)

		// here I could return the input_color itself

		// but in this example I am using a list with named colors

		// and I want to return the Name-property too

		nearest_color = (Color)o;

		break;

	}

	else if (temp < distance)

	{

		distance = temp;

		nearest_color = (Color)o;

	}

}
使用
使用代码,只需复制并粘贴到您的项目的方法GetNearestWebColor(彩色input_color)。另外,您可以放置​​一个SampleLibrary.dll参考。历史2007年1月6日:战后初期

回答

评论会员:andre_dart 时间:2011/12/07
我发现,如果我从RGB转换到HSL第一和HSL值,你得到一个更好的结果(ESP非常光明与黑暗的颜色)的欧氏距离计算

]的RGB LT - GT; HSL的转换
评论会员:coleydog 时间:2011/12/07
的事情之一。它导致的。

我敢打赌,你永远猜不到...
我的问题是与Citrix和客户端PC的颜色深度。
思杰客户端运行在8位颜色与我发展笔记本电脑在32位色。

问题是,这几乎是不可能找到一回的色彩控制,不会出现"哈希"下的8位屏幕色彩(文本几乎不可读)在Citrix客户端。

我希望,Web颜色列表中会反映实际的颜色,工作在8位深度的Citrix客户端上。

我会让你知道。
评论会员:威利Deutschmann 时间:2011/12/07
您好,
如果我可以提出两点建议,可以加快你的代码只是一个小。

1。如果你遇到一个"0"距离,你可以打破循环和返回,非常的颜色 - 你不会得到任何比这更接近...

2。您不需要计算平方根。这是当然的距离数学上正确的方法,但你只是寻找一个最低值,也就是说,你只有这些数字来比较彼此之间并没有一个具体的参考距离。此外 - 但我不是100%肯定 - 你可以尝试更换一个简单的"Math.Abs​​""Math.Pow"



7天没有咖啡一弱
评论会员:。_vt_ 时间:2011/12/07
!喜

感谢您的建议。我会尽快实施的第一个。第二个...我会去想它。我爱欧几里德几何,所以它是非常难作出决定... ...



谢谢!



*************************{ BR}这样做,UT DES
评论会员:。西奥Lagendijk 时间:2011/12/07
嗨威利,

关于建议2,平方色差分量的总和((R1 - R2)^ 2(G1 - G2)^ 2(B1 - B2)^ 2)的距离,为更好地衡量的颜色之间的颜色比的总和距离的绝对值。
当您使用Math.Abs​​的方法一双颜色((R,G,B),(R,G 4,B 4))((R,G,B),(R 12的相同颜色的距离,G,B)),而第一对颜色直观地接近。使用Math.Pow解决这个
评论会员:。威利Deutschmann 时间:2011/12/07
你说得对,西奥。使用Math.Abs​​是不是一个好主意(我仍然认为你不需要这里最终的sqrt)。

如何取代"Math.Pow(X,2.0)"与"X * X"?我记得,在C,这是一个在速度上的巨大差异。我从来没有在C#中测试。 Ÿ见解?

7天没有咖啡,一弱
评论会员:。西奥Lagendijk 时间:2011/12/07
喜Wili,

"7天无咖啡之一弱。"我可以向你保证,7天了太多的咖啡有同样的效果。

我认为,X * x是快Math.Pow(X,2.0)。
(因为x * x节省您的整数转换成至一倍的麻烦,然后调用pow函数。)
但我只是发现了它已经测试{A4}]"和"是",如果你有多个计算做,这是一个巨大的性能增益,使用X * X而不是Math.Pow。 (2144ms 555ms VS%计算。NET 3.5)

确实可以跳过最后的平方根。那么你不再计算"正确"的(但这些平方)欧氏距离,但是,只要你用这种方法计算的颜色距离始终你有一个很好的指标,使颜色的距离之间的比较或找到确切匹配的颜色

顺便说一句你碰巧知道多少距离的颜色值之前必须有一个人开始注意
评论会员:?威利Deutschmann 时间:2011/12/07
颜色是一个非常复杂的领域,我可能知道位(尽可能为我的职业需要) ,但我不是专家。
简短的回答你的问题是没有,我不知道该值之前,人类开始注意到差异。

不过,如果你看颜色和它的存储方式,有许多方法来描述一种颜色。在这里,我们的RGB,这实际上是对人类不是很直观,但电脑和显示器等就派上用场了,因为他们碰巧为每个光源,红色,绿色和蓝色。
一个更好的办法可能是对人类的HSL色彩空间(色调,饱和度,亮度)。我们知道,从先进的色彩采摘,例如在摄影店。色调是代表一个圆,开始在红,黄,绿,青,蓝,洋红,然后红色,再次改变。圆的半径则代表饱和度(色彩浓厚,而grey'ish,或者它代表了亮度。
在这里,人类的感知越少的重要组成部分,是饱和度和色相明度的部分(大概是为什么仍然具有吸引力,"真正的"灰色图像。)是escpecially敏感。
JPG例如需要利用这一点,分裂成这三个部分的图像,然后压缩与信息的丢失和更仔细的灰色部分的色调和饱和度的一部分。您可以尝试自己动手,采取图片,保存为JPG中等质量。看起来还是应该确定整体。但是,现在提取的色调通道,看看那个分开。看起来很可怕!到低分辨率的彩色图像,吹他们,然后他们结合高分辨率的灰度图像,航拍图像(例如,在谷歌地图/地球)也采取这样做的好处 - 被称为泛锐化

使问题更加复杂,这也取决于你正在看的图像。如果图像是忙/嘈杂的开始与您将能够得到一个更大的阈值,如果你有平滑的色彩,甚至微小的变化较为突出的坡道(碧空如洗)

回到你的问题,在RGB空间,我会感到惊讶,如果有一个全局有效的阈值。如果你去到HSL的空间,那就要看的频道,H,S或L
我没有一个例子,现在,但我非常有信心,你会发现这是"更远"比在RGB空间的颜色,但具有更大的相似性在人类感知。

7天没有咖啡,一弱
评论会员:。吉拉德Kapelushnik 时间:2011/12/07
一对夫妇多年以前劳顾会是市场上最喜爱的方法,今天有更好的standars,
评论会员:_vt_ 时间:2011/12/07
谢谢你为你对此有何评论

好了 - 这是我第一次尝试,贡献一些轻微/ usefull代码给社区。我认为这种方法是有用的 - 尤其是"乐趣程序员"。 - 当然有很多的算法能够处理好这个问题。也许我会后一个更复杂的解决方案。 {S2}



这样做,UT DES
评论会员:。JohnnyLocust 时间:2011/12/07
欧氏距离是用于着色语言HLSL和GLSL,如经常。