プログラムで画像の色温度を調整するにはどうすればよいですか?


8

プログラムで(つまり、エディターではなくプログラミング言語を使用して)ある色温度から別の色温度に変換する方法を知りたいですか?

たとえば、ホワイトバランスアルゴリズムが処理された画像(JPEGなど)を取り、シーン全体の温度を6500に設定できるという仮定(そしてそれが大きな仮定)である場合、アルゴリズム的に「涼しい」シーンを特定の温度に「暖める」か?

明らかに、これは画像編集プログラムの一般的な操作ですが、これらは通常、処理が適用されていないRAW画像(色空間操作など)で機能します。RAWファイルの場合、おそらく個々のRAWファイルには、特定の温度変換をより確定的にするために、カメラセンサーのカラーキャリブレーションに関する十分な情報が(ファイルヘッダーに)含まれていますか?

ちなみに、私は通常のスタックオーバーフローでこの質問をしましたが、ここでもっと良い答えが得られるかもしれないと提案されました。


「[…]おそらく、個々のRAWファイルには、特定の温度変化をより確定的にするために、カメラセンサーのカラーキャリブレーションに関する十分な情報が(ファイルヘッダーに)含まれていますか?」 はい。例はキヤノンの生のものなので、場所は他のブランドでは少し異なります。
JariKeinänen、

とても便利なリンクでした!色温度を別の色温度に変更する方法はまだわかりませんが?
トリカン'20年

Raw画像は常に、ホワイトバランスRGGBレベルのExif情報が1つの側面であるいくつかの命令セットで解釈されます。次に、JPGは多かれ少なかれ合成画像であり、すべての情報がハードコーディングされており、編集は破壊的です。良い例は提供できませんが、いくつかのプログラムインターフェイスを備えたコマンドライン画像エディターであるImageMagickに飛び込みます。その-color-matrixオプションはあなたを始めるかもしれません。次も参照してください:fmwconcepts.com/imagemagick/whitebalance/index.php
JariKeinänen、

スタックオーバーフローで答えた男は正しく答えましたが、詳細はあまりありませんでした。彼は、対角線外の値のチャネルごとのゲインがゼロであることに数学的に等しい行列を提案しました。
agf1997

回答:


6

L * a * b *空間で色空間の白色点変換を行う必要があります。通常使用するほとんどのカラーモデル(主にRGB、多くの場合CMYK)は、物理ハードウェアの制限と要件をサポートするように設計されています。これらのモデルは通常、色の「知覚的」空間をうまく表現していませんが、白色点は間違いなく色の知覚的側面です。

色温度や色合いのシフトなど、画像に知覚的な調整を適用する必要がある場合は、RGBからXYZに変換するのが最適です。変換中に、ソースと宛先のカラースペースに「参照ホワイトポイント」を適用できます。 。次に、XYZからLabへの変換により、連続性を維持するように、ホワイトポイントとすべての色を知覚的に再マッピングできる色空間になります。

色空間変換、色順応、白色点調整などは、数学的にはかなり複雑です。知覚的に正確であるほど、通常、数学はより複雑になります。色空間変換に関する優れた情報源は、Bruce LindbloomのWebサイトにあります。Wikipediaにいくつかの追加の役立つ情報があります。この情報には、白色点固有の情報、計算、および定数が含まれているため、CIEのDシリーズイルミナントにも役立つ場合があります。


RAWカメラデータに見られるようなシーン露出のホワイトバランスを実行するために、CIELABなどの知覚空間に移動する必要はありません。ホワイトバランスは、線形シーンの露出空間におけるチャンネルごとの露出の変化です。色順応は、想定される視聴者の光源への順応の状態に基づいて画像を調整するために使用されます。これもゲインとして行われますが、コーン応答空間(LMS)で行われるため、妥当な結果が得られます。
agf1997

RAWカメラRGBからXYZ、そして最終的にCIELABに移行するには、ソルバーで最適化された特性化マトリックスを通過する必要があることに注意してください。このXYZへのマトリックス変換を正確に行うには、カメラのRGB値を適切にホワイトバランスする必要があります。これにより、ホワイトバランスをシーンの線形露光空間で効果的に行う必要があります。
agf1997

1
私はあなたがそれを答えに入れるべきだと言っていましたが、私はあなたがすでにそうしたのを見ます。しかし、洞察をありがとう!これがとても簡単にできることは知らなかった。
jrista

4

