Prozentdifferenz berechnen.

Developer_X

Top Contributor
Hi.
Ich habe mal eine Frage an euch, ich verstehe nicht ganz was ich im folgenden falsch mache.

Mein Code:
Java:
		Color A = DurchschnittA();
		Color B = DurchschnittB();
		
		int redA = A.getRed();
		int redB = B.getRed();
		
		int greenA = A.getGreen();
		int greenB = B.getGreen();
		
		int blueA = A.getBlue();
		int blueB = B.getBlue();
		
		double red   = 0;
		double green = 0;
		double blue  = 0;
		
		if(redA<redB)
		{
			red = redA/(redB/100);
		}
		else
		{
			red = redB/(redA/100);
		}
		
		if(greenA<greenB)
		{
			green = greenA/(greenB/100);
		}
		else
		{
			green = greenB/(greenA/100);
		}
		
		if(blueA<blueB)
		{
			blue = blueA/(blueB/100);
		}
		else
		{
			blue = blueB/(blueA/100);
		}
		
		similarity = (red + green + blue)/3;

Was ich will:
Ich bereche durchschnittsfarbwerte von 2 Bildern, und speichere sie in die Color-Instanzen A und B.
Nun will ich von red green und blue berechnen, wie ähnlich sie sich sind und in prozent, dann das ganze addieren und durch 3 um dann wirklich die endÄhnlichkeit in Prozent zu haben.

Was mache ich falsch?
Die Bilder sind total gleich, nur ein Pixel und das ist weiß.
Ich bekomme als ausgabe von similarity: 127%.
Einen völlig irrepossiblen wert.
Was mache ich falsch?
 

Der Müde Joe

Top Contributor
Naja ... integer division halt...

redA/(redB/100);

