# Erkennen von roten Pixeln



## Guest (13. Jun 2008)

Hi,

Ich stehe grad von einem kleinen Problem. Ich muss von einem BufferedImage-Objekt alle Bildpunkte finden, welche für uns Menschen Rot aussehen. Dazu verwende ich folgende Methode:


```
private boolean isRedColor(Color pixelColor) {
        double minPercentage = 42.5d;
        int colorSum = actualColor.getRed() + actualColor.getGreen() + actualColor.getBlue();

        if (colorSum == 0) // black - if not checked here there could be a div/null below
        {
            return false;
        }

        double percentageRed = 100.0 / colorSum * actualColor.getRed();

        if (percentageRed > minPercentage) {
            return true;
        }
   
        return false;
    }
```

Ich prüfe einfach, ob der Rotanteil bei einem Pixel mindestens 42.5% beträgt. Dies funktioniert zwar meistens gut, aber leider erkennt er damit leider auch teilweise klar nicht-Rote Punkte. 

Kennt ihr eine verlässliche Methode, wie man das zuverlässig machen kann?

Thanks!
Smudo


----------



## SlaterB (14. Jun 2008)

wow, eine Operation für menschliche Interpretation,
da hast du ja ne Suche vor dir,

ich würde deinen bisherigen Weg voranschreiten, 
wenn die 42%-Regel meist klappt, dann ist das doch gut,

nun findest du noch einige Konstellationen, bei denen das nicht hinhaut,
untersuche die doch näher, warum das so ist,

vielleicht ist das Problem, dass ein anderer Farbbereich > 50% liegt, 
schließe sowas aus und du bist dem Optimum näher


----------



## Guest (14. Jun 2008)

Es gibt doch diverse Darstellungsarten vom gesamten RGB-Farbraum. In diesen Darstellungen (z.B. bei einem RGB-Würfel) sind die roten Farben alle in einem bestimmten Bereich eines Würfeleckens. Ich würde da gerne einen bestimmten Bereich selektieren und ausrechnen, ob der Farbwert eines Bildpunktes in diesem Bereich liegt. Ich weiss aber nicht, wie ich das anstellen soll.


----------



## Illuvatar (14. Jun 2008)

Also wenn ich mir die Würfel hier so anschaue:
http://de.wikipedia.org/wiki/RGB-Farbraum

Da könntest du ja eigentlich den Abstand zur "roten Ecke" bestimmen. Der wäre ja dann

```
sqrt ((255-r)² + b² + g²)
```
Und dann musst du den Wert mit einem Grenzwert vergleichen.

Das Auge nimmt aber eben manche Farben intensiver wahr als andere. Vielleicht kannst du da noch mit ein paar Faktoren korrigieren, aber das ist dann nichts mehr wo man auf eine einfache Formel kommt, sondern halt eher auf sowas.


----------



## Guest (14. Jun 2008)

Danke für die Vorschläge. Werde es mal so versuchen.


----------



## Campino (14. Jun 2008)

Mit dem HSV- Modell wird dir eine Farbe als Farbton (Farbwinkel H), Sättigung (S in Prozent) und Helligkeit (V in Prozent) angegeben. Aus Colorobjekten bekommt man auch solche Angaben. Genaueres erklärt die Wikipedia http://de.wikipedia.org/wiki/HSV-Farbraum. 

Wenn der Farbwinkel H hier zwischen ~30° (>30° wird orange) und ~330° (>330° wird violett) liegt und die Sättigung bei ~70%, erscheint der Punkt rot. Du müsstest nochmal ausprobieren, wieviel Helligkeit notwendig ist. 

(Im Übrigen ist Farbwahrnehmung immer subjektiv. Ein Künstler mit geschultem Age entdeckt auch bei H=360, S=100 und H=20 noch einen Rotanteil, für Leute mit weniger scharfen Augen ist das einfach nur schwarz...).


----------



## Marco13 (14. Jun 2008)

Wahrscheinlich erkennt er auch Punkte, die "fast schwarz" sind. Falls ich das richtig überflogen(!) habe, wird ja jetzt z.B. ein Pixel mit RGB = 2,1,1 schon als "rot" angesehen.

Du solltest dir auf jeden Fall mal http://de.wikipedia.org/wiki/HSV-Farbraum ansehen. (Die Color-Klasse bietet auch Methoden an, um sich die HSV (oder HSB-Values) zu holen: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html#RGBtoHSB(int,%20int,%20int,%20float[]) ) Dort kannst du die Frage, was "Rot" ist, viel leichter definieren. Zum Beispiel:
hue ist "nahe 0 oder 1" (d.h. hue<0.1 oder hue>0.9)
saturation ist größer als 0.25
brightness ist größer als 0.5

Insbesondere der Hue-Wert ist praktisch, weil man damit (auch unabhängig von der Helligkeit) nur den Farb_ton_ beschreibt - also man damit (wenn man will!) auch leicht Farben erkennen kann, die ein Mensch vielleicht nur "rötlich" nennen würde.


----------



## Marco13 (14. Jun 2008)

Häch .. 3 Minuten....  :roll:


----------



## Guest (15. Jun 2008)

Wow, sehr interessant. Ihr scheint damit schon eure Erfahrung gemacht zu haben. Werde das mit dem HSV-Farbraum mal ausprobieren und vergleichen.


----------