ホワイトバランスは非常に単純な画像処理操作です。これは、線形RGB空間でのチャネルごとのゲインです。JPGファイルは通常、トーンカーブと逆モニターの両方を適用しているため、ホワイトバランスを実行するには最適ではありません。シーンの輝度値との線形関係を壊します。これが、通常RAWデータから始まる理由です。RAWデータを介して、または上記の非線形性を反転することによって線形RGB値に到達できる場合は、以下を適用することでホワイトバランスを調整できます。

R_out = R_in * R_gain
G_out = G_in
B_out = B_in * B_gain

緑のチャネルにゲインを適用しないのは慣例であることに注意してください。これは輝度に非常に大まかに関連し、3つのチャネルすべてを変更すると全体の露出もシフトするためです。

通常、RAWファイルにはメタデータフィールドがあり、組み込みアルゴリズムを使用してカメラによって計算されたホワイトバランスゲインのセットが含まれています。これらのアルゴリズムは通常、ある種の色恒常性光源推定アルゴリズムに基づいています。

ゲインが適用されると、エンコードのプライマリマトリックス、ターゲットトーン再現曲線、および逆EOTFが適用されます。


色温度と色合いがあるLightroomのように、ホワイトバランスをどのように実行できるか知りたいです。これらの2つのスライダーは、2つの平面のラボ空間軸、およびオンラインで見つけることができるCIEベースのホワイトポイント調整式と完全に一致します。このような簡単さで色温度と色合いを個別に制御することは可能ですか?これは、R_gainとB_gainを決定するための他のいくつかの計算ですか?
jrista

@jrista色温度と色合いの値は、色度を定義するために使用されます。その色度は、シーンの露出空間でホワイトバランスに使用されるR、G、Bのゲイン係数のセットに変換されます。
agf1997

2

奇妙で複雑な照明(ナトリウム灯と水銀灯)の下で撮った女性の素晴らしい写真がありました。素晴らしい笑顔、完璧な焦点、道を除いた素晴らしい写真、道を外れた色。

私はadobe Camera Rawで1時間temp / tintでモンキーしましたが、良い結果は得られませんでした。温度を変化させるサイドカーXMPファイルをハックし、XMPファイルにparallelという名前の元のNEFへのシンボリックリンクを作成するプログラムを書きました。

これは上記の回答ほど空想的でも技術的にも正確ではありませんが、代わりに問題に大量のCPUを投入し、(おそらく)興味深い結果をもたらします。

これにより、一連の.NEFファイルリンクと、それぞれの実際の.XMPサイドカーファイルが作成されます。実際のnef / xmpファイルのコンボをコピーしてテストディレクトリにクローンを作成し、min / max tempとdif_temp(クローン間のケルビン)を設定するだけです。別のループを挿入して、一定のケルビンでティント値を変化させることができますが、生成されたファイルにはティントの数が乗算されます。

Photoshopファイル->スクリプト-> image_processorを実行し、このディレクトリをポイントすると、指定された色温度で各リンクの実際のtif / jpg / whateverが作成されます。

このコードは汚い、醜いハックであり、実行すると、すぐ近くにボールの稲妻とキラーハチを引き付けながら、プロセッサを溶かすでしょう。言うまでもなく保証はありません。

Perl(必ず毎日使用)とmklink(存在する場合があります)が必要です。

sub color_temp_experiment()  {
$nef = '6s-2014.1004-237695.acl.nef'; 
$xmp = '6s-2014.1004-237695.acl.xmp';  # crs:Temperature="6000"
$min_temp = 7800;
$max_temp = 9000;
$dif_temp = 200;   # Difference in temp per loop.
$xd = `cat $xmp`;  # Xmp Data;
($base = $nef) =~ s/\.nef//;  # Basename common to both nef and xmp.
$ii = -1;
for($temp = $min_temp; $temp <= $max_temp; $temp += $dif_temp)  {
    $ii++;
    $link = $base . ".$temp" . 'k.nef';  # Abuse Kelvins with lower case.
    $xfn  = $base . ".$temp" . 'k.xmp';  # Abuse Kelvins with lower case.
    if(-f $link)  {
        print("Found FILE (s/b sym link!) $link. Next!\n");  # This prints!
        next;
    }
    $cmd = "mklink $link $nef";
    printf("$ii) Cmd = $cmd\n");
    $sto = `$cmd`;
    unless(-f $link)  {
        print("ERROR! Sym link $link not found!\n StdOut=<<$sto>>\n\n");
        exit;
    }
    ($xt = $xd) =~ s/crs:Temperature="\d+/crs:Temperature="$temp/ms;
    open(O, ">$xfn");
    print(O "$xt");
    close O;
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.