die Farbe ist ein int von 0 - 255
--> wenns null ist --> ArithmeticException (divsion durch 0)
--> sonst gibts halt fast immer 1 oder selten 2 [edit] oder 0 ([/edit]
--> 255 / 100 = 2 und dann noch div durch redB wird wohl ca 1 sein
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
sind color nicht von 0 bis 255? weil sehe da nciht die behandlung.

Generall würde ich |a.red-b.red|/255 pro farbe und dann addieren wie du das machst

Ausserdem hgast du tendenziel rundungsprobleme, weil die ints erst in dem moment wo sie gespeichert werden in double convertiert werden, acke mal (double) for die int werte(prozentzahlen sind ja von 0 bis 1, das ist also sowieso nur 0 oder 1 dann als int , ohne zwischenwerte)
 

Schandro

Top Contributor
Division von 2 int's => Das Ergebniss wird abgerundet... du musst mindestens 1 double bei der division dabei haben, damit es nicht abgerundet wird..
 

Developer_X

Top Contributor
sind color nicht von 0 bis 255? weil sehe da nciht die behandlung.

Generall würde ich |a.red-b.red|/255 pro farbe und dann addieren wie du das machst

Ausserdem hgast du tendenziel rundungsprobleme, weil die ints erst in dem moment wo sie gespeichert werden in double convertiert werden, acke mal (double) for die int werte(prozentzahlen sind ja von 0 bis 1, das ist also sowieso nur 0 oder 1 dann als int , ohne zwischenwerte)

Angenommen Color A -> Red wert ist 200
Angenommen Color B -> Red wert ist 100.

Ich will jetzt ausrechnen wie viel prozent das kleiner zum größeren übereinstimmt.
Also dachte ich mir, ich gucke zunächst welche der beiden zahlen größer ist.
Danach dividiere ist 200 / 100, um also 1 % von 200 zu berechnen.
Danach gucke ich, wie groß der Faktor sein muss, um auf den 2ten Wert zu kommen also:
1% * x = Wert B -> Wert B / 1% = x.
Wenn ´Wert B auch 200 wäre, dann würde ja X = 100 sein, und die beiden würden also zu 100% ähneln, versteht ihr was ich meine?

Das mache ich dann für jede farbe, addiere diese 3 Werte, und teile sie durch 3.
Wenn alle 3 Werte 100% betragen würden (bestenfalls), dann würde ja wenn man durch 3 teilt, 100% rauskommen, also wenn die bilder total ähnlich wären, versteht ihr?

Warum funktioniert das aber nicht so,
  • ok ich muss auch noch aufpassen, dass einer der werte nicht 0 ist, wegen der ArithmetikException
  • ok, ich muss auch den Fall abfangen, wenn beide zahlen gleich sind

Das ist klar.

Aber die beiden Bilder die ich im "Jungfernstart" des Programmes testete, hatten niemals den Wert 0 (also bei red green und blue), und waren auch nie identisch.

Warum funktioniert es nicht korrekt=?
 

faetzminator

Gesperrter Benutzer
Na, dann willst du einfach nicht durch 255 teilen, sondern durch max(a, b)... Die Formel wär dann: [c](1 - |a - b| / max(a, b)) * 100[/c].
Edit, als Beispiel:
Code:
A    B    %
100 100 100%
200 100 50%
100 200 50%
 70 210 33.3%
 
Zuletzt bearbeitet:

Sonecc

Gesperrter Benutzer
wasn das für ne Frage?

Irgendeine Funktion, die das größere Element liefert. Der Name an sich sagt doch alles.
Also ja, Math.max wäre eine solche funktion...

oder wenn du math nicht nutzen willst:

Java:
public double max(double a, double b) {
     return (a > b) ? a : b;
}
 

Sonecc

Gesperrter Benutzer
öhm... ok...

ich denke subtrahieren verstehst du ja
Den Betrag kennst du sicherlich auch, daher sollte |a - b| kein problem darstellen
max(a,b) hab ich grad erläutert...
* 100 ist auch nicht schwer...

sry, was verstehst du da bitte nicht?
 

faetzminator

Gesperrter Benutzer
...und falls du damit meinst, was die Formel genau macht: Sie gibt in % (0-100) an, wie gross der kleinere Wert im Vergleich zum grösseren ist...
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Beats per Minute (BPM berechnen) Allgemeine Java-Themen 12
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
bittedanke Wie benötigte Bits berechnen (Huffmankodierung) Allgemeine Java-Themen 7
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
ReinerCoder Kombinationsmöglichkeiten der Textfelder berechnen Allgemeine Java-Themen 14
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
C Java Script Pause berechnen Allgemeine Java-Themen 5
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
MaxG. Best Practice Alle Kombinationen berechnen Allgemeine Java-Themen 3
Aruetiise Funktion(y = mx+n) in String speichern und berechnen Allgemeine Java-Themen 9
N Das große O berechnen Allgemeine Java-Themen 2
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
N Kombinationen beliebiger Größe berechnen Allgemeine Java-Themen 1
The Pi Anzahl der Gewichtscheiben berechnen Allgemeine Java-Themen 11
B Hirsch-Index berechnen Allgemeine Java-Themen 11
B Umfang berechnen für Polygone Allgemeine Java-Themen 18
C pplet Mitelwert Berechnen Allgemeine Java-Themen 0
J Primzahlen berechnen Allgemeine Java-Themen 13
K F-Verteilung FINV in Java berechnen Allgemeine Java-Themen 4
A Helligkeit eines Bildes berechnen Allgemeine Java-Themen 1
P Methoden Alle Kombinationen aus 2 Karten berechnen Allgemeine Java-Themen 2
C mp3-Lied Dauer berechnen Allgemeine Java-Themen 1
L Winkel eines Vektors berechnen [Anfängerprob] Allgemeine Java-Themen 5
R Threads Taskzeit berechnen Allgemeine Java-Themen 12
S Eclipse Entfernung berechnen Allgemeine Java-Themen 16
T Kreis und sekant schnittpunkt berechnen mit latitude longitude Allgemeine Java-Themen 4
B Java Diffentialgleichungen berechnen Allgemeine Java-Themen 3
W 2D-Grafik Kontrast eines Bildes berechnen Allgemeine Java-Themen 6
T Taylorpolynom berechnen Allgemeine Java-Themen 14
S Erste Schritte Mittelsenkrechte berechnen Allgemeine Java-Themen 3
P Matrix Kurtosis berechnen Allgemeine Java-Themen 40
S Werte aus 2 eindimensionale boolean arrays mithilfe von logischen operatoren berechnen Allgemeine Java-Themen 6
S Teiler Berechnen Allgemeine Java-Themen 6
Kr0e Differenzen von Bildern berechnen - Remote control Allgemeine Java-Themen 2
D md5 berechnen für BufferedImage Allgemeine Java-Themen 5
J bewegliche Feiertage berechnen Allgemeine Java-Themen 7
W Rechnungsbetrag berechnen Allgemeine Java-Themen 2
reibi Checksumme für ein File berechnen Allgemeine Java-Themen 12
M Integral berechnen Allgemeine Java-Themen 5
D Primzahlen berechnen funktioniert nicht Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
M Monatliche Zeitspannen berechnen Allgemeine Java-Themen 3
Ark Arkussinus effizient berechnen Allgemeine Java-Themen 12
Iron Monkey Potenzzahlen mit shiftLeft berechnen? Allgemeine Java-Themen 13
N Rechenzeit berechnen? Allgemeine Java-Themen 3
H Schrifthöhe berechnen / Swing Allgemeine Java-Themen 5
T ungerade zahlen berechnen Allgemeine Java-Themen 3
X Suche Java Klasse die Feiertage berechnen kann Allgemeine Java-Themen 2
G ganzzahlige Potenz schnell berechnen Allgemeine Java-Themen 4
M Lautstärke von Audiosignal live berechnen Allgemeine Java-Themen 7
S CRC wert berechnen ergibt 0 ? Allgemeine Java-Themen 9
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
T Arbeitsstunden berechnen Allgemeine Java-Themen 8
M Date Range auswerten und die Monate berechnen Allgemeine Java-Themen 2
V Setter zum Berechnen nutzen? Allgemeine Java-Themen 5
G Richtung berechnen anhand Koordinaten Allgemeine Java-Themen 3
P Dauer (Tage, Stunden, Minuten, Sekunden) berechnen Allgemeine Java-Themen 5
D Mittelwert einer Menge von Doubles berechnen Allgemeine Java-Themen 3
P Winkel berechnen. Allgemeine Java-Themen 3
0 Alle Teiler einer Zahl performant berechnen? Allgemeine Java-Themen 9
B Was würdet ihr dafür berechnen? Allgemeine Java-Themen 7
T MessageDigest von einem char[] berechnen Allgemeine Java-Themen 7
S den zweit niedrigsten wert in einem array berechnen Allgemeine Java-Themen 2
E CRC 8 Berechnen Allgemeine Java-Themen 1
M Math-String-Formel berechnen lassen Allgemeine Java-Themen 4
B Ellipsen Kreisbahnen berechnen! Allgemeine Java-Themen 11
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
clemente lanman und nt password berechnen Allgemeine Java-Themen 7
J an und bn berechnen Allgemeine Java-Themen 5
F Datum mit anzahl tagen berechnen Allgemeine Java-Themen 3
B Differenz in Monaten berechnen --- DateDiff()? Allgemeine Java-Themen 12
B Distance berechnen! Allgemeine Java-Themen 7
D Feiertage berechnen Allgemeine Java-Themen 8
F vergangene Zeit berechnen Allgemeine Java-Themen 6
R Zeitspannen berechnen Allgemeine Java-Themen 7
N 2 hoch 100 berechnen Allgemeine Java-Themen 8
P Punkt berechnen Allgemeine Java-Themen 4
C x-te Wurzel berechnen Allgemeine Java-Themen 2
M Formel in einem String während Laufzeit berechnen. Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben