Bestimmen ob Bereich im Bild eher Schwarz oder Weiss ist?

sirbender

Top Contributor
Hi,

ich habe ein schwarz-weiss BufferedImage. Wie kann ich bestimmen ob der Bereich x,y,w,h (100,150,10,10) eher weiss oder schwarz ist? Pixel zaehlen? Wie komme ich an die Farben ran?

Geht das auch mit farbigen Bildern? Kann ich irgendwie entscheiden ob das Quadrat im Bild eher 'hell' oder 'dunkel' ist?

Danke,
sb
 
T

Tomate_Salat

Gast
Ich habe soetwas ähnliches wie du willst mal geschrieben.

Wenn ichs richtig im kopf habe, brauchst du nur das Graphics(2D) objekt aus dem Bild und über das [c]getRaster()[/c] kannst du die Bildinformationen in ein Array laden (oder dir den RGB-Wert zurückgeben lassen. Ich habe ein array mit der größe 4 genommen: rot, grün, blau, alpha).

Die Helligkeit ist ganz einfach. Du nimmst den höchsten Wert von den ersten 3 (alpha interessiert nicht) und daraus bekommst du die helligkeit. (Ein Graustufenbild kannst du dann einfach erstellen, indem du den rot,grün und blau wert auf den höchsten Wert setzt, der vorkommt. Beispiel: r:0 g:120: b:150. Dann ist der Blauanteil am höchsten und du setzt dann alles auf 150 (alpha habe ich immer auf 255 gesetzt))

Daraus ein komplettes schwarz ODER weis bild zu machen ist eigentl. auch nicht schwer. Du nimmst dein Graustufenbild und setzt eine Grenze: alles unter 100 z.B. ist 0 alles darüber ist 255. Schon hast du ein schwarz/weis bild.

Damit habe ich überraschend gute Ergebnisse erziehlt.

MFG

Tomate_Salat
 
Zuletzt bearbeitet von einem Moderator:
T

Tomate_Salat

Gast
Simple antwort: ja. mit getRaster() bekommst du die Bildinformationen und kannst diese verändern (die Pixel halt). Wie du jz blurring damit realisierst kann ich dir nicht sagen, weil ich es noch nie versucht habe (vllt gibts dafür aber auch bereits eine Methode? Ka).

Filter Effekte diese Seite habe ich mal überflogen, vllt hilft diese. Sind zwar glaub c++-Beispiele aber vllhilft es trotzdem

MFG

Tomate_Salat
 
Die Helligkeit ist ganz einfach. Du nimmst den höchsten Wert von den ersten 3 (alpha interessiert nicht) und daraus bekommst du die helligkeit. (Ein Graustufenbild kannst du dann einfach erstellen, indem du den rot,grün und blau wert auf den höchsten Wert setzt, der vorkommt. Beispiel: r:0 g:120: b:150. Dann ist der Blauanteil am höchsten und du setzt dann alles auf 150 (alpha habe ich immer auf 255 gesetzt))

Das ist so leider nicht richtig. Ein Pixel (255,0,0) wäre somit als Grauwert heller als (254,254,254), was aber nicht der Fall ist. Die korrekte Umrechnung findet sich hier: YUV-Farbmodell ? Wikipedia.
Der Grauwert Y = 0,299 * R + 0,587 * G + 0,114 * B. Der Grund für diese unterschiedlichen Faktoren liegt darin, dass unser Auge für die Farben unterschiedlich empfindlich ist.

Ralf
 
Danke! Kann ich mit der gleichen Vorgehensweise ueber getRaster() Blurring erreichen?

Ich habe in einer meiner Anwendungen folgendermaßen ein Blurring realisiert (eine gute Anleitung findet sich in dem Buch "Filthy Rich Clients"):

[Java]
int filterwidth = ... // Je größer der Wert, desto stärker der Filter.
BufferedImage image = ... // Dein Bild, das Du filtern willst.
// Warum der Filter in zwei einzelne Filter unterteilt wird, lies bitte in dem angegebenen Buch nach. Die Wirkung ist die gleiche wie in einem Durchgang, es geht aber schneller.
image = getGaussianBlurFilter(filterwidth, true).filter(image, null);
image = getGaussianBlurFilter(filterwidth, false).filter(image, null);

