0
0

More than 5 years have passed since last update.

PsychoPyでガンマ補正

Last updated at Posted at 2019-09-24

ガボールパッチのような刺激を呈示する知覚実験などにおいては、ガンマ補正が必要になります。
PsychoPyではガンマ補正を簡単に行うことができますが、私も以下の手順で問題がないのかやや自信がありません。参考程度にお願いします。お気づきのことは、どしどしコメントください。

ガンマ補正てなに?

PsychoPyでは、色の情報を-1から+1の値で表します。またRed, Green, Blueの順番で指定します。

RGB
真っ白 [1, 1, 1]
真っ黒 [-1, -1, -1]
グレー(灰色) [0, 0, 0]

ここで輝度計を使って、真っ白、真っ黒、グレーのそれぞれの輝度を実際に測定してみると、
グレー = (真っ白 + 真っ黒) / 2
とは残念ながらなりません。ゆるやかなカーブを描くことが知られています。

スクリーンショット 2019-09-20 16.54.23.png

これを知らずに実験をしていると、想定していた輝度と違う輝度で実際には表示されていたということになりかねません。

そこでガンマ補正を行います。ガンマ補正とは、プログラムで記述した輝度情報と、実測した輝度値が線形の関係になるように調整することです。

モニターセンター

PsychoPyではモニターセンターでガンマ補正を行うことができます。モニターセンターについての基本的な使い方はPsychoPyのモニターセンターを参照してください。

対応したフォトメーター(PR650など)をお持ちでしたら、ケーブルでパソコンと接続し、自動的にガンマ補正を行うことができるようです(未確認)

私は Minolta CS-100Aを持っていますが、パソコンとケーブルで接続せずに手動で測定しました。ここではその方法をご説明します。

「ガンマ補正」をクリックします。フォトメーターを選択できるようになっていますが、手動で行う限り、無関係だと思われます。

スクリーンショット 2019-09-20 16.59.23.png

「semi」を選択します。他の数値は必要に応じて変更してください。初期値のままでも大きな問題はないでしょう。

スクリーンショット 2019-09-20 17.02.28.png

その後、次のような画面になります。中央部分の輝度を測定します。グレースケールを8回測定したあと、赤を7回、緑を7回、青を7回測定します。測定した値は紙と鉛筆で記録しておきましょう。結構時間がかかりますが、がんばって〜。

スクリーンショット 2019-09-20 17.02.46.png

最後に、測定した値を入力します。

輝度の実測値.png

うまくいくと線形化のところに値が入力されているはずです。ガンマプロットも見てみてください。

スクリーンショット 2019-09-20 17.16.41.png

ガンマプロットはこんな感じ。

スクリーンショット 2019-09-24 10.11.57.png

実測

ガンマ補正が適切に行われているか、必ず実測しましょう。

ガンマ補正がうまくいっているかを確認するためのコードを公開しておきます。
キーを押すたびに、真っ黒(-1)から真っ白(+1)まで、0.2刻みで画面の色が変わります。

フルスクリーンではなくウィンドウで表示するときは、fullscr = Falseに。monitor = 'testMonitor'は自分の設定に書き換えてください。現在の輝度情報をmessageで表示しています。不要ならコメントアウトしてください。

まずはガンマ補正前の状態を測定して、ガンマ補正をしたあとにもう一度測定をしてみてください。

import numpy as np
from psychopy import visual, core, event
win = visual.Window([400,400], fullscr=True, monitor='testMonitor')
message = visual.TextStim(win, units="norm", pos=(-0.8,0.8),alignHoriz='left')
background = visual.ShapeStim(win, units="norm", vertices=((-1, -1), (1, -1), (1, 1), (-1, 1)))
for i in np.linspace(-1,1,11):
    background.setColor([i, i, i], 'rgb')
    background.draw() 
    message.text = str(i)
    message.draw()
    win.flip()
    event.waitKeys()

ちなみに私のパソコンでの結果をグラフにしてみました。ご参考までに。
スクリーンショット 2019-09-24 10.25.30.png

公式のガンマ補正に関するページもぜひご覧ください。

0
0
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
0
0