カラー補正マトリックス(CCM)

Image Quality Video Series: Color Accuracy▶
画質ビデオシリーズ:色の正確性

導入

カラー/トーンインタラクティブとオートは、少なくとも9つの異なるカラーパッチを持つカラーテストチャートの画像からカラー補正マトリックス(CCM)を計算できます。一般的には3x3のCCMが推奨されますが、4x3もサポートされています。安価で広く入手可能な24パッチのX-Rite Colorcheckerを使用すると、通常は優れた結果が得られます。CCMは画像に適用して最適な色再現を実現できます。最適な色再現とは、補正されたテストチャートパッチと対応する参照値との間の最小平均二乗色誤差として定義され、

デフォルトの色誤差パラメータは、5 ≤ L * ≤ 98 ( L * はCIELAB 色空間で定義) かつR 、 G 、B の各チャネルが最大値の99 %未満(つまり、パッチが飽和していない) であるすべてのパッチについて計算される ( ΔE 2000 ) 2 (または ( ΔE 94 ) 2、これは非常によく似ています) の平均です。行列の計算には非線形最適化が使用されます。

CCMは、アカデミーカラーエンコーディングシステムなどの映画ワークフローにおける入力デバイス変換(IDT)で使用できます。複数の異なるカメラを使用してシーンを撮影する場合に、一貫した色を実現するために使用できます。

カラーマトリックスの計算を行う際には、マトリックス演算に線形なR、G、B値が必要となるため、画像を適切に線形化することが非常に重要です。さまざまな画像エンコーディングに対応した、複数の線形化オプションが用意されています。

操作手順 — フローチャート

簡単な概要:まず、補正されていないカラーチャートの画像を用意します。カラースペースが関連付けられている必要はありません。RAW画像が最適です。トーンレスポンスカーブを調べて、必要な線形化レベルを判断し、設定(ターゲットカラースペースと参照ファイルを含む)を選択します。 「補正マトリックス」を押すと、色の誤差の二乗和が最小となるマトリックスを見つけるオプティマイザが実行されます。

色補正マトリックス(CCM)計算ワークフロー

数学

マトリックス

カラー画像は、 m x n x 3 の配列 ( m行 (高さ) x n列 (幅) x 3 色) に格納されます。簡略化のため、入力カラー画像をk x 3 配列に変換します。ここで、 k = m x nです。元の (補正および線形化されていない*入力) ピクセルデータ次のように表すことができます

ここで、 i行目のエントリは、は、ピクセルiの正規化および線形化された * R、G、および B レベルを表します。変換された (補正された) 配列は、これは、行列乗算によって計算されます。 色補正マトリックス、 Imatestでは、2つの異なる形式を選択できます。 3x3または4x3のいずれか。(4x3は現在推奨されていません。ユーザーからの要望がない限り、廃止される可能性があります。)