public static ConvolveOp getGaussianBlurFilter(int radius, boolean horizontal) {
if (radius < 1) {
throw new IllegalArgumentException("Radius must be >= 1");
}

int size = radius * 2 + 1;
float[] data = new float[size];
float sigma = radius / 3.0f;
float twoSigmaSquare = 2.0f * sigma * sigma;
float sigmaRoot = (float)
Math.sqrt(twoSigmaSquare * Math.PI);
float total = 0.0f;
for (int i = -radius; i <= radius; i++) {
float distance = i * i;
int index = i + radius;
data[index] = (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot;
total += data[index];
}
for (int i = 0; i < data.length; i++) {
data /= total;
}
Kernel kernel = null;
if (horizontal) {
kernel = new Kernel(size, 1, data);
} else {
kernel = new Kernel(1, size, data);
}
return new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
}
[/Java]

Ralf
 

Landei

Top Contributor
Das ist so leider nicht richtig. Ein Pixel (255,0,0) wäre somit als Grauwert heller als (254,254,254), was aber nicht der Fall ist. Die korrekte Umrechnung findet sich hier: YUV-Farbmodell ? Wikipedia.
Der Grauwert Y = 0,299 * R + 0,587 * G + 0,114 * B. Der Grund für diese unterschiedlichen Faktoren liegt darin, dass unser Auge für die Farben unterschiedlich empfindlich ist.

Ralf

Für das Umrechnen kann man Color.RGBtoHSB nehmen.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Das ist so leider nicht richtig. Ein Pixel (255,0,0) wäre somit als Grauwert heller als (254,254,254), was aber nicht der Fall ist. Die korrekte Umrechnung findet sich hier: YUV-Farbmodell ? Wikipedia.
Der Grauwert Y = 0,299 * R + 0,587 * G + 0,114 * B. Der Grund für diese unterschiedlichen Faktoren liegt darin, dass unser Auge für die Farben unterschiedlich empfindlich ist.

Ralf

Für meine Zwecke hat das bis jz super gereicht^^. Werde es mir das aber mal genauer anschauen. Dein Beispiel kann ich nicht nachvollziehen, vllt hab ich aber gerade auch eine falsche Vorstellung von 255,0,0 und 254,254,254.

Wobei ich nicht glaube, dass das bei meinem vorhaben große auswirkungen hat. Da ich in meinem Projekt das ganze zur einfachen Konturerkennung nutze und diese eh im (eigen entwickelten) Editor nachgearbeitet werden müssen

MFG

Tomate_Salat
 
Für meine Zwecke hat das bis jz super gereicht^^. Werde es mir das aber mal genauer anschauen. Dein Beispiel kann ich nicht nachvollziehen, vllt hab ich aber gerade auch eine falsche Vorstellung von 255,0,0 und 254,254,254.

Wobei ich nicht glaube, dass das bei meinem vorhaben große auswirkungen hat. Da ich in meinem Projekt das ganze zur einfachen Konturerkennung nutze und diese eh im (eigen entwickelten) Editor nachgearbeitet werden müssen

Ein Pixel mit der Farbe (255,0,0) ist ein sattes Rot, (254,254,254) hingegen ist fast weiß (ohne Vergleichsmöglichkeit würde man den Unterschied zu weiß nicht merken). Optisch würde jeder sagen, dass der rote Pixel dunkler ist als der fast weiße. Aber nach Deiner Methode würde der erste als heller detektiert werden.

Zum Tragen kommt der Unterschied in der Umrechnung dann, wenn die Pixel des Bildes sehr große Variationen in den Farbkanälen haben, d. h. bei einem Teil der Pixel ist der eine, bei einem anderen Teil ein anderer Farbkanal dominant.

Ralf
 

sirbender

Top Contributor
Konturerkennung? Du meinst in Vektoren umwandeln also tracen? Ist das Programm erhaeltlich?

Für meine Zwecke hat das bis jz super gereicht^^. Werde es mir das aber mal genauer anschauen. Dein Beispiel kann ich nicht nachvollziehen, vllt hab ich aber gerade auch eine falsche Vorstellung von 255,0,0 und 254,254,254.

Wobei ich nicht glaube, dass das bei meinem vorhaben große auswirkungen hat. Da ich in meinem Projekt das ganze zur einfachen Konturerkennung nutze und diese eh im (eigen entwickelten) Editor nachgearbeitet werden müssen

MFG

Tomate_Salat
 

sirbender

Top Contributor
Ich wuerde gerne folgenden Code fuer mein Blur verwenden:

001 float ninth = 1.0f / 9.0f;
002 float[] blurKernel = {
003 ninth, ninth, ninth,
004 ninth, ninth, ninth,
005 ninth, ninth, ninth
006 };
007 BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel));

