LoginSignup
1
1

More than 5 years have passed since last update.

広色域で24ビットカラーは割とアウト

Posted at

結論

24ビットカラーで広色域(DCI-P3)は無理があるので、iPhoneのカメラの写真がHEIF(拡張子heic)になったのは必然だった。

総天然ショック

良い子のみんな! PC-9801の4096色パレットの色域がどれだけ狭かったか、よく覚えているよね!

量子ドットや4K8K(BT.2020)やiPhone(DCI-P3)でいよいよsRGBがオワコンになりつつある(ただしWebを除く)。来るべきニューメディア時代に、24ビットカラーは対応できるのか?

そんな問題意識のもと、値が1変わったときに、sRGBとAdobeRGBの色がどれだけ変わるのか調べてみた。

pip install colormathが必要。

import numpy as np
from colormath.color_diff import delta_e_cie2000
from colormath.color_objects import sRGBColor, AdobeRGBColor, LabColor
from colormath.color_conversions import convert_color

TEST_COLOR = None

def to_lab(srgb):
    return convert_color(TEST_COLOR(*(srgb / 255)), LabColor, target_illuminant='d65')

def srgb_to_lab(srgb):
    if len(srgb.shape) == 1:
        lab = to_lab(srgb)
        return lab
    else:
        labs = np.apply_along_axis(to_lab, 1, srgb)
        return labs

ciede2000 = np.vectorize(delta_e_cie2000)
STEP = np.eye(3)

def cd(c):
    return ciede2000(srgb_to_lab(c),  srgb_to_lab(c - STEP))

def calc_maxcd_by_one():
    r = np.arange(1, 255, 16)
    grid = np.array(np.meshgrid(r, r, r)).T.reshape(-1,3)
    cds = np.apply_along_axis(cd, 1, grid)
    a = grid[int(cds.argmax() / 3)]
    b = a - STEP[cds.argmax() % 3]

    return cds.max(), a, b

def main():
    global TEST_COLOR
    TEST_COLOR = sRGBColor
    maxcd, color_from, color_to = calc_maxcd_by_one()
    print('sRGB:')
    print(f'Max Color Difference of 1-step: {maxcd}  color: {color_from} -> {color_to}')

    TEST_COLOR = AdobeRGBColor
    maxcd, color_from, color_to = calc_maxcd_by_one()
    print('Adobe RGB:')
    print(f'Max Color Difference of 1-step: {maxcd}  color: {color_from} -> {color_to}')

if __name__=='__main__':
    main()

結果:

sRGB:
Max Color Difference of 1-step: 1.1805655454210477  color: [33 33 33] -> [33. 32. 33.]
Adobe RGB:
Max Color Difference of 1-step: 1.6538699060386761  color: [33 33 33] -> [33. 32. 33.]

この色差(color difference)の単位はCIE DE2000(ΔE00)。古い色差(ΔE76)では、

  • 無彩色付近
  • 近い色同士

で人間の知覚よりもずっと小さな値が出てしまっていた問題を解消している。

そもそも色差は人間の感覚を数値化したもので、だいたい以下のような感覚に対応している(ことになっている)。

ΔE 感覚
<= 1.0 人間の目には違いがわからない
1-2 よく見ると違いがわかる
> 2 一目で違いがわかる

もちろん現実には色差3がわからなかったり、プロが1以下の色差を見分けたりする。とはいえ、見比べても10の差がわからなかったり、0.1を見分けられたりすることはない。

さて、sRGBで1.18、AdobeRGBで1.65の色差をどう考えればいいのか。「よく見ると違いがわかる」ということになっている。実際に私のディスプレイでsRGBで見ると、かなり苦戦するものの、見える。

見える!

24ビットカラーが落とし所として絶好すぎて抜け出せない分野はたくさんある。帯域不足でエセ8bit時代みたいな絵になってる状態(JPEG 2000でありがち)では、こんな話に意味はない。

高品質な画像を求めるなら、広色域で24ビットカラーは無理がある。iPhoneがHEIF(拡張子heic)の30ビットカラーに移行したのも当然だった。

ちなみに

ProPhoto RGB(ROMM RGB)では2を超えてくる。48ビットカラーのリニアワークフローがお勧め。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1