( (3 × 3行列)

各出力(補正済み)ピクセルのR、G、Bの値は、そのピクセルの3つの入力カラーチャンネルの線形結合である。

*注:これらの式は、元の(入力)配列がは画像の明るさの線形表現です。画像ファイルが線形でない場合(たとえば、sRGB または Adobe RGB カラースペースの場合)、行列計算に入力する前に線形化する必要があり、計算結果には後でガンマ曲線(つまり、非線形化)を適用する必要がある場合があります。詳細は、下記の「線形化」を参照してください。

ケース2 (非推奨予定): (は 4 x 3 マトリックスです。通常は 3 x 3 マトリックスが推奨されます。)各カラー チャンネルのオフセットを提供するために、A マトリックスに 1 の列が追加されます。 、 、 そしてこれにより、補正された色値は、元の入力値のアフィン変換となります。

この計算の目的は、(以下に説明する選択された指標で)以下の差を最小化することです。そして参照配列(理想的なチャート値)初期値は(最適化の開始点)3 x 3 および 4 x 3 の場合、それぞれ次のようになります。

どこ

参照配列の場合および元の配列平均はすべての範囲にわたって取られる。

カラー/トーンには、チャートの種類ごとに参照配列Rが必要です。(X-Rite Colorcheckerなどの場合、複数の参照配列が利用できる場合もあります。) Rには通常、CIELAB(L*a*b*)値が含まれており、これをRGBに変換したり、色差指標(ΔE、ΔCなど)の計算に使用したりできます。

  • デフォルト(組み込み)参照を使用する、
  • チャートを測定して( 「テストチャートパッチの測定」を参照)、またはウェブページ(例えば、X-Rite Colorcheckerの場合はX-RiteまたはBabelcolor)から取得できる参照ファイルを入力してください。
  • ここで説明されているように、高品質の「ゴールドスタンダード」チャート画像のL*a*b*値から作成された参照ファイルを入力します。

カラー/トーンインタラクティブモジュールでは、 「ファイル」 → 「L*a*b* 参照をクリップボードにコピー」を選択すると、現在の参照値を取得できます。右側には、カラーチェッカーのいくつかの値が示されています。下には、 X-Rite のページから切り取った小さな画像が表示されます。

37.31 13.39 14.58
64.37 18.05 17.05
49.62 -1.162 -22.16
43.35 -14.62 22.86
55.18 12.16 -24.57
70.67 -31.91 0.08472
62.11 33.4 55.77
40.05 16.27 -44.37
50.06 48.12 15.6
30.21 24.4 -20.88
71.52 -28.38 58.85
70.96 14.79 67.25
29.15 21.68 -48.74
54.35 -42.65 32.87
41.82 50.35 27.36
(24 rows total)

線形化

ほとんどの標準的な(HDRではない)イメージセンサーは飽和点までは線形ですが、多くの画像ファイルは非常に非線形です。Imatestは、大きく分けて2種類の画像ファイルを扱います。

  • RAWファイルは、ガンマカーブを適用せずに(そして多くの場合、シャープネス、ノイズリダクション、ホワイトバランスなどの信号処理をほとんど、あるいは全く行わずに)センサー出力から変換されたファイルです。これらのファイルは、ガンマが1に近い線形です(レンズフレアやセンサー上での信号処理(ペデスタルの追加)のため、1よりやや低い場合が多いです)。ガンマエンコードされた交換可能なファイルを取得するために使用される処理によって情報損失が発生する可能性があるため(特にsRGBカラースペースの場合)、CCM計算にはRAWファイルが推奨されます。

  • 互換性があり、指定されたガンマ( γ )で表示されるように設計されたファイル。ここで、表示輝度=ピクセルレベルγ (トーン応答曲線で表され、対数輝度= γ×対数ピクセルレベル)。

これらのファイルには通常、関連付けられたカラースペースがあります(ファイルに埋め込まれている場合と埋め込まれていない場合があります)。最も一般的に使用されるカラースペース(sRGB(約2.2)とAdobe RGB(1998))のガンマ値は2.2です。

カメラが画像をエンコードする際(RAW現像処理の一部)、表示曲線の近似的な逆数となる階調応答曲線(対数ピクセルレベル対対数露出)が適用されます。この曲線の傾きは1/ γから大きく変動する可能性があり、ハイライトの白飛びを最小限に抑えるため、多くの場合、階調応答曲線に「ショルダー」(コントラストが低下した領域)が含まれます。ショルダーは応答をより「フィルムライク」にすることで画質を向上させますが、CCMの精度を低下させる可能性があります。

CCMの計算は、画像に適用される画像処理が均一であり、個々の色が飽和していないことを前提としています。局所的なトーンマッピングが適用された後では、適切なCCMを計算することはできません。

入力画像がガンマエンコードされている場合は、補正行列を適用する前に線形化する必要があります。Imatestには、以下に説明するいくつかの線形化オプションがあります。オプション1と5~8は入力画像を線形化します。オプション2~4は、入力画像が線形であると仮定します。

5、6、9以外の線形化設定については、 Color/Tone Interactiveでテストチャート画像を開き、右側に表示される白黒濃度表示(logピクセルレベル対log露出)を表示することで、線形化設定(下記参照)を決定するために必要な情報を見つけることができます。

この特定の曲線は、ガンマ(平均傾き)が0.547で、応答に「肩」があります。CCM計算に適した生データファイルは、通常、傾き(ガンマ)が1に近く、肩がありません。

妥当な(ただし完璧ではない)線形化設定は7です。線形化設定ドロップダウンメニューの下にあるボックスで、ガンマを0.55に設定して、ガンマを使用して入力を線形化します。設定5または9を使用すると、ガンマに関する仮定を置かずに画像内のグレースケールパッチからガンマを測定するため、より良い結果が得られます。5はRAW画像(ガンマが1に近い)に適しています。

最適化手順

  • CCMを計算するために使用する画像をカラー/トーン(インタラクティブまたは自動)で開きます。

  • 設定を選択してください。ほとんどの設定項目は「設定」ウィンドウにあります。
    入力画像のトーン応答(ガンマを含む)(上のボックスに示されているとおり)を使用して、適切な線形化オプションを決定します。カラースペースガンマ線形化を選択した場合、 O L = O gammaとなります(ここで、ガンマ( γ )はカラースペースによって指定され、たとえばAdobe RGBの場合は1/2.2です)。
    カラー/トーンウィンドウで、正しいカラースペースと参照ファイルが選択されていることを確認してください。

  • 補正行列ボタンを押してオプティマイザを呼び出します。
    • (一時的な)補正画像T L = O L Aを計算します。
    • (オプションで)線形化を解除します: T = T L (1/γ)色空間ガンマ( γ )を使用します。
    • 各パッチについて、 T (CIELAB、つまりL*a*b*値に変換)と参照(理想)配列Rとの間の色誤差メトリックを求めます。最適化ドロップダウンメニューで選択する色誤差メトリックは、ここで説明する標準的な色誤差測定値(ΔE* ab 、ΔC* ab 、ΔE 94 、ΔE 94 、ΔE CMC 、ΔC CMC 、ΔE 00 、またはΔC 00 )のいずれかです。ΔE 00 (CIEDE2000)またはΔE 94  これらが推奨される選択肢です。[a*b* ディスプレイに色差楕円を追加する前は、ΔE 00に最適化に影響を与える小さな不連続性が含まれる可能性があることを懸念していました。] ΔC エラーは、輝度 ( L *) を省略した ΔE と似ています。L*a*b* 色空間の彩度 ( a * とb *) と輝度 ( L *) の成分間に相互作用があり、ΔC 値のいずれかを選択すると彩度の精度が実際に低下するため、これらは推奨されません。
    • 非線形最適化を使用して、誤差指標の二乗和の最小値 (通常、∑(ΔE 00 ) 2または 5 ≤ L * ≤ 98 のパッチの場合は ∑(ΔE 00 ) 2)が見つかるまでA を調整します。
    • Aの最終値を報告します。

Aを適用する場合(通常はImatest以外で)、同様の線形化を使用する必要があります。Aは、RAW変換処理中に、ガンマ+トーン応答曲線を適用する前に、線形化なしで適用できます。

Aがグローバル最小値であるという保証はありません。その最終値は、初期値にある程度依存します。

カラー/トーンの色補正マトリックス

オプション:カラーマトリックスの計算オプションは、カラー/トーンインタラクティブウィンドウで「設定」 → 「カラーマトリックス」をクリックするか、設定ウィンドウで「カラーマトリックス、ISO感度、mxnチャート設定」ボタンを押すことで設定できます。これにより、以下に示すダイアログボックスが表示されます。オプションは次のとおりです。

  • color_matrix_settings2 4x3または3x3マトリックス:色補正マトリックスのサイズ。一般的には3x3が推奨されます。4x3マトリックスには、計算速度を低下させ、結果を改善することはほとんどありません。
  • 最適化: L*>10 (95 の場合はほぼ黒) のパッチの二乗平均を最小化する色誤差パラメータを選択します。選択肢には、ΔE ab、ΔC ab、ΔE 94、ΔE 94、ΔE CMC、ΔC CMC、ΔE 00、および ΔC 00 があり、これらについてはここで説明します。ΔE 94 または ΔE 2000 は、彩度の高い (飽和した、a* 2 + b* 2が大きい) 色間の彩度差に与える重みが少ないため、つまり、ΔE ab (標準的な ΔE 計算: L*a*b* 空間における色間の幾何学的距離) よりも目の知覚に近いため、推奨されます。
  • 重み付け:最適化のためのパッチの重み付けを設定します。選択肢:
    • 1. 均等重み付け[デフォルト] パッチは均等に重み付けされます。ハイライトカラーがシャドウカラーよりも視覚的に目立つ場合があるため、最適な設定ではない可能性があります。
    • 2. ハイライトを強調する: CIELAB L* に基づいて重み付けします。視覚的に目立つハイライト部分に重みを多く与えます。これがデフォルトです。
    • 3. 強調すべき点を強く強調する: L*^2 に従って重み付けする。
    • 4. CSVファイルから重みを読み込む を選択すると、「重みをコピー」、「参照」、「ファイル」の各ボックスが有効になります。CSVファイルには、チャート内のパッチ数と同じ数の重み(通常は0~1の範囲)が含まれている必要があります。ファイルは、 1行に1つの値、またはn行にわたって1行にm個の値が含まれていても構いません。ただし、 m*nはチャート内のパッチ数と等しくなります。
以下は、140パッチ(10行×14列)のColorchecker SGの重みの例です。

0,0,0,0,0,0,0,0,0,0,0,0,0,1
0,0,0,0,0,0,2,0,1,1,0,0,0,0
1,0,0,0,1,1,3,0,1,1,0,0,0,0
0,1,0,0,0,0,0,1,0,1,0,1,1,0
0,0,1,0,0,1,1,0,1,1,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,1,0,0,0,0,0,0,0
0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,1,0,0,0,0,1,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0

ウェイトファイルを入力してCCMを計算した後、 (カラー/トーンウィンドウの右側にある) 「数値」チェックボックスを押すと、パッチ番号(SGのColorchecker 24レプリカセクションが表示されます)とウェイトの両方が表示されます。これにより、正しいウェイトが入力されていることを確認できます。
  • 線形化: 行列を計算する前に画像を線形化する方法を選択します。ほとんどの設定 (5、6、9 を除くすべて) では、入力画像のトーン応答 (エンコーディング) を知る必要があります。これは、線形 (RAW 画像に一般的)、ガンマエンコード (手動で入力したガンマ ( γ ) または選択したカラースペース (sRGB、Adobe RGB など) のガンマを使用)、または対数エンコードのいずれかです。応答は、チャートのグレースケール部分の B&W 濃度プロットから取得できます。ガンマエンコードされたカラースペースを線形化する式はO L = O 1/γです。ガンマエンコードの式 (CCM が計算された後) はO = O L γです。

    設定5、6、9では、画像がどのようにエンコードされているかを知る必要はありません。線形化パラメータは、Matlabのpolyfit関数とpolyval関数を使用して、グレースケールデータ(設定5と6の場合はグレースケールパッチレベルL 、設定9の場合はlog 10 ( L ))に多項式近似を行うことで決定されます。
設定コメント線形化方程式:線形レベル =
1. 入力を線形化し(CSガンマ)、行列を適用し、次にCSガンマ符号化を適用する。標準色空間(CS)でエンコードされた画像に適した選択肢です。入力1/(CS ガンマ)
2. 線形化なし:入力ピクセルにマトリックスを適用する実験目的、および線形から始まり線形のままとなる画像に適しています。ガンマエンコードされた画像には適していません。入力
3. 線形入力を想定し、行列を適用し、次にCSガンマ符号化を適用する。ガンマエンコードされていない(ほぼ線形)画像で、カラースペースに変換する必要がある場合。入力RGB画像をL*a*b*に変換する際には、カラースペース(CS)ガンマは適用されません。入力
4. 入力と出力は線形であると仮定する(ガンマ値はすべて1とする)。 線形化やガンマエンコーディングは行いません。RGBとL*a*b*空間間の変換において、色空間ガンマは適用されません。(2と同じ)入力
5. 入力を線形化(データ適合)、行列を適用、CSガンマ符号化を適用(かなり正確) グレースケールパッチのピクセルレベルLに対して、3次多項式近似P (Matlabのpolyfit関数)を用いて画像を線形化します。CCMを計算し、カラースペースのガンマ値でエンコードします。この方法で良好な結果が得られることがよくあります。 polyval( P ,input) は、 Lに適合する 3 次多項式です。
6. 入力データを線形化し(データ適合)、行列を適用し、その後非線形化する(データ適合)。 5と同様だが、最適化後に画像が元のトーンカーブに復元される点が異なる。 5番と同じ。
7. 入力をガンマ(下記参照)を用いて線形化し、行列を適用した後、CSガンマ符号化を適用する。カラーチャートにグレースケールパターンがある場合は、白黒濃度プロットからガンマ値を手動で入力します。これにより、測定されたガンマ値が期待されるカラースペースガンマ値または1(線形RAW変換の場合)と異なる場合など、頻繁に発生するケースで優れた結果が得られます。この設定は、入力画像のガンマ値が標準カラースペースガンマ値(多くの場合1/2.2)または線形(1)と異なる場合に特に役立ちます。入力1/ガンマ
8. 対数勾配を使用して線形化し(下記の対数カラースペースの場合)、行列を適用してから、ガンマエンコードします(CS)。

対数カラースペース(映画で使用されることがありますが、静止画では使用されません)は、近似エンコーディング方程式O = max(1+A log 10 (O L ), 0)および逆数(線形化用) O L = 10^((O-1)/A)で特徴付けられます。Aは対数勾配であり、カラー/トーンインタラクティブモジュールのB&W 濃度とホワイト バランス表示に表示されます。対数エンコードされたカラースペースは、[ピクセル対入力密度]オプション(4.0 で新しく追加)を選択するとほぼ直線的な応答を示しますが、ガンマエンコードされたスペースは、より従来型のLog(ピクセル) 対入力密度オプションを選択するとほぼ直線的な応答を示します。

9. 線形化(ガンマ多項式データ適合)、行列の適用、CSガンマ符号化の適用。 グレースケールパッチレベルLの log 10に 3 次多項式Pを当てはめて画像を線形化します。CCM を計算し、カラースペース ガンマでエンコードします。これは、ガンマ エンコーディングの多項式修正です。推奨される理由は、(A) 入力画像のエンコーディングに関する知識が不要であること、(B) さまざまな画像に対して最も正確な結果が得られることです。 polyval( P ,log 10 (input))、ここでPは log 10 ( L ) に適合する 3 次多項式です。

注: Rec.709カラースペースでは、許容値が16~235(全255)の範囲ですが、線形化では16~235を0~1(内部)の全範囲にマッピングし、非線形化では0~1を16~235にマッピングします。画像は全範囲で表示されます。

  • ガンマ(線形化設定7:入力ガンマを使用して線形化する…の場合のみ有効)。グレースケールステップチャートから測定したガンマ値を手動で入力します(これはほとんどのカラーチャートに含まれており、白黒濃度プロットに表示されます)。
  • 彩度乗数(参考値):通常は1。彩度を高くすると色が鮮やかになり、低くすると色が鮮やかになります。場合によっては、1.05または1.1に上げると結果が改善されることがあります。
  • 最適化制約
    • 制約はありません。これはデフォルト設定であり、正当な理由がある場合にのみ変更してください。
    • 各行の合計は1になります。
    • 各列の合計が1になるように設定することで、ホワイトバランスが維持されます。
  • 計算の詳細2種類の計算方法が利用可能です。(1) RGB入力からRGB出力への直接変換、(2) RGB入力からXYZ(間接的にRGB出力へ)への変換。どちらもオプティマイザを使用します。まず初期値を設定し、次にオプティマイザが選択した誤差指標の最小値が見つかるまで値を調整します。
    • RGB行列を直接計算します(元のアルゴリズム)。RGB入力からRGB出力への行列の推測から始め、RGB出力からL*a*b*出力を見つけます。オプティマイザの制御下で、色誤差(L*a*b*出力と参照値の間(≠ 1の場合はクロマ乗数で調整))が最小になるように行列を調整します。
    • XYZ 行列と xy プライマリーを計算します(新しいアルゴリズム)。まず、RGB入力から XYZ 行列への大まかな推測 (sRGB 係数を使用) から始めます。次に、XYZ を L*a*b* に変換し、オプティマイザの制御下で、選択したエラー メトリックが最小になるまで行列を調整します。最適化が完了したら、XYZ を RGB出力に変換します。RGB から XYZ および RGB から RGB 行列の両方が計算され、CSV および JSON 出力ファイルに含まれます。
  • 参照ファイル(カラー/トーンインタラクティブウィンドウ内。カラーマトリックスウィンドウ内ではありません) 参照ファイルには、最適化に使用される理想的なチャートのL*a*b*値が含まれています。通常、チャートパッチの測色測定されたL*a*b*値が含まれています。これはデフォルト値の場合に常に当てはまり、参照ファイルの場合にも通常は当てはまりますが、後述の「画像のマッチング」で説明するように、特別な「ルック」が必要な場合は、参照ファイルに異なる値が含まれる場合があります。

画像のマッチング ― 「ゴールドスタンダード」画像の使用

高品質な色彩を持つ画像(いわゆる「ゴールドスタンダード」)を基準(ターゲット)としてCCMを計算し、他の画像がそれにできるだけ近い色になるよう調整したい場合は、カラー/トーンインタラクティブウィンドウで「ファイル」→「 L*a*b*の結果をCSV参照として保存」をクリックし、そのL*a*b*値を名前付きファイルに保存できます。その後、 「参照(参照ファイル)」ボックスをクリックし、 「LABデータファイル」を選択して保存したファイルを選択することで、このファイルを参照ファイルとして使用できます。

合否判定基準にゴールドスタンダードのL*a*b*値を用いることには、微妙ながらも重要な利点があります。複雑な理由(L*a*b*色空間の基準となる人間の目とカメラでは反応が異なるため)から、三原色画像は理想的なL*a*b*値と完全に一致することは決してありません。最小平均ΔE2000は通常3程度です。しかし、ゴールドスタンダードのL*a*b*値と完全に一致させることは可能です。このため、色差指標は色の一致度を示す指標として非常に優れています。

テストチャートの画像を取得する

フレーミング —チャートは画面全体を埋める必要はありません。特に、光量低下が著しいカメラ(強い樽型歪みのある広角レンズによく見られる現象)ではなおさらです。ほとんどの場合(画素数が非常に少ないカメラを除く)、チャートを画面の中央3分の1(直線距離で測定)に配置するだけで十分です。

背景 —フレーム内またはフレーム付近の背景に明るい照明があると、フレア光が発生して影がぼやけ、正確な補正が難しくなるため、明るい照明は避けるべきです。理想的な背景はニュートラル(反射率約18%)からダークグレーですが、CCM計算前に色補正を行わない限り、背景色の影響はほとんどありません。

画像処理―可能であれば、CCM計算前の画像処理は最小限に抑えるべきです。色の調整や、画像をカラースペースに変換すると精度が低下します(これはCCMが行う処理です)。ローカルトーンマッピングは避けるべきです。計算結果を完全に台無しにしてしまいます。

飽和—可能であれば、パッチが飽和しないように注意してください。パッチが飽和している場合、つまり、いずれかのチャンネルの平均ピクセルレベルがビット深度の最大値の99%を超えている場合(例:ビット深度=8の場合は255、ビット深度=16の場合は65535)、そのパッチは最適化から除外され、分割ビューで「飽和」と表示されます。特に3つのチャンネルのうち1つだけが飽和している場合(下図参照)、パッチが飽和しているかどうかは視覚的に分かりにくい場合があります。飽和したパッチは、マトリックスを適用すると非常に奇妙に見える傾向があります(下図参照)。(これはバグのように見えるかもしれませんが、以下で説明するようにバグではありません。)

カラーチェッカー_彩度_小飽和

右側には、彩度が飽和したパッチ(4行目、左)を含む画像が示されています。緑色チャンネルのみが飽和しているため、一見すると分かりにくいかもしれません。しかし、下に示した濃度応答曲線( Color/Tone InteractiveまたはColor/Tone Autoによるもの)を見ると、そのことが分かります。緑色チャンネルは最大露出で飽和しており、緑色の曲線の傾きは最大露出のすぐ下で低下しています。

その結果、緑色チャンネルのピクセルレベルは、飽和していなかった場合よりも(他のパッチと比較して)低くなっています。

カラーチェッカー_飽和濃度 カラーチェッカー_彩度補正左下の飽和した部分(下部に表示されているマゼンタ色!)の補正値は、飽和した緑色のチャンネルが、その部分が飽和していなかった場合の値よりも低くなっているため、正しくありません。

注:飽和したパッチは行列計算には含まれません。飽和したパッチの使用は避けることをお勧めしますが、計算結果の行列に大きな影響を与えることはありません。

Imatest が飽和ピクセルを処理する方法 ( Imatest 5.0 以降)入力ファイルで R、G、または B ピクセルが飽和している場合 (正規化データで値が 1 の場合)、マトリックス適用後も飽和値のままになります。つまり、飽和した (R、G、または B) ピクセルにはマトリックスは適用されません。この機能は、以下のサンプルコードの次の行によって実現されます。

correctionRGB(linearRGB==1) = 1;

右側の画像は、この補正の結果を示しています。左下の水筒に見られるシアン色のハイライトは、補正前の彩度によるものです。

CCMは下側の画像に適用されています。
左側は彩度補正なし、右側は補正済み。

カメラにも同様の手順が適用されます。飽和領域の境界では完璧な結果が得られず(また、得られません)、しばしば「パープルフリンジ」と呼ばれる現象が発生します。( Wikipediaの説明は間違っています。修正を試みるかもしれません。)

色補正マトリックスを計算するには、

  • 色補正(マトリックス計算)ボタン

    カラー/トーンインタラクティブまたはカラー/トーン自動で画像を開きます。

  • 白黒濃度表示における濃度応答曲線から、線形化設定を決定します。

  • カラーマトリックスの設定を行う際は、特に線形化に注意してください。線形化は、白黒濃度表示と一致するようにする必要があります。

  • 色補正の目標値を含む参照ファイルを選択してください。ほとんどの場合、標準のデフォルト値が使用されますが、 分光光度計による測定値から作成した参照ファイル、または良好な(「ゴールドスタンダード」)画像のL*a*b*値を保存した参照ファイルを入力することもできます。

  • 右側に表示されている「補正マトリックス」ボタンを押してください。表示が以下のように変化します。各パッチの左上には理想的な(基準となる)色が、右上には入力色が、下部には補正後の色が表示されます。入力画像(アーカイブから)はホワイトバランスが比較的悪いのですが、劇的に改善されています。

マルチチャート分割修正済み参照色、入力色、補正済みパッチ色を表示する分割ビュー。
(右側の)表示入力を「表示補正」に変更すると、[補正済み - 理想値]の統計情報を取得できます。

補正マトリックスボタンが「マトリックス計算済み」に変わり、ピンク色の背景で強調表示されます。補正マトリックスは、画像プロパティ(新しい画像、カラースペース、参照ファイル、またはカラーマトリックス設定)が変更されるまで再計算できません。そのすぐ左にある「表示入力」 (または「補正済み」)ドロップダウンメニューが有効になります。2つの選択肢から1つを選択できます。

入力内容を表示するほとんどのディスプレイでは、色の差(入力値 − 理想値)が表示され、左下のテキストには [入力値 − 理想値] の色の差が表示されます。擬似カラーの色差と分割カラーの 2 つのディスプレイは、この設定の影響を受けません。これらのディスプレイでは、(補正値 − 理想値)が下部に表示されます。
表示が修正されました色調インタラクティブ_補正済みデルタほとんどのディスプレイでは色差(補正値-理想値)が表示され、左下のテキストには[補正値-理想値]の色差が表示されます。以下は、上記のケースにおける補正後の色差です。

EXIFデータとカラーマトリックス表示には、結果の概要が含まれています。

カラー/トーン Interactive_exif_colorcorr Exifとカラーマトリックスビュー

色補正マトリックス、結果の概要、および[入力 - 理想]と[補正済み - 理想]の色差の概要が表示されます。初期および最終のエラー数値は、選択されたメトリック(この場合は、L*>10およびL*のすべてのパッチのDelta-E 94の二乗の合計)がどれだけ大きいかを示しています。

生画像の結果

以下は、RAW画像のカラーマトリックス最適化の例です。元の画像は、Panasonic GF1マイクロフォーサーズ(ミラーレス一眼カメラ)でRAW(RW2)画像として取得され(参照用にJPEG画像も取得)、 dcrawを使用してマニュアル設定、標準RAW変換、出力ガンマ=1.0(リニア)、自動ホワイトレベルオフ(チェックなし)、ホワイトバランス=なし、出力カラースペース=RAWで変換されました。これらの設定では、デモザイキング以外の画像処理は適用されていません。

ファイルはほぼ完全に線形でした。音調応答曲線はガンマ値1.01の直線でした。線形化オプション3 (入力が線形であると仮定し、行列を適用してからCSガンマ符号化を適用する)が選択されました。

出力はほぼ完璧で、3色センサーとしては最高レベルです。これは、特性がよく把握されたRAW画像から作業する場合に期待される典型的な結果です。最近(2014年5月)、RAW出力を持つ4台のカメラ(パナソニック Lumix LX7とG3、キヤノン EOS-6D、ニコン D800E)で、6つの異なる照明条件(2700Kと5000KのLED、3500Kと5000KのCFL、標準(2700K)の白熱灯、4700K(実測4000K)のSoLux(ダイクロイックフィルター付き)ハロゲンランプ)で計算をテストしたところ、驚くほど一貫した色補正画像が得られました。

カラーマトリックス_パナソニック_raw線形RAWファイル(ガンマ値=1、色補正なし)からの結果

線形行列の結果 x、y および X、YZ の原色Color/Tone InteractiveおよびColor/Tone Auto は、入力 (カメラ) 色空間の x、y および X、YZ の原色を計算し、それらを表示 (右下の 3 行) し、CSV および JSON 出力ファイルに保存できます。この計算は、入力画像が線形 (ガンマ カーブなしで RAW から変換) または ACES 色空間の場合に最も効果的です。信号処理係数の計算に役立ちます。x、y の原色はカメラの色域とは関係がないことに注意してください。これらの原色は、R、G、B = {max、0、0}、{0、max、0}、[0、0、max} に対応する x および y の値ですが、センサー内の色のクロストークにより実際には実現できず、多くの場合、実際の色のスペクトル軌跡の範囲外にあります。

色差(Δ E xxおよび Δ C xx )はどの程度まで改善できるのか?

3色カメラ(赤、緑、青の3色を基本とするRGB )のカラーフィルターのスペクトルは、人間の目のフィルター(黄橙色、緑、青の3色を基本とする)とは異なるため、カメラは完璧なものにはなり得ません。カメラが人間の目を完全に再現できないのは、良好な色再現を得るためには色をRGBに変換する必要があり、そうすると信号対雑音比(SNR)が著しく低下してしまうためです。

上記の例の数値、Δ E * ab ≅ 5、Δ E * 94 、および 5 Δ E 00 ≅ 3 は、三色型カメラ(すべての標準カラーカメラを含む)としては、これまで見た中で最高の値です。これよりも優れた値、Δ E xx < 1 が見られたのは、少なくとも 7 つのチャンネルを備えたマルチスペクトルカメラの場合のみです。

Color/Tone Interactiveからマトリックスを保存する

マトリックスをファイル(CSV形式)に保存するには、 [ファイル] 、 [カラーマトリックスをファイルに保存]の順にクリックし、ファイル名を選択します。

マトリックスは、 「ファイル」 → 「カラーマトリックスをクリップボードにコピー」をクリックすることでクリップボードにコピーできます。クリップボードの内容は、画像処理モジュールの「CCM設定」ウィンドウに貼り付けることができます。

カラー/トーンインタラクティブウィンドウの下部にある「データの保存」ボタンを押すと、マトリックスがCSV出力ファイル(デフォルトでは画像ファイルフォルダの「結果」サブフォルダに保存されます)に含まれます。

CSVファイル色補正マトリックス

マトリックスを適用する – 画像の色補正

Color/Tone InteractiveでCCMが計算されると、そのマトリックスを使用して任意の画像を補正できます。ここでは3つのアプローチについて説明します。

1. カラー/トーンインタラクティブでマトリックスを適用する

CCMが計算されたら、カラー/トーンインタラクティブウィンドウの右側にある表示ボックスで、13. 読み取り - 色補正 - 画像を保存を選択します。

左側の初期表示には、 「画像を読み込んで修正する」というメッセージが表示され、問題がなければ「修正した画像を保存する」を押してください。「画像を読み込んで修正する」または「現在の画像を修正する」のいずれかを押すことができます。

右側の例では、ColorcheckerとGalleryの画像に(デジタル)CC20C(シアン)フィルターが適用されています。フィルター処理されたColorchecker画像に対してカラー補正マトリックスが計算され、次に「13. 読み込み - カラー補正...」が選択されました。フィルター処理されたGallery画像が読み込まれ、CCMを使用して即座に補正されました。補正前の画像と補正後の画像は、それぞれ右上と右下に表示されます。

修正済み画像を保存すると、修正済みの画像が保存されます。

マルチチャート_ベクタースコープのプレビュー
補正前画像と補正後画像

この方法は単一の画像にのみ有効で、複数の画像には対応していません。

2. Imatest画像処理モジュールでマトリックスを適用する

Imatest 5.0+では、画像処理モジュールを使用して、カラー補正マトリックス(上記のようにColor/Tone InteractiveからCSVファイルとして保存したもの)を個々の画像または画像のバッチに適用できます。これを行うには、画像処理ウィンドウの左側にあるCCM(カラーマトリックス)チェックボックスをオンにします。このマトリックスは、高度に非線形なトーンマッピングとバイラテラルフィルタ処理の前に適用されます。

CCM設定は、チェックボックスの右側にある「CCM設定」ボタンをクリックすることで入力または表示できます。主な設定項目には、線形化(上記参照)、カラースペース、入力ガンマ(線形化設定の1つ)、およびマトリックス乗数(画像の明るさを調整できます。通常は1に設定されています)が含まれます。

画像処理用のCCM設定

画像処理では、単一の画像ではなく複数の画像を選択するだけで、複数の画像をまとめて処理できます。複数の画像が選択された場合、 root_file_name.extという名前のファイルは、 root_file_name – ext -improc.png という名前で自動的に保存されます。

3. Matlabコードを使用して行列を外部から適用する

カラーチェック_1_raw_1004W
補正されていない画像

CCMはImatest以外でも適用できます。ここでは、Matlabを使った行列の適用例を示します。Matlabをお持ちの方は試してみてください(お持ちでない場合は、CやPythonなどの別の言語に変換してください)。

右側に表示されている補正されていない24パッチのカラーチェッカー画像は、カラー補正マトリックスの計算への入力として使用されます。これは、RAW画像から作成され、カラー補正なしでJPEGファイルに変換された後、縮小処理されています。画像をクリック(または右クリック)するとダウンロードできます。

この画像はColor/Tone Interactiveに読み込まれ、以下の設定で色補正されました。

最適化: Delta-E 00

線形化:入力が線形であると仮定し、行列を適用した後、カラースペースガンマ符号化を適用します。

重み付け: 2. ハイライトを強調する

クロマ乗数: 1.06

XYZ行列を計算します...

補正結果は以下のとおりです。補正後の色は非常に正確で、既に処理済みの画像にこのマトリックスを適用した場合に通常得られる値よりも優れています(ΔE ab平均 = 5.32、ΔE 00平均 = 3.11)。

カラーチェック_1_マルチチャート_相関

カラー補正マトリックスは、 「ファイル」 → 「カラーマトリックスをクリップボードにコピー」をクリックし、このページに直接貼り付けることで取得できます。必要に応じて、このページからコピーすることも可能です。

1.48663 -0.192007 0.033443
-0.612018 2.03673 -0.796356
-0.367863 -0.580001 3.04927

カラーチェック_1_修正済み表示
修正された画像

画像ファイルにCCMを適用するプログラムは、下のボックス内にあります。2020年7月に更新され、シンプルなグラフィカルユーザーインターフェースを備え、より簡単に実行できるようになりました。変数correctedRGBを含むコア計算は、カスタムコード開発のテンプレートとして使用できます。

プログラムをシステムにロードするには、ボックス内のテキストを選択し、クリップボードにコピー(Ctrl+C)し、Matlab(またはその他の)エディタに貼り付け、mファイル( ccm_test.m )として保存します。

ccm_testを実行する前に、カラー/トーンモジュールを使用してCCMを計算する必要があります。テスト用の画像がない場合は、補正されていない画像(上記)をダウンロードし、3×3のCCM(これも上記)をクリップボードにコピーしてください。

Matlabコマンドウィンドウからccm_testを実行するには、以下の手順に従ってください。

  1. 可能であれば、CCMをクリップボードにコピーしてください(カラー/トーンモジュールのファイルドロップダウンメニューを使用するか、テキストファイルでCtrl+Cを押します)。ブラウザウィンドウで上記の3×3のCCMテキストを選択し、コピー(Ctrl+C)することもできます。
  2. ccm_testを入力してください。
  3. 基本的な手順が表示されたウィンドウが開きます。「OK」をクリックしてください。
  4. 狭い窓が開いて
    1. ガンマ値を入力してください(補正されていないファイルの場合は1(上記)):カラー/トーンインタラクティブの濃度プロットからガンマ値を算出できます)
    2. CCMを入力してください(クリップボードから貼り付けるのが一番簡単です)。
  5. 画像ファイルを参照して開くことができるウィンドウが開きます。
  6. 修正された画像が表示されます。必要であれば保存できます。

