爬虫類嫌いのPython日記

爬虫類が大の苦手の筆者が、Pythonに挑戦。他にも、RubyやObjective-C、Google Appengine、Herokuなど色々とチャレンジしています。

グレースケールのアルゴリズム

Androidでカメラを操作するプログラムを作っていた際に、画像のグレースケールについて調べてみました。
色々な手法があるようですが、大体、以下の3つが使われることが多いようです。

彩度を下げる

各ピクセルの彩度を0に設定する方法です。
単純にグレースケール化できる反面、RGBの各成分がグレースケールに反映されず、全体的にノッペリとした印象のグレースケールになります。

RGB値の平均値をとる

単純に彩度を下げる方法のデメリットを解消するために、RGB値の平均値をとります。
(Rの成分+Gの成分+Bの成分)/3で求められた数値を使用します。
デメリットは、人間の視覚的感覚を考慮せずに平均値をとるため、グレースケール化した場合に違和感を感じる場合があるようです。

平均値に重みを付ける

平均値をとる場合に、視覚的感覚を係数にして重みを付ける方法です。
計算式は、少し複雑です。
(Rの成分*0.299+Gの成分*0.587+Bの成分*0.114)で求められた数値を使用します。
係数を 256倍して整数だけの計算にすると、プログラムの高速化を図ることもできます。