Das Problem ist nur...wie verstaerke ich den Blur-Effekt? Muss ich das Blur mehrmals anwenden bzw. den Kernel vergroessern?
 
Das Problem ist nur...wie verstaerke ich den Blur-Effekt? Muss ich das Blur mehrmals anwenden bzw. den Kernel vergroessern?

Du vergrößerst den Kernel. Dabei aber beachten, dass die Summe der Einträge 1 ergibt.
Es gibt allerdings den Nachteil, dass der Rand, der nicht mit bearbeitet wird, größer wird. Also eventuell das zu filternde Bild in ein größeres Bild einbetten, filtern und dann wieder ausschneiden.
Du kannst natürlich auch den Blur mehrfach anwenden. Schau einfach, was für Dich das Beste Ergebnis gibt.

Dein Kernel ist übrigens separierbar, d. h. Du kannst ihn in zwei 1x3-Kernel aufteilen. Siehe dazu mein Beispiel. Dies spart Rechenoperationen und ist sinnvoll, wenn die Filterung schnell erfolgen soll.

Ralf
 
T

Tomate_Salat

Gast
Konturerkennung? Du meinst in Vektoren umwandeln also tracen? Ist das Programm erhaeltlich?

Nein. In ein Polygon um genau zu sein und der Prototyp (Editor) ist noch in Entwicklung. Er wird als Modeleditor später verfügbar sein. Ich will irgendwann mal mit Spieleentwicklung anfangen und dafür wird der Editor dann später gebraucht werden. Dieser soll auch für andere Spiele die ich mal vorhabe zu entwickeln (zuminest habe ichs mal vor :D) genutzt werden.

MFG

Tomate_Salat
 

Landei

Top Contributor
Ich wuerde gerne folgenden Code fuer mein Blur verwenden:

001 float ninth = 1.0f / 9.0f;
002 float[] blurKernel = {
003 ninth, ninth, ninth,
004 ninth, ninth, ninth,
005 ninth, ninth, ninth
006 };
007 BufferedImageOp blur = new ConvolveOp(new Kernel(3, 3, blurKernel));

Das Problem ist nur...wie verstaerke ich den Blur-Effekt? Muss ich das Blur mehrmals anwenden bzw. den Kernel vergroessern?

