PsychoPyでガンマ補正

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

#ガンマ補正てなに？
PsychoPyでは、色の情報を-1から+1の値で表します。またRed, Green, Blueの順番で指定します。

|色|RGB|
|:--|:--|
|真っ白|[1, 1, 1]|
|真っ黒|[-1, -1, -1]|
|グレー（灰色）|[0, 0, 0]|

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

<img width="489" alt="スクリーンショット 2019-09-20 16.54.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/267b395b-f86d-eda4-0689-72eb9ba248fb.png">

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

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

# モニターセンター
PsychoPyではモニターセンターでガンマ補正を行うことができます。モニターセンターについての基本的な使い方は[PsychoPyのモニターセンター](https://qiita.com/kurokida/items/472068f452a5b82825be)を参照してください。

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

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

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

<img width="1052" alt="スクリーンショット 2019-09-20 16.59.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/3af0c60a-9464-89b3-9fc0-d898bdc57675.png">

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

<img width="358" alt="スクリーンショット 2019-09-20 17.02.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/ca579eb2-0c0c-662d-0884-c4c3a1f05e06.png">

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

<img width="524" alt="スクリーンショット 2019-09-20 17.02.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/0f69901d-8018-b390-9220-f604177ef1f1.png">

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

![輝度の実測値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/02873fd3-7ab4-dcc1-ff17-1ed366f8c30d.png)


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

<img width="1052" alt="スクリーンショット 2019-09-20 17.16.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/4cbee83f-2312-c573-7691-2b1aa9e5b1ff.png">

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

<img width="512" alt="スクリーンショット 2019-09-24 10.11.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/213191eb-1956-54ff-3b4a-c89b7892808e.png">

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

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

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

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

```python
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()
```

ちなみに私のパソコンでの結果をグラフにしてみました。ご参考までに。
<img width="489" alt="スクリーンショット 2019-09-24 10.25.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495823/2dc8dc54-5b21-c3a7-cf82-1830f68e2875.png">

[公式のガンマ補正に関するページ](https://www.psychopy.org/general/gamma.html)もぜひご覧ください。