2015-08-12 4 views
15

Ich versuche zu testen, ob ein Pixel blau ist oder nicht.So definieren Sie einen klaren Bereich für die Pixelfarbe

Zum Beispiel: Die blaue Farbe ist in RGB definiert als rgb (0,0,255). Typische Farbtiefen sind 8 Bit (256 Farben), 16 Bit (ca. 65.000), 24 Bit (ca. 16 Millionen) und 32 Bit (über 4 Milliarden verschiedene Farben). Es gibt also deutlich mehr als 1 Blauton.

Wie definiere ich den Bereich der blauen Farbe und Test für jedes Pixel, wenn es blau ist oder nicht? Und was muss ich bei den verschiedenen Tiefen beachten?

bisher Mein Code ist:

BufferedImage image = ImageIO.read(file); 

// Getting pixel color by position x and y 
for (int i = 0; i < image.getWidth(); i++) { 
    for (int j = 0; j < image.getHeight(); j++) { 
     int clr = image.getRGB(i, j); 

Anmerkung 1:

http://www.workwithcolor.com/cyan-blue-color-hue-range-01.htm

Das Problem hier ist, was zwischen den Farbstufen ist in?

Ein Beispiel wäre großartig.

Anmerkung 2:

ich gerade einen Vortrag über das Thema fand ich interessiert bin:

http://cstwiki.wtb.tue.nl/images/06-opencv.pdf

Auf Seite 13 wir die Definition von rot sehen . Aber wie können Sie die anderen Farben definieren?

+1

Zuerst dachte ich, Sie könnten nur für RGB-Farben Bereich einstellen, aber das wird nicht funktionieren. Wie Sie auf der Farbtabelle sehen können: http://2.bp.blogspot.com/_DmvFk3aIxDI/S9Kbb5BOjEI/AAAAAAAAADk/MVrj60t6ec8/s1600/cc.png blau beginnt bei # 000066 und # 66FFFF ist immer noch blau. Aber nicht alles dazwischen ist blau. –

+0

Ich fand dies: http://stackoverflow.com/questions/30361786/how-to-tell-visible-color-from-rgb-values ​​ helfen sollte. –

+0

Nein, tut es nicht! Wenn Sie den Wert von Blau in HUE wählen, können Sie die Parameter Sättigung und Wert/Helligkeit so ändern, dass Sie kein Blau mehr sehen. Versuchen Sie es hier: http://colorizer.org/ –

Antwort

8

Meiner Meinung nach ist es am einfachsten, das Farbformat in HSV/HSB zu konvertieren und dann den blauen Bereich für Hue auszuwählen. Der genaue Bereich kann ein Problem sein, aber ich verwende meistens von 165 (unten ist grün) bis 240 (oben ist lila/violett). Sättigung und Wert/Helligkeit steuert nur Schattierungen, aber beachten Sie, dass Sättigung nahe 0 eher grau mit etwas Blaustich und Wert nahe 0 fast schwarz wäre. Aus diesem Grund können Sie auch die Sättigung auf> 10 und den Wert> 15 überprüfen, aber natürlich können Sie Ihre eigenen Werte nach Ihren Bedürfnissen auswählen.

Beispielcode (nicht getestet):

boolean isBlue(int rgb){ 
    Color color = new Color(rgb); 
    float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); 
    // now [0] is hue, [1] saturation and [2] value/brightness 
    // all values are between 0 and 1 so you must divide hue by 360 and others by 100 
    if(hsb[0] > 165/360 && hsb[0] < 240/360 && hsb[1] > 0.1 && hsb[2] > 0.15) 
     return true; 
    return false; 
} 

Wiki about HSV

RGBtoHSB javadoc

Color picker to check colors in different systems

+0

Ja, das ist wahrscheinlich eine gewöhnliche Annäherung. Ich war immer noch auf der Suche nach einer Möglichkeit, die "Auswahl eigener Werte für die eigenen Bedürfnisse" zu umgehen. –

+1

Nun, die schwierige Frage ist hier, was genau Sie brauchen. Wenn Sie dunklen und "trüben" Tönen folgen möchten, stellen Sie sowohl die Sättigung als auch den Wert auf mehr als 50 (oder 0,5 im Code) ein. Im vorherigen Kommentar hast du vorgeschlagen, dass du nach 'clear sky' suchst, es ist wahrscheinlich irgendwo von Navy bis niedrig gesättigtem Cyan, also würde ich versuchen mit Sättigung> 25 (unten ist zu 'bewölkt') und Wert> 50 (unten ist es eher Nachthimmel Töne). In der Antwort lieferte ich eine eher universelle Blaudefinition von dunklen bis hellen Tönen und von Türkis bis Indigo. – xnor

+1

@ JürgenK. Wenn Sie Ihre eigene Definition von Blau haben, fügen Sie sie bitte zu Ihrer Frage hinzu. Wenn Sie die Leute bitten, eine Farbe für Sie zu definieren, erhalten Sie ihre eigene ungefähre Definition. Und in manchen Situationen sehen die Leute [ein blaues Kleid als weiß] (https://en.wikipedia.org/wiki/The_dress). –

0

Technisch unten sollte die Umsetzung für Blautöne sein.

boolean isBlueShade(int r, int g, int b) 
{ 
    return (r == g) && (r != b); 
} 

Wir können argumentieren, dass CYAN auch blau ist. Aber technisch gesehen ist das nicht blau. Wenn Ihre Anwendung einige verwandte Farben benötigt, um blau zu sein, dann fügen Sie die obige Methodenimplementierung hinzu, um diese Bereichsüberprüfung einzuschließen.

Ich bearbeite nur die obige Methode, nur um zu kommunizieren, was ich klar dachte, obwohl es nicht die erwartete Lösung ist.

+0

Dies ist keine Antwort auf die Frage überhaupt. die Frage ist, wie man die Reichweitenprüfung für blaue Farbe definiert –

+1

Basing auf dieser Definition weiß und schwarz oder sogar Graustufen ist auch blau. RGB ist nicht das intuitive Modell, das zur Unterscheidung von Farben verwendet werden kann. – xnor

4

Im RGB-Farbraum ist dies nicht einfach. Zum einen ist die Art und Weise, wie Farben angezeigt werden, geräteabhängig, dh der RGB-Wert, den Sie auswählen, kann auf verschiedenen Bildschirmen unterschiedlich aussehen. Aber selbst wenn dies irgendwie kontrolliert werden kann, nehmen die Farben, denen spezifische Namen im Englischen zugewiesen wurden, nicht unbedingt das gleiche Volumen innerhalb des RGB-Farbwürfels auf, weder hinsichtlich der Größe noch der Form. Aus diesem Grund gibt es einige Farbmodelle, die versuchen, die menschliche Wahrnehmung Wahrnehmung von Farben.

Ein Kandidat dafür ist der CIELab Farbraum. Das "Lab" bezieht sich darauf, wie Farben in diesem Modell dargestellt werden: über Helligkeit L der Farbe, die Position der Farbe auf der rot/magenta und grünen Achse (a) und ihre Position auf der gelben und blauen Achse (b). Leider gibt es keine einfachen Formeln für die Konvertierung zwischen RGB- oder CMYK-Werten und L a b *, da die RGB- und CMYK-Farbmodelle geräteabhängig sind. Die RGB- oder CMYK-Werte müssen zuerst in einen bestimmten absoluten Farbraum umgewandelt werden, z. B. sRGB oder Adobe RGB. Diese Anpassung wird geräteabhängig sein, aber die resultierenden Daten von der Transformation werden geräteunabhängig sein.

Verwandte Themen