gpt4 book ai didi

java - 使 RGB 获得最接近的颜色算法更准确

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:13 26 4
gpt4 key购买 nike

我已经创建了一个巨大的颜色列表,其中包含名称和 RGB 值(花了很长时间),现在我已经创建了一个算法,可以将相应的颜色获取到最接近的值。

它似乎工作得很好,但有时当有一个完全不正确的奇数值时,它会得到错误的颜色。

示例输出

Log: InputRGB: R:7.1009636 | G:83.84344 | B:2.5013387
Log: ColorToCompare: Ball Blue (R13.0,G67.0,B80.0) CLOSE:0.4588677 | CurrentColor: Acid Green CLOSE: 0.41585693
Log: ColorToCompare: Bitter Lemon (R79.0,G88.0,B5.0) CLOSE:0.5143066 | CurrentColor: Ball Blue CLOSE: 0.4588677
Log: ColorToCompare: Citrine (R89.0,G82.0,B4.0) CLOSE:0.5610447 | CurrentColor: Bitter Lemon CLOSE: 0.5143066
Log: ColorToCompare: Smoky Black (R6.0,G5.0,B3.0) CLOSE:0.57945675 | CurrentColor: Citrine CLOSE: 0.5610447
Log: ColorName:Smoky Black
Log: End Color: R:6.0 G:5.0 B:3.0
Log: InputRGB: R:7.1009636 | G:83.84344 | B:2.5013387

我为计算这个而创建的代码:

   public String getClosetColor(float red, float green, float blue){

Functions.log("InputRGB: R:" + red + " | G:" + green + " | B:" + blue);

Color lastColor = null;
for(Color eachColor : this.colors)
{
if(lastColor == null){
lastColor = eachColor;
}

float lastColorCloseness = (getClose(red, lastColor.red) + getClose(green, lastColor.green) + getClose(blue, lastColor.blue)) / 3f;
float thisColorCloseness = (getClose(red, eachColor.red) + getClose(green, eachColor.green) + getClose(blue, eachColor.blue)) / 3f;

if(Float.isFinite(thisColorCloseness) && Float.isFinite(lastColorCloseness))
{
//If they are the same, choose a random one.
if(lastColorCloseness == thisColorCloseness){
if(MathUtils.random() > 0.5f){
lastColor = eachColor;
}
}
//If this one is greater then set it.
else if(thisColorCloseness > lastColorCloseness){
Functions.log(
"ColorToCompare: " + eachColor.nameOfColor + " (R" + eachColor.red + ",G" + eachColor.green + ",B" + eachColor.blue + ") CLOSE:" + thisColorCloseness +
" | CurrentColor: " + lastColor.nameOfColor + " CLOSE: " + lastColorCloseness
);

lastColor = eachColor;
}
}
}

Functions.log("ColorName:" + lastColor.nameOfColor);
Functions.log("End Color: R:" + lastColor.red + " G:" + lastColor.green + " B:" + lastColor.blue);
Functions.log("InputRGB: R:" + red + " | G:" + green + " | B:" + blue);

return "";
}

//Basically if one is higher than the other then devide by it.
private float getClose(float firstNumber, float secondNumber){
if(firstNumber < secondNumber){
return firstNumber / secondNumber;
}
else{
return secondNumber / firstNumber;
}
}

最佳答案

我不知道你是怎么想出你的距离函数的,但它有点尴尬。让我解释一下:

你使用颜色的比例而不是像这样的差异:

float lastColorCloseness = (getClose(red, lastColor.red) + getClose(green, lastColor.green) + getClose(blue, lastColor.blue)) / 3f;

这会产生奇怪的效果,即不会对等距离的颜色应用等距离的颜色。例如比较 col1(100, 50, 200)col2(50, 100, 150)col3(150, 100, 250) .

好吧,假设 col2col3距离col1等于:

abs(100-50)+abs(50-100)+abs(200-150)=150
abs(100-150)+abs(50-100)+abs(200-250)=150

你的距离函数给出了不同的结果:

(50/100+50/100+150/250)/3=0.53
(50/100+50/100+200/250)/3=0.6

正如@David Wallace 所提到的,这并不是最夸张的结果。请改用像欧几里德这样的距离函数。

关于java - 使 RGB 获得最接近的颜色算法更准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25620837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com