ベイズ最適化を用いて、レンズ間の色味をホワイトバランスで調整してみた

概要

この実験を行いたくなったきっかけは、次のブログ記事でした。

カメラやってる人ならご存知かと思いますが、レンズというのは種類によって「色味」が異なります
原因はレンズの素材やコーティングによるものと思われますが、他の条件を同じに揃えても、レンズを変えるだけで写真の色味が違ってくるのです。
このことから、「このレンズは発色が良いな」「このレンズ、解像は良いけど色味が死んでる(発色が良くない)のが辛い」といった会話が出てきたりします。

そしてこれは、マイクロフォーサーズ用レンズにも当てはまります。2大高級レンズである「M.ZUIKO PRO」「LEICA DG」シリーズですが、それぞれ別の会社なだけに、レンズの色味も多少異なってきます。上記ブログ記事では、次のように述べられていました。

引用1:

LEICAの発色はニュートラルで忠実な発色と感じますが、PROは少しグリーン・イエローに傾いてくすんだ青空となっています。

引用2:

そこでLUMIX G9 PROのホワイトバランスを12-100mm F4 IS PROの装着時だけ調整してみました調整幅はB/Mへ+2。少しやりすぎ感はありますが調整前よりは青空の発色が自然なものとなっています。

ただ、この設定は人間の直感によるものですので、より確実な手段で判断できないかと考えました。
そのため、「ベイズ最適化」と呼ばれる手段により、適したホワイトバランス調整の設定を割り出すことにしました。

ベイズ最適化とは?

LUMIX G9 PROの場合、「晴天」「曇天」「日陰」「電球」などといった各プリセット設定に対し、それぞれ色味を微調整できます。

  • A(アンバー:オレンジ系)~B(ブルー:青系)方向の調整。[A+9]~[B+9]まで19段階
  • G(グリーン:緑系)~M(マゼンタ:赤系)方向の調整。[G+9]~[M+9]まで19段階

つまり、例えば「晴天」プリセットでレンズ間の色味を合わせる場合、全361通りの可能性が考えられま……やってられるか。

そのため、より「賢い」探索により、少ない回数で最適解を見つけたいものです。そのためのアルゴリズムの一つとして、「ベイズ最適化」があります。

……具体的には上記資料を見ていただきたいのですが、つまり、既存の試行結果から、「次はどの位置の評価値を確認すれば、評価値グラフの全体像がより正確になるか」を判断しているわけです。

今回の実験では、「A=-9~9」「G=-9~9」を入力、「パナライカで撮った絵の色味とM.ZUIKO PROレンズで撮った絵の色味との差」を出力とし、後者を最小化する入力がどの辺りにあるかを探ります。

ところで色味との差って?

厳密には、同一照明条件でカラーチャートを撮ればいいのですが、あまりにも高額なので、「無彩色の物体を撮って、その色の平均値」を「色味」とする作戦でごまかします。

この色味の差ですが、最初に考えたのは「R・G・B値それぞれの差の2乗の和(L2距離)」でした。ただそれだと色味比較としては不適当だと後に判明したので、「YCbCr色空間に変換し、Cb・Cr値それぞれの差の2乗の和」に変更しました。

どうやって計算するの?

そういったライブラリは既に存在するのですが、1から書くのが正直めんどくさかったので、既存のサンプルコードを参考にすることにしました。具体的には、この方のコードを参考に改造しました。

改造ポイントとしては、

  • 元々は「コーラとレモン果汁の分量」だったものを、「Aの設定とGの設定」に置き換え
    • それに伴い、[0, 1]に正規化する際の変換係数を変更
  • 「Aの設定とGの設定」を入力、「その設定のM.ZUIKO画像を読み込んでパナライカ画像との色味の差」を出力とするように、計算用のヘルパー関数を新たに作成
  • 例えば「次はA=-7.56、G=4.3を試行」と書くと分かりにくいので、「次はB8・G4を試行」と言い換え
    • 調整設定のステップは1つ毎なので、小数が出てきた場合は丸める必要がある
    • Aが負数=Bが正数、Gが負数=Mが正数と言い換えられる

といったところでしょうか。ちょっと人様に晒せる綺麗さではないので、ちゃんとスクラッチしたものをQiitaにでも上げようかと思います。

計算結果

例えば「曇天」の場合、パナライカ(LEICA DG VARIO-ELMARIT 50-200mm/F2.8-4.0 ASPH./POWER O.I.S.)では次のような感じだったものが、

パナライカ

M.ZUIKO DIGITAL ED 12-100mm F4.0 IS PROでは次のような感じになってしまいます。少し黄色いですね。

PROレンズ

そこで、ベイズ最適化を実施したところ、たった14回の測定で、「A=0.4、G=0.4」(カメラの設定値に置き換えるとB+2/M+2)近くに最適解があるだろうことが分かりました。特定が速すぎる。実際、そのように補正した絵を見ても、確かにパナライカと近い色味になっています。

推定結果

PROレンズ-2

注意事項いろいろ

  • 真面目に調整するなら、せめてカラーチャートを使いましょう
  • ベイズ最適化は、入力が3変数以上でも利用可能です。そのため、より細かな段階が分かるカラーチャートを使い、ハイライト/シャドウや彩度などといった設定も最適化候補に加えることで、更に色味を近づけることができるでしょう
  • とりあえず基準となる白点を合わせるだけなら、「白点をホワイトと仮定して調整する」ホワイトバランス機能を使えば、両者で簡単に色味が揃います。LUMIX G9 PRO以外のカメラでもそういった機能は付いていると思います

この記事へのコメント