Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Recent Chamber Activity

2023-04-16
2023-03-24
2023-03-22
2023-01-25

Recent Wiki Changes

2023-04-16
2023-03-24
2023-01-25
2023-01-08
2023-01-07

Wiki Guide

Side Bar

色度(マンセル値)から分光反射率を推定する

はじめに

物の色は、分光反射率で定義できます(※)。分光反射率がわかれば、そこに光の波長分布や各等色関数を畳み込むことで色度値(CIEXYZ三刺激値)を求めることができます。 しかし逆に、物の色度値から分光反射率を求めようと考えると解が無数に存在することから、その物が持つ正解の分光反射率にはたどり着けません(こういった特性を「メタメリズム」というそうです)。 ただ、分光反射率のグラフを見てみると、赤は大体600nmまでは反射率が低くその後急激に高くなる、紫はM字型、緑は550nm付近が頂点となる山型、等、色の種類に応じて大体パターンが決まっているように思います(参考サイト)。 完全な正解ではないにしても、ある程度それらしい分光反射率でよければ作れるのではないか、ということで色々調べたところ、マンセル色票から分光反射率を推定する方法を見つけました。 この手法を用いると、マンセル値を入力として10nmピッチの分光反射率が得られます。 さらに、それらしい分光反射率で良ければ、10nmピッチの細かい情報は必ずしも必要ではなく、折れ線状の簡易的な定義でも充分だろう、ということで、

  • マンセル色票から10nmピッチの分光反射率を推定する(以降「方法(1)」と記載)。
  • 10nmピッチの分光反射率グラフの形に近い制御点5個で構成される折れ線状グラフを作る。
  • 折れ線状グラフの各制御点の反射率を、元のマンセル色票の色度値に等しくなるように調整する(以降「方法(2)」と記載)。
  • 折れ線状グラフにすることでどれくらい色がずれるのかを確かめるため、方法(1)、方法(2)から作成した分光反射率に対して標準光源50種の波長分布をそれぞれ畳み込んで求めた色度値を並べて比較する。

という処理をするプログラムを作成しました。

※ ここでは、ステンドグラス、ペットボトルのお茶等の透けるものや、蛍光体、玉虫色、メタマテリアル等の特殊な光の振る舞いをする物は除外。赤や水色等の普通の色で、透けない物に限定して考えます。

結果 (7.5RP 4/4 の例)

分光反射率分布の形状

ss.png

・・・折れ線が10nmピッチの分布形状に良く追従できていると思います。

光源色ごとの色度値の比較

50種類全てだと多いので、A、C、D50、D65 に絞って掲載します。

方法1 方法2
光源 x y Y x y Y
A 0.467290 0.364652 0.124928 0.468458 0.364305 0.124914
C 0.308400 0.262200 0.120000 0.308400 0.262200 0.120000
D50 0.350216 0.305363 0.120490 0.350538 0.305908 0.120600
D65 0.312384 0.274161 0.119612 0.312375 0.274624 0.119747

C光源については、きっちり合わせに行けています。他の光源も方法1と方法2で差が 0.001 台に収まっているので、この例については良好な結果が得られていると思います。

ライセンス

  • ソフト本体:1条項BSDライセンス
  • 依存ライブラリ ... 各ライブラリに適用されているライセンスに従ってください。
    • MIST : 三条項BSD License ... 逆行列の計算に使用
    • CMPFIT : 三条項BSD License ... 折れ線グラフの作成に使用
    • Colour : 三条項BSD License ... sds.pyに記述されていた50種類の標準光源データを流用させていただきました。

ソース

  • ソース
    • 更新履歴
    • 22/12/14 マンセル明度(V)から三刺激値(Y)に変換する関数と、その逆を求根法で計算する関数を追加。

参照サイト