Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen

cupcoffee

Mitglied
Guten Tag an alle,
ich habe folgende Frage:
Aus einem bunten Bild ein Grauwert-Bild zu erstellen, ist mir gelungen.
Das Prinzip, der Falschfarbenzuordnung ist mir auch bekannt.
Nur bekomme ich das nicht in einen Algorithmus verfasst und ich habe keine Idee, wie
ich die jeweiligen Werte der Farben ansprechen kann. Kann mir da jemand helfen?
 

Anhänge

  • 1597406141601.png
    1597406141601.png
    10 KB · Aufrufe: 22
  • 1597406887846.png
    1597406887846.png
    88,5 KB · Aufrufe: 26

cupcoffee

Mitglied
Der Grauwert 50 müsste dann R(0), G(0) und B(255) bekommen.
Der Grauwert 200 bekommt dann R(255), G(0), und B(0).
Oder bekommen hier nur die Grauwerte 0, 127 und 255 Farben zugewiesen?
 

temi

Top Contributor
Ich hab mich nicht mit dem Thema Falschfarbenzuordnung beschäftigt und mir nur das Bild mit den Zuordnungspfeilen angeschaut.

Da von Grau(0) und von Grau(127) ein Pfeil zu Rot(0) geht, würde ich es so interpretieren, dass Grau (0 - 127) als Rot(0) zugeordnet werden und Grau(128 - 255) dem gesamten Bereich von Rot (1 - 255). Das muss man dann halt entsprechend strecken (umrechnen). Die beiden anderen Farben entsprechend. Keine Ahnung, ob ich damit richtig liege.
 

mihe7

Top Contributor
So hätte ich das auch gesehen:
Java:
Color color(int value) {
    int blue = 255 - 255 * Math.min(value, 127) / 127;
    int red = 255 * Math.max(value - 127, 0) / 128;
    int green = 255 - blue - red;
    return new Color(red, green, blue);
};
 

cupcoffee

Mitglied
Guten Morgen,
das Bild bleibt leider grau. Ich weiß nicht, wie man die neuen Werte der Farben in das neue Bild ausgibt.
Mit "Main.image.setRGB(c,x,y) soll mit den neuen Farben in das neue Bild erstellt werden.
1597563291932.png
 

mihe7

Top Contributor
Naja, wenn Du value auf 0 statt auf den Grauwert setzt, brauchst Du Dich nicht zu wundern. Das Bild dürfte allerdings nicht grau sein, sondern müsste blau sein.
 

mihe7

Top Contributor
Für Code bitte Code-Tags und keine Screenshots verwenden (die drei Punkte neben dem Smiley -> Code -> Java -> ins Textfeld kopieren).

value = Main.image.getRGB(x,y).getRed();
 

cupcoffee

Mitglied
Also mit Main.image.getRGB(x,y).getRed(); klappt leider nicht.

Code:
public static void graytorgb()                           
    {
        for (int x = 0; x < image.getTileWidth(); x++)
        {
            for (int y = 0; y < image.getHeight(); y++)
            {
                int blue = 255 - 255 * Math.min( Main.image.getRGB(x, y)getBlue() , 127) / 127;
                int red = 255 * Math.max( Main.image.getRGB(x, y)getRed() - 127, 0) / 128;
                int green = 255 - blue - red;
                Color c = new Color(red, green, blue);
                Main.image.setRGB(x,y, c.getRGB());
            }
        }
    }
"Cannot invoke getRed() on the primitve type int" Ist hier der Datentyp falsch, also der Bereich zu klein? Integer ist doch mehr als groß genug dafür.
 

cupcoffee

Mitglied
Alles klar, jetzt komme ich der Sache näher.
Kannst du mir bitte erklären, was es damit auf sich hat:
Code:
& 0xff
?
1597577148958.png
 

mihe7

Top Contributor
Kannst du mir bitte erklären, was es damit auf sich hat:
getRGB() liefert eine 32-Bit Ganzzahl, in der die Farbe kodiert wird. In hexadezimaler Notation etwa 0xRRGGBB, wobei RR, GG und BB natürlich für die jeweiligen Werte der betreffenden Grundfarben steht.

& ist der Operator für das binäre Und. 0xff ist die hexadezimale Schreibweise für 255, also gerade die Zahl, in der die niederwertigsten 8 Bit gesetzt sind. Zusammen ergibt das dann
Code:
  0xRRGGBB
& 0x0000FF
----------
  0x0000BB
D. h. mit getRGB() & 0xff wird der Blau-Wert ermittelt. Da im Graustufenbild die Werte aller drei Farbkanäle gleich sind, spielt es keine Rolle, welchen man nimmt.
 

Neue Themen


Oben