Den Kernel vergrößern. Für ein gutes Ergebnis mit einem größeren Kernel solltest du allerdings in der Mitte größere und am Rand kleinere Werte verwenden (Summe sollte 1 sein, sonst verändert sich die durchschnittliche Helligkeit). Üblicherweise verwendet man dafür ein Gauß-Verteilung. Schau mal hier:
Java Programming [Archive] - filters mean 5x5 and gaussian 5x5
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ScreenCapture bestimmten Bereich bestimmen AWT, Swing, JavaFX & SWT 3
R JavaFX sichtbarkeit bestimmen AWT, Swing, JavaFX & SWT 17
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
S Swing Zahl der Zeilenumbrüche in einer JTextArea bestimmen AWT, Swing, JavaFX & SWT 1
M Jtable - wie position einer Celle bestimmen bei Multiselect AWT, Swing, JavaFX & SWT 4
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
R JTextField Eingabe bestimmen AWT, Swing, JavaFX & SWT 5
aze GeneralPath wie eine Parabel: Scheitelpunkt bestimmen AWT, Swing, JavaFX & SWT 9
H * Einlesen von Text-Dateien & Zeichensatz bestimmen AWT, Swing, JavaFX & SWT 2
P Swing Größe eines JPanels bestimmen (ohne Border!) AWT, Swing, JavaFX & SWT 2
D JTree Text bestimmen AWT, Swing, JavaFX & SWT 8
H SWT Breite von componenten zu bestimmen AWT, Swing, JavaFX & SWT 2
S Standpunkt von Componenten frei bestimmen AWT, Swing, JavaFX & SWT 10
G Dimensionen eines Button bestimmen AWT, Swing, JavaFX & SWT 4
G Größe eines Applets bestimmen AWT, Swing, JavaFX & SWT 6
S Farbe der Canvas an X,Y bestimmen? AWT, Swing, JavaFX & SWT 7
B JEditorPane: Höhe für bestimmte Breite bestimmen AWT, Swing, JavaFX & SWT 4
M Farbe bestimmen, wenn JTextField.setEnabled(false) AWT, Swing, JavaFX & SWT 6
F Bildgröße bestimmen AWT, Swing, JavaFX & SWT 2
W JButton grösse bestimmen AWT, Swing, JavaFX & SWT 2
B JavaFX Bilder in einem Gewissen bereich halten AWT, Swing, JavaFX & SWT 1
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
E JavaFX MenuBar und ToolBar zu einem Bereich AWT, Swing, JavaFX & SWT 3
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0
B 2D-Grafik String drehen/platzieren/formatieren in bestimmten Bereich AWT, Swing, JavaFX & SWT 1
K JavaFX Vorschau Bereich/Fenster einer bestehenden Group AWT, Swing, JavaFX & SWT 3
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
G LayoutManager BorderLayout WEST Bereich auf maximale Größe beschränken AWT, Swing, JavaFX & SWT 19
fastjack 2D-Grafik Scrollbarer Bereich AWT, Swing, JavaFX & SWT 4
D JTabbedPane - Farbe ändern im Bereich hinter den Reitern AWT, Swing, JavaFX & SWT 2
R JTable nur sichtbaren Bereich laden AWT, Swing, JavaFX & SWT 12
L Koordinate im sichtbaren Bereich AWT, Swing, JavaFX & SWT 5
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
R Swing JPanel Scala - sichtbarer Bereich "schattieren" AWT, Swing, JavaFX & SWT 2
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
S Aufklappbarer Bereich AWT, Swing, JavaFX & SWT 2
V Fixer Bereich bei JScrollPane? AWT, Swing, JavaFX & SWT 2
T BufferedImage + bestimmten bereich ausfüllen AWT, Swing, JavaFX & SWT 3
C Image in bestimmtem Bereich anzeigen AWT, Swing, JavaFX & SWT 3
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
M Bewegtes Bild im BorderLayout.CENTER AWT, Swing, JavaFX & SWT 6
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
S Bild neu skalieren - Bild in Bild speichern? AWT, Swing, JavaFX & SWT 6
N Bild Drehen AWT, Swing, JavaFX & SWT 1
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
M JavaFX Bild zur ImageView in einem Kreis anzeigen. AWT, Swing, JavaFX & SWT 4
T JFrame Bild einfügen AWT, Swing, JavaFX & SWT 9
M Combobox bild anklicken AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L Bild nicht in der Mitte AWT, Swing, JavaFX & SWT 16
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
J Swing Bild in Button AWT, Swing, JavaFX & SWT 11
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
T JavaFX Bild in Tabellenzelle AWT, Swing, JavaFX & SWT 2
Ksanatos Swing Bild (.jpg) einlesen und per Button wechseln AWT, Swing, JavaFX & SWT 9
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
MaxG. Swing Bild Button AWT, Swing, JavaFX & SWT 7
P Swing Bild Skallieren AWT, Swing, JavaFX & SWT 1
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
S Bild mit ImageIcon auf GUI verkleinern AWT, Swing, JavaFX & SWT 3
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
I JFrame Bild strecken und auf Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 2
F Gezeichnetes als bild speichern AWT, Swing, JavaFX & SWT 4
B 2D-Grafik Bild farblich filtern AWT, Swing, JavaFX & SWT 2
B JavaFX ImageView neues Bild zuweisen AWT, Swing, JavaFX & SWT 19
A 2D-Grafik Bild wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 24
K Bild in JFrame AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
B Swing Unterteiltes JFrame mit Bild in der Mitte AWT, Swing, JavaFX & SWT 4
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX Ein Bild ohne Rahmen fällt runter? AWT, Swing, JavaFX & SWT 2
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
A JPanel Bild laden (Porblem mit Dateipfad) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben