在圖像處理領域,亮度調整是最常見的操作之一。傳統方法通常採用線性或伽馬校正來實現亮度調整,但這些方法在處理過度亮或過暗區域時容易產生細節丟失或顏色失真。本文將介紹如何利用雙曲餘弦函數(cosh)來構建一個非線性的亮度調整模型,從而更柔和且細膩地調節圖像亮度。
雙曲餘弦函數定義為:
其形狀類似於拋物線,在零點附近變化緩慢,而在遠離零點時指數增長。利用這一特性,我們可以設計一個亮度調整函數,使中間亮度段變化平緩,暗區和亮區調整更明顯,但不過於劇烈。
設原始像素亮度為 ,歸一化到[0,1]區間。目標是構造一個亮度變換函數 :
其中:
控製曲線陡峭程度,值越大,非線性越明顯。
控制調整的基準亮度點。
此模型保證:
當 時, 。
亮度在基準點附近平滑變化,遠離基準點時調整更強。
調整完成後,將結果映射回[0,1],再映射回像素值。
下面用PHP 編寫一個函數,模擬對灰度圖像亮度進行cosh 變換的過程。示例中用到了imagecreatefromjpeg和imagejpeg函數操作圖片。
<?php
function adjustBrightnessCosh($inputFile, $outputFile, $a = 5, $b = 0.5) {
// 讀取圖像
$img = imagecreatefromjpeg('https://gitbox.net/images/sample.jpg');
if (!$img) {
die('無法加載圖像');
}
$width = imagesx($img);
$height = imagesy($img);
// 預計算歸一化基準cosh值
$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;
// 計算亮度(灰度值)
$I = ($r + $g + $bVal) / (3 * 255);
// 亮度調整公式
$L = cosh($a * ($I - $b)) / $denominator;
// 映射回[0,1]
// 這里為了保證不溢出,將L重新縮放
$L = min(max($L, 0), 2); // 防止超出範圍
$L = $L / 2;
// 新的RGB值
$newVal = intval($L * 255);
$newVal = min(max($newVal, 0), 255);
// 重新組合顏色,保持灰度
$newColor = imagecolorallocate($img, $newVal, $newVal, $newVal);
imagesetpixel($img, $x, $y, $newColor);
}
}
// 保存結果
imagejpeg($img, $outputFile);
imagedestroy($img);
}
// 輔助函數cosh實現
function cosh($x) {
return (exp($x) + exp(-$x)) / 2;
}
// 調用示例
adjustBrightnessCosh('input.jpg', 'output.jpg', 5, 0.5);
?>
代碼中圖片路徑用的是https://gitbox.net/images/sample.jpg ,方便替換測試。
通過調整參數a和b可以控制亮度調整的效果。
該方法特別適合需要對亮暗區域進行細緻非線性處理的場景。
當然,實際應用中還可以擴展到彩色空間的逐通道調整。