Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert

internet

Top Contributor
Hallo,

ich bin gerade dabei ein Bild mit einem Greenscreen Hintergrund mit einem neuen Hintergrund zu ersetzen.
So wie hier:

Leider schaffe ich es nicht alle grünen Pixel zu ersetzen, es fehlt also noch etwas an der Feinheit...
Was fehlt hier, sodass es 100% ist?
Ich müsstes auch den Schatten betrachten. Wie kann ich das machen?

Hier mal mein Code

Java:
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;

public class GreenscreenTest {

    public static void main(String[] args) throws IOException {

        // Info to give to greenscreen
        String output = "/output.jpg";
        String fgName = "/test.jpg";
        String bgName = "/backgroundReplace.jpg";
        int tolerance = 20;
        int x = 0;
        int y = 0;


        // Greenscreen that thing
        BufferedImage screenedImage = GreenscreenFunction.generateGreenscreen(fgName, bgName, tolerance, x, y);

        // Save file
        File outfile = new File(output);
        try {
            ImageIO.write(screenedImage, "jpg", outfile);

            System.out.println("DONE");

        } catch (IOException e) {
            System.out.println("Error saving image.");
        }
    }
}


import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;

/**
 */
public class GreenscreenFunction {

    /**
     * Laden des Images
     *
     * @param file
     * @return
     */
    protected static BufferedImage loadImage(String file) {

        // Loads an image
        BufferedImage image = null;

        try {
            image = ImageIO.read(new File(file));
        } catch (IOException e) {
            System.out.println("Eror opening image: " + file);
            return null;
        }

        // Wait for image to load
        MediaTracker tracker = new MediaTracker(new Component() {
        });
        tracker.addImage(image, 0);
        try {
            tracker.waitForID(0);
        } catch (InterruptedException e) {
        }

        return image;
    }

    /**
     * Mit Files
     *
     * @param originalFilePath
     * @param backgroundFilePath
     * @param tolerance
     * @param xExample
     * @param yExample
     * @return
     */
    public static BufferedImage generateGreenscreen(String originalFilePath, String backgroundFilePath, int tolerance,
            int xExample, int yExample) {

        BufferedImage foreground = loadImage(originalFilePath);
        BufferedImage background = loadImage(backgroundFilePath);

        BufferedImage newBufferedImage = generateGreenscreen(foreground, background, tolerance, xExample, yExample);

        return newBufferedImage;
    }

    /**
     * Return BufferedImage for replaced picture
     *
     * @param originalFilePath
     * @param backgroundFilePath
     * @param tolerance
     * @return
     */
    public static BufferedImage generateGreenscreen(BufferedImage foreground, BufferedImage background, int tolerance,
            int xExample, int yExample) {

        int sampleRGB = foreground.getRGB(xExample, yExample);

        // Will hold RGB values at a particular pixel
        int xyRGB;
        int alpha;
        int red;
        int green;
        int blue;

        // RGB values of our sample
        int sampleAlpha = (sampleRGB >> 24) & 0xFF;
        int sampleRed = (sampleRGB >> 16) & 0xFF;
        int sampleGreen = (sampleRGB >> 8) & 0xFF;
        int sampleBlue = sampleRGB & 0xFF;

        // Total difference between two colors
        int totalDiff = 0;

        // Was the last pixel replaced?
        boolean leftReplaced = false;

        // Iterate through each pixel
        for (int y = 0; y < foreground.getHeight(); y++) {
            for (int x = 0; x < foreground.getWidth(); x++) {
                xyRGB = foreground.getRGB(x, y);
                alpha = (xyRGB >> 24) & 0xFF;
                red = (xyRGB >> 16) & 0xFF;
                green = (xyRGB >> 8) & 0xFF;
                blue = xyRGB & 0xFF;

                // If we just did xyRGB - sampleRGB,
                // Alpha differences would be weighted more than red, etc.
                totalDiff = Math.abs(sampleAlpha - alpha) + Math.abs(sampleRed - red) + Math.abs(sampleGreen - green)
                        + Math.abs(sampleBlue - blue);

                if (leftReplaced) {
                    if (totalDiff < tolerance) {
                        foreground.setRGB(x, y, background.getRGB(x, y));
                        leftReplaced = true;
                    } else {
                        leftReplaced = false;
                    }
                } else {
                    if (1.5 * totalDiff < tolerance) {
                        foreground.setRGB(x, y, background.getRGB(x, y));
                        leftReplaced = true;
                    } else {
                        leftReplaced = false;
                    }
                }
            }
        }

        return foreground;
    }
}

Als Beispiel habe ich die zwei Bilder verwendet...
Der Output ist leider nicht 100%, siehe hier:

1661404769593.png

Kann hier jemand helfen, was bei der Funktion angepasst werden muss?
Die Parameter "Shadow" und "Highlight" fehlen leider auch noch...
 

