Im Bereich der Bildverarbeitung ist die Helligkeitsanpassung eines der häufigsten Operationen. Traditionelle Methoden verwenden normalerweise eine lineare oder Gamma -Korrektur, um die Helligkeit anzupassen. Diese Methoden verursachen jedoch tendenziell Detail- oder Farbverzerrungen, wenn sie mit übermäßig hellen oder dunklen Bereichen umgehen. In diesem Artikel wird vorgestellt, wie die Hyperbolic Cosinus Function (COSH) verwendet wird, um ein nichtlineares Helligkeitsanpassungsmodell zu erstellen, um die Helligkeit des Bildes weicher und zarter anzupassen.
Die hyperbolische Kosinusfunktion ist definiert als:
Seine Form ähnelt einer Parabel, die sich langsam um den Nullpunkt ändert und exponentiell vom Nullpunkt entfernt wird. Mit dieser Funktion können wir eine Helligkeitsverstellfunktion entwerfen, um das Segment der mittleren Helligkeit reibungslos zu ändern, und die dunklen und hellen Bereiche passen offensichtlicher, aber nicht zu drastisch an.
Angenommen, die ursprüngliche Pixelhelligkeit ist , normalisiert auf das [0,1] Intervall. Ziel ist es, eine Helligkeitstransformationsfunktion zu konstruieren :
In:
steuert die Steilheit der Kurve, je größer der Wert ist, desto offensichtlicher die Nichtlinearität.
steuert den angepassten Referenzhelligkeitspunkt.
Dieses Modell garantiert:
Wann Wenn , .
Die Helligkeit ändert sich reibungslos in der Nähe des Referenzpunkts und ist, wenn sie vom Referenzpunkt entfernt ist, einstellbarer.
Nachdem die Einstellung abgeschlossen ist, kartieren Sie das Ergebnis wieder auf [0,1] und kartieren Sie dann auf den Pixelwert.
Das Folgende ist eine Funktion in PHP, um den Prozess der COSH -Transformation der Graustufenbildhelligkeit zu simulieren. Im Beispiel werden imageCreateFromjpeg- und ImageJpeg -Funktionen zum Betrieb von Bildern verwendet.
<?php
function adjustBrightnessCosh($inputFile, $outputFile, $a = 5, $b = 0.5) {
// Lesen Sie das Bild
$img = imagecreatefromjpeg('https://gitbox.net/images/sample.jpg');
if (!$img) {
die('Image kann nicht geladen werden');
}
$width = imagesx($img);
$height = imagesy($img);
// Vorbereitete normalisierte BenchmarkscoshWert
$denominator = cosh($a * $b);
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$bVal = $rgb & 0xFF;
// Helligkeit berechnen(灰度Wert)
$I = ($r + $g + $bVal) / (3 * 255);
// Helligkeitsanpassungsformel
$L = cosh($a * ($I - $b)) / $denominator;
// Karte zurück[0,1]
// Um sicherzustellen, dass es keinen Überlauf gibt,WilleLSkalieren
$L = min(max($L, 0), 2); // Aus dem Zielfernrohr verhindern
$L = $L / 2;
// NeuRGBWert
$newVal = intval($L * 255);
$newVal = min(max($newVal, 0), 255);
// Farben rekombinieren,Halten Sie grau
$newColor = imagecolorallocate($img, $newVal, $newVal, $newVal);
imagesetpixel($img, $x, $y, $newColor);
}
}
// Speichern Sie die Ergebnisse
imagejpeg($img, $outputFile);
imagedestroy($img);
}
// Helferfunktionencosherreichen
function cosh($x) {
return (exp($x) + exp(-$x)) / 2;
}
// Aufrufen Beispiel
adjustBrightnessCosh('input.jpg', 'output.jpg', 5, 0.5);
?>
Der Bildpfad im Code verwendet https://gitbox.net/images/sample.jpg, um Ersatztests zu erleichtern.
Durch die Einstellung der Parameter A und B kann der Effekt der Helligkeitsanpassung gesteuert werden.
Diese Methode eignet sich besonders für Szenarien, in denen eine detaillierte nichtlineare Verarbeitung von hellen und dunklen Bereichen erforderlich ist.
Natürlich kann es in tatsächlichen Anwendungen auch auf Kanal-durch-Kanal-Einstellung des Farbraums erweitert werden.