如何在Java中确定数组中的颜色

时间:2017-04-15 21:38:02

标签: java arrays colors

我有一个拍摄照片的程序然后确定我感兴趣的部分像素的RGB值。我取区域的平均RGB并将它们放在一个数组中。我想要做的是通过该数组并根据其RGB值说出它是例如“橙色”。我想这样做而不会像这样约束RGB值。 if(r > 10 && g < 200 && b < 200) color is green.原因是图像中的光线可能会发生很大变化。因此,如果我给予它严格的约束,它可能会超出范围。我正在考虑如何做到这一点,以便它是动态的,无论照片中的灯光如何都可以使用。

这不是一个真正的代码问题我试图想办法如何解决这个问题。似乎没有考虑其他方法,如上所述我没有使用约束,这就是我来到这里的原因。

以下是颜色数组的示例。 (它有24种颜色)

Color Array: [java.awt.Color[r=6,g=115,b=77], java.awt.Color[r=6,g=115,b=77], java.awt.Color[r=6,g=115,b=77], java.awt.Color[r=6,g=115,b=77], java.awt.Color[r=248,g=184,b=40], java.awt.Color[r=241,g=26,b=27], java.awt.Color[r=0,g=38,b=183], java.awt.Color[r=0,g=38,b=183], java.awt.Color[r=178,g=168,b=204], java.awt.Color[r=198,g=148,b=22], java.awt.Color[r=185,g=140,b=6], java.awt.Color[r=0,g=38,b=183], java.awt.Color[r=241,g=26,b=27], java.awt.Color[r=236,g=212,b=255], java.awt.Color[r=237,g=70,b=20], java.awt.Color[r=237,g=70,b=20], java.awt.Color[r=237,g=70,b=20], java.awt.Color[r=237,g=70,b=20], java.awt.Color[r=0,g=38,b=183], java.awt.Color[r=236,g=212,b=255], java.awt.Color[r=241,g=26,b=27], java.awt.Color[r=255,g=189,b=71], java.awt.Color[r=241,g=26,b=27], java.awt.Color[r=236,g=212,b=255]]

因此数组中的前4个索引将映射到["Green","Green","Green","Green"]

1 个答案:

答案 0 :(得分:2)

回答cuz无法发表评论。

如果您认为检查所有r,g,b和alpha将需要太多的处理过程并且需要时间。所以你是对的。但你错了,因为这项工作对于OpenCL / CUDA(或通常是GPGPU)程序来说就像ABC一样简单。

一种解决方案是将RGB表单转换为HSL表单,只需将L更改为100%,然后再将其转换为RGB <登记/> 例如,给定rgb形式的颜色[3,50,2](可能是深绿色),HSL值为[119,96,20]
现在将L值更改为100%,然后将值转换回RGB,即[14,255,10]。所以现在它就像你提到的那样准备好进行约束检查了。

另一种解决方案是将约束值更改为相对于给定颜色的最小值和最大值的某些值 例如,不要假设g必须超过200才能将颜色标记为绿色,而是查找所有r,g和b值的最大值和最小值,现在检查是否g的最大值超过70% 样品(编辑):
给定颜色值为[3,50,2]。现在不是假设检查颜色的最小值(这里是const 200),而是找到给定颜色的最大值(这里是50)并假设最小值为70%(或任何)最大值。检查下面的样本。

int given_color=0x00033202;//3,50,2 in ARGB form in hex
int relative_max=(given_color&0xff);//not 200, default assume blue is max
int relative_min=(given_color&0xff);//not 200, default assume blue is min
int tmp;
for(int a=8;a<=16;a+=8){//check for red and green too
 tmp=(given_color>>a)&0xff;
 if(tmp<relative_min){relative_min=tmp;}
 if(tmp>relative_max){relative_max=tmp;}
}//now you have max and min of given color, here 50 and 2
//now assume the 74% of real max value is const val 200
//and the value you want to check for color
relative_max*=0.74;
relative_min*=0.74;
//now check over real amx and rel min over const values
if( (r<relative_min) && (g>relative_max) && (b>relative_max) ){}//could be cyan
//...etc