Anhänge

  • backgroundReplace.jpg
    backgroundReplace.jpg
    325,5 KB · Aufrufe: 1
  • test.jpg
    test.jpg
    192,4 KB · Aufrufe: 1

Neumi5694

Top Contributor
Naja, 100% gehen bei einem unschaften Bild grundsätzlich nicht, damit hat man seit Anbeginn der Bluescreen-Technik zu kämpfen, selbst als es noch analog war. Hast du schon versucht, die Toleranz zu erhöhen?

Wenn ich in einem Grafikprogramm arbeiten würde, dann würde ich jetzt die Ränder der erkannten Fläche um ein paar Pixel erweitern, mit y (kleiner als x) Pixeln Übergang und experimentieren, bis es passt. Im Zweifelsfall schneidet man lieber einen Pixel zu viel weg als zu wenig.
Dafür bräuchtest du jetzt aber erst mal eine Konturerkennung. Ohne solche bleiben dir eigentlich nur die Toleranzen.

Ich würd mit floats rechnen anstatt mit Integern, da hat man etwas mehr Spielraum bei der Toleranz.
Auch würde ich den Komponenten eine Gewichtung geben. Die dominanten Farbkomponenten des Filters müssen den höchsten Stellenwert haben und müssen auch entsprechend stark im Pixel vertreten sein. Bei anderen Komponenten darf die Toleranz höher sein. Aber das ist nur so eine Idee.

Aber die Jungs oder Mädels, von denen du den Code hast, wissen das sicher besser als ich. Vielleicht solltest du mal bei denen direkt nachfragen?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
S Math.random funktioniert nicht Java Basics - Anfänger-Themen 5
S Schleife funktioniert nicht Java Basics - Anfänger-Themen 2
B Ausgabe in TextArea funktioniert nicht Java Basics - Anfänger-Themen 2
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
C System.out.println - Parameterübergabe funktioniert nicht Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
T % funktioniert nicht Java Basics - Anfänger-Themen 2
D e(fx)clipse installieren funktioniert nicht Java Basics - Anfänger-Themen 3
D GPIO Nutzung mit Pi4J Library auf Raspberry funktioniert nicht Java Basics - Anfänger-Themen 3
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
L hilfe run button funktioniert nicht Java Basics - Anfänger-Themen 13
I Array funktioniert nicht. Java Basics - Anfänger-Themen 2
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
V_Fynn03 Erste Schritte BubbleSort Quelltext funktioniert noch nicht Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
R Erste Schritte Eclipse - Java - System.out.println(); funktioniert nicht Java Basics - Anfänger-Themen 2
G Programm mit Schleife funktioniert nicht Java Basics - Anfänger-Themen 5
T Redirect funktioniert nicht Java Basics - Anfänger-Themen 3
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Zufallszahl funktioniert nicht Java Basics - Anfänger-Themen 27
D Klassen add Methode funktioniert nicht. Java Basics - Anfänger-Themen 31
J ImagaIO funktioniert nicht unter Ubuntu Java Basics - Anfänger-Themen 23
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
N Wochentagberechner Ausgabe funktioniert nicht Java Basics - Anfänger-Themen 7
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
F Primzahlsuche Schleife funktioniert nicht, HILFE! Java Basics - Anfänger-Themen 8
M Methoden Arrays.deepequals() funktioniert nicht Java Basics - Anfänger-Themen 2
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
P Upload Button funktioniert nicht Java Basics - Anfänger-Themen 13
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
M Erste Schritte Importieren funktioniert nicht Java Basics - Anfänger-Themen 7
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
F FileCreation - PrintWriter funktioniert nicht... Java Basics - Anfänger-Themen 1
I Collections.shuffle funktioniert nicht Java Basics - Anfänger-Themen 1
T Methode in Klasse funktioniert nicht Java Basics - Anfänger-Themen 14
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
M Frage, wie dieser Code funktioniert, bzw. weshab er bei mir nicht funktioniert Java Basics - Anfänger-Themen 4
L Level Reset funktioniert nicht Java Basics - Anfänger-Themen 3
A Java Scanner Funktioniert nicht Java Basics - Anfänger-Themen 2
R Kleines Java Spiel funktioniert nicht. Java Basics - Anfänger-Themen 2
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
J Stringvergleich funktioniert nicht Java Basics - Anfänger-Themen 8
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
S Backspace Abfrage funktioniert nicht Java Basics - Anfänger-Themen 4
V Inkrement funktioniert nicht Java Basics - Anfänger-Themen 2
V Inkrement funktioniert nicht Java Basics - Anfänger-Themen 1
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
L Schleife funktioniert nicht richtig Java Basics - Anfänger-Themen 12
R Variablen MouseListener funktioniert auf anderen Pcs nur bedingt Java Basics - Anfänger-Themen 6
X Java 64 bit Funktioniert nicht Java Basics - Anfänger-Themen 7
ChrisPL4Y Wieso funktioniert dieses Programm nicht? Java Basics - Anfänger-Themen 6
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
N relativer Dateipfad funktioniert nicht Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben