ICC プロファイルのメディアの白色点について混乱した件
D65 光源であるはずの sRGB の ICC v4 ディスプレイカラープロファイルを見たときに、メディアの白色点が D50 光源になっていたことが違和感でした。
どうもこれは ICC による仕様通りであり、問題ないようで、wtpt
タグにはプロファイルごとの色彩測定の白色点が書かれるわけではないようです。むしろプロファイル接続空間 (PCS) 的に都合がいいので、ディスプレイプロファイルにおいては D50 であることを要求していました。
In ICC v4, the requirement was introduced that the media white point of a Display class profile shall be equal to D50 (i.e.
[96.42, 100, 82.49]
). This is in fact implied in v2, but many profile creators did not grasp the rationale for it and as a result some incorrect profiles were created and distributed. Today CMMs anticipate such errors and have implemented strategies to avoid the potential problems.
rXYZ
などの各基準値タグに書かれているのは、色順応を含めた D50 光源への変換です。色順応自体のパラメータは chad
タグに記載されています。
First, the ICC.1 architecture is based on a D50 profile connection space (PCS). The PCS provides an unambiguous colour space in which profiles can be connected, but both source and destination data can have any colorimetry provided that it is transformed to D50 by chromatic adaptation. The transform used to convert the colorimetry of the measured white point to D50 is included in the profile as the 'chad' tag.
ちなみに、色順応に変換行列を用いる場合、白色点は以下のように計算できます。
import numpy as np
import numpy.linalg
# D50 White point
wtpt = np.array([0.964, 1.0, 0.825])
# Chromatic adaptation matrix (sRGB D65)
chad = np.array([
[1.047836, 0.022903, -0.050201],
[0.029541, 0.990509, -0.017075],
[-0.009247, 0.015076, 0.751724],
])
# D65 White point: array([0.95031203, 1.00001455, 1.08911158])
numpy.linalg.inv(chad) @ wtpt