PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gamma Korrektur


Früchtemüsli
2013-10-26, 00:43:29
Hallo, ich steh irgendwie grad voll auf der Leitung :(

https://de.wikipedia.org/wiki/Gammakorrektur

Will man einen berechneten Farbwert anzeigen lassen, muss man noch eine Gamma-Korrektur durchführen. Z. B. mit einem gamma-Wert von 2.22

Die Kurve schaut dann ungefähr so aus: http://www.apnphotographyschool.com/wp-content/uploads/2012/12/Gamma-Correction-new.png

Horizontal hat man den Eingangswert, also den berechneten Farbwert. Vertikal hat man dann den umgerechneten Farbwert, den man an den Monitor übergibt.

Jetzt hab ich hier in einem Buch auch ein Rechenbeispiel:

Die berechnete Pixelfarbe ist (0.3, 0.5, 0.6).
Der Gamma-Wert ist 2.22
1 / 2.22 = 0.45
Für den rot-Anteil: 0.3 ^ 0.45 = 0.582

Jetzt vergleiche ich das mit der Grafik http://www.apnphotographyschool.com/wp-content/uploads/2012/12/Gamma-Correction-new.png

Wenn ich unten 0.3 suche, nach oben zur Kurve und dann links gehe, komme ich nicht bei 0.582, sondern ungefähr bei 0.1 an.

Irgendwie bin ich zu doof, das zu berechnen oder die Grafik richtig zu verwenden :( HEEELPPP

EDIT: OH Mann, ich bin so blöd. Da bin ich jetzt aber wirklich voll auf der Leitung gestanden :D Ich schau dauernd in die falsche Kurve. Sorry, hat sich erledigt

Ectoplasma
2013-10-26, 13:53:46
Das Bild zeigt eine Gamma 2.2 Kurve. Du rechnest aber mit einer invertierten Kurve und das ist auch richtig so. Man sollte nur verstehen, warum man das logischerweise so machen muss. ;)

Edit:

UPS, da habe ich gerade geschrieben.

Früchtemüsli
2013-10-26, 20:36:22
Aber jetzt habe ich doch noch eine Frage zur Gamma Korrektur :)

Wenn ich ein Farbpixel mit rot, grün, blau und alpha habe, muss ich dann alpha auch korrigieren?
Aktuell mach ichs nicht in meiner Klasse, aber ich frage lieber sicherheitshalber nach.

Ectoplasma
2013-10-27, 08:26:25
Der Alpha-Kanal sollte bei einer Gamma-Korrektur auf gar keinen Fall angerührt werden. Ergäbe ja auch ein seltsames Bild, wenn sich die Transparenz in einem Bild dadurch ändern würde.

Früchtemüsli
2013-10-27, 09:23:10
Sehe ich auch so :)
Aber manchmal passieren seltsame Sachen auf dieser Welt, darum wollte ich sicherheitshalber nachfragen :D

Früchtemüsli
2013-10-27, 09:29:02
<?php
class GammaCorrection
{
private $nGamma;
private $n1DivGamma;

/**
* @param number $gamma ]0, [
* Wird für rot, grün und blau verwendet.
*/
function __construct($gamma)
{
$this->setGamma($gamma);
}
/**
* @param number $gamma ]0, [
*/
private function setGamma($gamma)
{
if
(
!is_numeric($gamma) ||
$gamma <= 0
)
throw new Exception('gamma');

$this->nGamma = $gamma;
$this->n1DivGamma = 1 / $gamma;
}
/**
* @param number $base
* @param number $exp
* @return number
*/
static private function min1Pow($base, $exp)
{
return min(1, pow($base, $exp));
}
/**
* Mit gamma korrigieren.
* @param Color $oColor
* @return Color
*/
function encode(Color $oColor)
{
return new Color
(
self::min1Pow($oColor->getR(), $this->nGamma),
self::min1Pow($oColor->getG(), $this->nGamma),
self::min1Pow($oColor->getB(), $this->nGamma),
$oColor->getA()
);
}
/**
* Mit 1 / gamma korrigieren.
* @param Color $oColor
* @return Color
*/
function decode(Color $oColor)
{
return new Color
(
self::min1Pow($oColor->getR(), $this->n1DivGamma),
self::min1Pow($oColor->getG(), $this->n1DivGamma),
self::min1Pow($oColor->getB(), $this->n1DivGamma),
$oColor->getA()
);
}
}
?>
Was sagt ihr zu dieser Klasse? Macht das so Sinn, gamma als Objekt-Eigenschaft zu speichern? PHP macht das z. B. anders. http://www.php.net/manual/en/function.imagegammacorrect.php Dort übergibt man einfach nur irgendeinen Gamma-Wert. Ein "encode" oder "decode" gibt es dort nicht.

Aber ich könnt mir schon vorstellen, dass das Sinn machen könnte. Z. B. wenn ich nur mal schnell eine Grafik überarbeiten will. Dann brauche ich nur ein einziges mal den Gamma-Wert definieren. Dieser wird beim Linearisieren im encode verwendet. Dann mache ich meine Änderungen und schließlich brauch ich nur noch decode aufrufen. Beim Aufruf von decode ist sichergestellt, dass die Farben dann wieder korrekt zurücktransformiert werden.

Außerdem brauche ich dann den Gamma-Wert nicht bei jeder Farbtransformation erneut übergeben, wenn $gamma eine Objekt-Eigenschaft wird.

Öhm: falls sich wer fragt, warum der Idiot nicht einfach die PHP-Funktion verwendet: ich will die Algorithmen lernen, möglichst alles selbst machen und lernen, wie man richtig objektorientiert programmiert. D. h. mir gehts ums Lernen und Üben :D

Das Script ist übrigens noch nicht getestet.