# Werte normieren



## Matthias88 (22. Nov 2010)

Hallo an alle,

folgendes Problem: Ich soll eine 3x3 Maske auf ein vorgegebenes Bild anwenden. Dabei entstehen Werte, die kleiner als null bzw. größer als 255 sind, also außerhalb des Farbraums liegen. Die errechneten Werte müssen also auf den Wertebereich des Farbraums normiert werden.  Die einzige Idee die ich hatte, war, alle Werte die größer als 255 sind auf 255 zu setzen, und alle die kleiner als 0 sind, auf 0 zu setzen. Bin mir aber sicher, dass es auch bessere Lösungen gibt.
Wäre nett, wenn mir da jemand weiterhelfen könnte.
Viele Grüße
Matthias


----------



## Andi_CH (22. Nov 2010)

Leider ist meine Glaskugel gerade in Reparatur ;-)

Wer hat das Wort "normierung" ausgesprochen? Genau derjenige sollte auch wissen was er erwartet.

Man kann, wie du ja schreibst, den Wertebereich beschneiden (das ist wohl keine besonders gute Idee, wenn es um Grafiken geht.)

Man könnte den max und den min Wert suchen, eine lineare Korrektur bestimmen und die anwenden
Man könnte statt der linearen Korrektur eine andere Funktion nehmen

oder eben - man könnte nachfragen was der Auftraggeber will ;-)


----------



## Matthias88 (22. Nov 2010)

Ok, hier noch ein paar Infos, die ich hätte erwähnen sollen:
Man soll Minimum und Maximum des berechneten Bildes bestimmen, und auf den Wertebereich [0;255] abbilden.
Leider kann ich mir darunter nicht wirklich was vorstellen.


----------



## Der Müde Joe (22. Nov 2010)

Dithering (Bildbearbeitung) ? Wikipedia


----------



## Marco13 (22. Nov 2010)

Dithering klingt da IMHO irgendwie nicht so passend ???:L Sowas wie
outputValue = Math.min(255, Math.max(0, inputValue));
sollte eigentlich passen, das wäre dann "Clamping". Wenn es wirklich um eine Normierung geht, müßte man erst alle Werte speichern (egal ob zu groß oder zu klein) und dann dan bereich zwischen minimalem und maximalem Wert auf den Bereich zwischen 0 und 255 abbilden...


----------



## Andi_CH (22. Nov 2010)

Matthias88 hat gesagt.:


> Ok, hier noch ein paar Infos, die ich hätte erwähnen sollen:
> Man soll Minimum und Maximum des berechneten Bildes bestimmen, und auf den Wertebereich [0;255] abbilden.
> Leider kann ich mir darunter nicht wirklich was vorstellen.


Du hast dieselbe Frage schon einmal gestellt - ich kann nur mit der selben Gegenfrage reagieren  
WIE soll man es abbilden - WIE. (Abbilden und normieren ist in dem fall ein Synonym.)

Der "Auftraggeber" hat doch gewisse erwartungen?

Abschneiden wie gesagt nein
Aber linear umnomieren könnte ein ansehnliches Resultat liefern

Brauchst du dazu eine Formel? (In Java umschreiben musst du sie aber selbst)


f(x) = ((x + abs(minimalwert)) * 255) / maximalwert


----------



## Matthias88 (22. Nov 2010)

Marco13 hat gesagt.:


> Wenn es wirklich um eine Normierung geht, müßte man erst alle Werte speichern (egal ob zu groß oder zu klein) und dann dan bereich zwischen minimalem und maximalem Wert auf den Bereich zwischen 0 und 255 abbilden...


Ok, das hab ich schon mal gemacht. Maximum und Minimum hab ich auch schon bestimmt. Nur, wie geh ich jetzt weiter vor?


----------



## Matthias88 (22. Nov 2010)

Sorry, war jetzt auf die schnelle sehr missverständlich formuliert. Also, ich habe bisher alle berechneten Werte in einem Array gespeichert und Minimum und Maximum bestimmt. Ich krieg nur das mit dem abbilden nicht hin...


----------



## Andi_CH (22. Nov 2010)

Da du mir ja meine Frage nie beantwortest (nach welchem Algorithums dein Aufraggeber Lehrer oder was auch immer) umnormiert haben will, hab ich dir oben die Formel für einen lineare Skalierung hingeschrieben.

Aber wie gesagt -> anwenden musst du sie selbst - du sollst ja Java lernen

Hier nochmals:
f(x) = ((x + abs(minimalwert)) * 255) / maximalwert


----------



## Marco13 (22. Nov 2010)

Die Formel stimmt so wohl nicht ganz

```
private static double normalize(double x, double min, double max)
    {
        return ((x-min)/(max-min)) * 255;
    }
```


----------



## nrg (22. Nov 2010)

@andi_CH:

müsste es nicht:

f(x) = ((x + abs(minimalwert)) * 255) / (maximalwert - minimalwert)

heissen?


----------



## Andi_CH (22. Nov 2010)

nrg hat gesagt.:


> @andi_CH:
> 
> müsste es nicht:
> 
> ...




Ja natürlich hast du recht, aber das mit dem abs hab ich auch nicht richtig durchdacht

f(x) = ((x - minimalwert) * 255) / (maximalwert - minimalwert)


Hm was soll ich jetzt für eine Ausrede anbringen? 
Ich mache solche Fehler absichtlich um zu prüfen ob alle aufpassen?
Es war noch VOR dem Mittagessen?


Edit: Ich sehe erst jetzt, dass Marco13 das schon vorher korrigiert hat .... seine Formel ist dieselbe


----------

