環境
- Windows10
- Python3.5.2
- PIL (Pillow)
Pillow インストール
デフォルトで入ってるかもしれませんが。
$ pip install pillow
実装内容
下の画像にグレースケール変換を行います。
実装内容は3ステップ。
- 画像の読み込み
- 1ピクセルごとにRGBを取得してグレースケール計算
- 新しい画像を生成
2のグレースケール計算ではこちらの二つの方法を試します。
- 中間値法
- NTSC係数による加重平均法
中間値法
対象ピクセルのr,g,bの値のうち最大の値と最小の値を用いて
Y = (min+max) / 2
をグレーの値としてます。すなわち(r,g,b) = (Y,Y,Y)。
NTSC係数による加重平均法
いわゆる「輝度」を求める方法です。輝度はRGBの値をもとに以下の計算で求められます。
L = ( 0.298912 * r + 0.586611 * g + 0.114478 * b )
そのうえで、(r,g,b) = (L,L,L) とすればよいです。
コード
たいしたことないですが。
結果
結果はこちら。
一番左が、PILのconvert
メソッドを適用したもの。真ん中が中間値法。右がNTSC係数による加重平均法です。中間値法の結果が若干明るく仕上がり、PILの機能でグレー変換した画像と輝度計算の結果画像が同じようになりました。
実際にPillowのソースコード見てみると、Pillow/PIL/Image.pyのL820に以下のように書いてあり、やはり同じ実装をしていることがうかがえます。
次は各ピクセルの輝度勾配も求めてみようと思います。
以上です。
参考