右側に、出力画像(上記の入力画像を補正したもの)を示します。

function ccm_test
% Test program for applying Color Correction matrix.
% Output for display gamma = 2.2 — sRGB and Adobe RGB color spaces.

uiwait(msgbox(['We recommend that you calculate the Color Correction Matrix (CCM),' newline ...
'and copy Color Matrix to the clipboard before running ccm_test.' newline newline ...
'After you click OK, two input dialog boxes will open.' newline newline ...
'1. a narrow box for entering the encoding gamma and entering or pasting the CCM.' newline ...
'2. A box for browsing and opening the image file to be corrected by the CCM.'], ...
'ccm_test instructions'));

answer = inputdlg({'Enter encoding gamma (typically 0.5-1)'; 'Paste or enter the 3×3 CCM into this box'}, ...
'Enter gamma and CCM', [1 20; 3 20]);
gamma = str2num(answer{1}); %#ok
ccmnum = str2num(answer{2}); %#ok
szcc = size(ccmnum); % Keep for diagnostics.
if isempty(answer{2}) || szcc(1)<3 || szcc(1)>4 || szcc(2)<3 || szcc(2)>4
ans2 = answer{2}; % sz2 = size(ans2),
ccmnum = [str2num(ans2(1,:)); str2num(ans2(2,:)); str2num(ans2(3,:))]
gamtemp = str2num(ans2(6,:)); %#ok
if isempty(answer{1}) && ~isempty(gamtemp)
gamma = gamtemp;
end
if isempty(ccmnum)
disp(['CCM is empty or badly-sized– try again.' newline 'szcc = ' num2str(szcc)]); 
return; 
end
end

