2017-04-15 2 views
1

Ich habe ein Programm, das ein Bild aufnimmt und dann die RGB-Werte eines Teils der Pixel bestimmt, an denen ich interessiert bin. Ich nehme das durchschnittliche RGB der Regionen und setze diese in ein Array. Was ich tun möchte, ist, durch dieses Array zu gehen und basierend auf seinem RGB-Wert zu sagen, dass es zum Beispiel "Orange" ist. Ich möchte dies tun, ohne die RGB-Werte so zu beschränken. if(r > 10 && g < 200 && b < 200) color is green. Der Grund dafür ist, dass sich die Beleuchtung im Bild stark verändern kann. Es könnte also außerhalb der Reichweite liegen, wenn ich strenge Beschränkungen gebe. Ich versuche darüber nachzudenken, wie man es macht, so dass es dynamisch ist und unabhängig von der Beleuchtung auf dem Foto funktioniert.So bestimmen Sie Farben in einem Array in Java

Dies ist nicht wirklich ein Code-Problem Ich versuche, Wege zu finden, wie ich das lösen kann. Ich kann mir keine anderen Möglichkeiten vorstellen, dies zu tun, ohne Einschränkungen zu benutzen, wie ich oben erwähnt habe, weshalb ich hierher gekommen bin.

Hier ist ein Beispiel für ein Farbfeld. (Es gibt 24 Farben drin)

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]] 

So ist der erste 4-Indizes im Array Karte würde ["Green","Green","Green","Green"]

+0

Zum Beispiel durch Ihre Definition, R = 11, g = 199, b = 11 rot ist, aber es sieht grün ich –

+0

Es ist ein Beispiel, ist es nicht praktisch, ich war gerade mit es zu erklären, was ich gesagt habe. @HovercraftFullOfEels – cuber

+0

Was ergibt keinen Sinn? Mit Einschränkungen bestimmen, was jede Farbe ist? @HovercraftFullOfEels – cuber

Antwort

2

Antwort Cuz Kommentar nicht.

Wenn Sie denken, alle r, g, b und alpha zu überprüfen, wird zu viele Prozesse für die Verarbeitung benötigen und würde Zeit brauchen. Du hast also recht. Aber Sie liegen falsch, da diese Arbeit so einfach wie ABC für ein OpenCL/CUDA (oder allgemein GPGPU) Programm sein wird.

Eine Lösung könnte die RGB Form HSL Form wird die Umwandlung und einfach die L-100% ändern und sie wieder zurück konvertieren zu RGB
Zum Beispiel gegebene Farbe [3,50,2] in rgb Form, die ein dunkelgrün sein könnte, die HSL-Wert ist [119,96,20]
Ändern Sie jetzt den Wert L in 100% und konvertieren Sie den Wert zurück in RGB, also [14,255,10]. So, jetzt ist es einfach bereit für Ihre Constraint-Prüfung, wie Sie erwähnt haben.

Eine andere Lösung könnte den Constraint-Wert in etwas relativ zu Min- und Max-Werten der gegebenen Farbe ändern.
zum Beispiel, nicht davon ausgehen, dass die g über 200 sein muss, um die Farbe als grün zu markieren, stattdessen findet die max und min aller r, g und b-Werte, und jetzt überprüfen, ob die g mehr als 70% von max Wert.
Beispiel (EDIT):
Gegebene Farbwert als [3,50,2]. Anstatt nun den minimalen Wert für die Überprüfung einer Farbe (hier const 200) anzunehmen, wird der Maximalwert der gegebenen Farbe (der hier 50 ist) gefunden und der Minimalwert von 70% (oder irgendetwas) von max val angenommen. Überprüfen Sie das Beispiel unten.

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 
+0

Ich mag deine zweite Lösung. Könntest du ein wenig mehr darüber erklären, wie ich meine Marker relativieren könnte? mit min max der Farben? – cuber

+0

aktualisiert mit einer einfachen Probe, aber ich schlage die erste Lösung vor, die genauer und viel einfacher ist @ cuber –

+0

Ok Ich werde die erste Lösung verwenden, die Sie angegeben haben. Was also tun würde ist Iterieren durch das Farb-Array ändern Sie die RGB zu HSL. Die Helligkeit erhöhen? Dann zurück zu RGB und dann kann ich meine Einschränkungen verwenden? – cuber

Verwandte Themen