當前位置: 首頁> 最新文章列表> 用cosh 實現圖像處理中的亮度調整模型

用cosh 實現圖像處理中的亮度調整模型

gitbox 2025-05-28

在圖像處理領域,亮度調整是最常見的操作之一。傳統方法通常採用線性或伽馬校正來實現亮度調整,但這些方法在處理過度亮或過暗區域時容易產生細節丟失或顏色失真。本文將介紹如何利用雙曲餘弦函數(cosh)來構建一個非線性的亮度調整模型,從而更柔和且細膩地調節圖像亮度。


1. cosh 函數簡介

雙曲餘弦函數定義為:

cosh ? ( x ) = e x + e ? x 2 \cosh(x) = \frac{e^x + e^{-x}}{2}

其形狀類似於拋物線,在零點附近變化緩慢,而在遠離零點時指數增長。利用這一特性,我們可以設計一個亮度調整函數,使中間亮度段變化平緩,暗區和亮區調整更明顯,但不過於劇烈。


2. 亮度調整模型設計

設原始像素亮度為I I ,歸一化到[0,1]區間。目標是構造一個亮度變換函數L ( I ) L(I)

L ( I ) = cosh ? ( a ? ( I ? b ) ) cosh ? ( a ? b ) L(I) = \frac{\cosh(a \cdot (I - b))}{\cosh(a \cdot b)}

其中:

  • a > 0 a > 0 控製曲線陡峭程度,值越大,非線性越明顯。

  • b [ 0 , 1 ] b \in [0,1] 控制調整的基準亮度點。

此模型保證:

  • I = b I = b 時, L ( I ) = 1 L(I) = 1

  • 亮度在基準點附近平滑變化,遠離基準點時調整更強。

調整完成後,將結果映射回[0,1],再映射回像素值。


3. PHP 實現代碼示例

下面用PHP 編寫一個函數,模擬對灰度圖像亮度進行cosh 變換的過程。示例中用到了imagecreatefromjpegimagejpeg函數操作圖片。

 <?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);
?>

4. 說明

  • 代碼中圖片路徑用的是https://gitbox.net/images/sample.jpg ,方便替換測試。

  • 通過調整參數ab可以控制亮度調整的效果。

  • 該方法特別適合需要對亮暗區域進行細緻非線性處理的場景。

  • 當然,實際應用中還可以擴展到彩色空間的逐通道調整。