[im,path] = uigetfile('*.*','Enter the image file to be corrected by the CCM'); % Find image file 
imagefile = fullfile(path,im);
if im==0 | isempty(path) | isempty(im), return; end %#ok

imageRGB = imread(imagefile); % Read the image file.
imtype = class(imageRGB); % Image type: typically uint8 or uint16.
imageRGB = double(imageRGB)/double(intmax(imtype)); % Normalize to maximum for image type.
figure; image(imageRGB);
title(['Original image: gamma = ' num2str(gamma)]); % Works without Image Processing Toolbox.

linearRGB = imageRGB.^(1/gamma); % Linearize the image (apply inverse of encoding gamma).

% Change to 2D to apply matrix; then change back.
[my, mx, mc] = size(linearRGB); % rows, columns, colors (3)
linearRGB = reshape(linearRGB,my*mx,mc); 
correctedRGB = linearRGB*ccmnum; 
correctedRGB = min(correctedRGB,1); correctedRGB = max(correctedRGB,0); % Place limits on output.
correctedRGB = correctedRGB.^(1/2.2); % Apply gamma for sRGB, Adobe RGB color space.
% Deal with saturated pixels. Not perfect, but this is what cameras do. Related to “purple fringing”.
correctedRGB(linearRGB==1) = 1; % Don't change saturated pixels. (We don't know HOW saturated.)
correctedRGB = reshape(correctedRGB, my, mx, mc);

figure; image(correctedRGB); title('Corrected image');

tosave = questdlg('Do you want to save the corrected image?','Save the corrected image?', 'Yes','No','No');
if strcmpi(tosave,'Yes')
[path,imroot,ext] = fileparts(imagefile);
imsave = [imroot '-CCM-corr' ext];
sfile = fullfile(path,imsave);
[savef, savepath] = uiputfile(fullfile(path,'*.*'), ...
'Enter a file name to save the CCM-corrected results; empty otherwise', sfile);
savefile = fullfile(savepath,savef);
imwrite(correctedRGB, savefile);
disp(['Results written to ' savefile]);
end

リンク

計算の背景については、Stephen Wolf 著のColor Correction Matrixに記載されていますが、Imatest の計算は多くの点で異なります。外れ値の問題はなく、最適化は標準的な色差指標の 1 つを使用して実行されます。