画像処理の分野では、輝度調整は最も一般的な操作の1つです。従来の方法は通常、線形またはガンマの補正を使用して輝度調整を実現しますが、これらの方法は、過度に明るい領域または暗い領域を扱うときに細部または色の歪みを喪失する傾向があります。この記事では、双曲線コサイン関数(COSH)を使用して非線形輝度調整モデルを構築して、画像の輝度をより柔らかく繊細に調整する方法を紹介します。
双曲線コサイン機能は、次のように定義されています。
その形状は放物線に似ており、ゼロポイントの周りでゆっくりと変化し、ゼロポイントから指数関数的に増加します。この機能を使用して、輝度調整機能を設計して、中央の輝度セグメントをスムーズに変化させることができます。暗く明るい領域はより明白でありながら、あまりにも劇的ではありません。
元のピクセルの明るさがあると仮定します 、[0,1]間隔に正規化されました。目標は、輝度変換関数を構築することです :
で:
曲線の急勾配を制御し、値が大きくなるほど、非線形性が明らかになります。
調整された参照輝度ポイントを制御します。
このモデルは保証します:
いつ の場合、 。
明るさは基準点の近くでスムーズに変化し、参照ポイントから離れてより調整可能になります。
調整が完了したら、結果を[0,1]に戻し、ピクセル値にマップします。
以下は、グレースケールの画像の明るさのCOSH変換のプロセスをシミュレートするためのPHPの関数です。この例では、 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を調整することにより、輝度調整の効果を制御できます。
この方法は、明るい領域と暗い領域の詳細な非線形処理が必要なシナリオに特に適しています。
もちろん、実際のアプリケーションでは、チャンネルごとのカラー空間の調整に拡張することもできます。