2015年11月6日金曜日

【OpenCV】ガンマとシグモイド

ディスプレイはRGBをそのまま表示できるわけではないらしい。とうわけで、表示する時にはディスプレイによって画像の補正がかけられているんだそうです。それがガンマ補正。詳しくはこちらがわかりやすかった。

画面にそのまま表示すると暗くなってしまうから、明るく補正をかけているんだけど、厄介なことにディスプレイやOSによってこのガンマの値が違うらしい。

このガンマ補正どこかで聞いたことあるなーって思ったら、photoshopの明るさ補正でも利用できるらしいとのこと(ここまでさっきのサイトでほぼ得た知識です。)

そういえばこれって、photohopのトーンカーブでいじった時の曲線と一緒なんですね。



void cv_CreateGammaTable(double gamma, uchar *lut){

      //ガンマ補正テーブルの作成
      int i;
      for (i = 0; i < 256; i++){
          lut[i] = (int)(pow((double)i / 255.0, 1.0 / gamma) * 255.0);
      }
}

で、結果が



だいたいこんな感じ、せっかくなのでトーンカーブをこんな感じにした時は、



シグモイド曲線と言って、コントラスト調整をかける時に利用する式を利用する。

void cv_CreateSigmoidTable(double sigmoid, uchar *lut){
      //コントラスト調整用のテーブルの作成
      int i;
      for (i = 0; i < 256; i++){
          lut[i] = 255.0 / (1+exp(-sigmoid*(i-128)/255));
      }
}

で、結果が

だいたいこんな感じで、photoshopでかけていた曲線をOpenCVで実現できる、もとい数式で表現できるという感じですね。photoshopの方を若干似せたつもりだったけど、似ていないけど、雰囲気は伝わるとは思うのでご愛嬌。

参考
ガンマ補正
ゴリラになる知識 - コントラスト調整
OpenCVでガンマ補正

追記:
ソースはこちらに上げていきます
https://github.com/tsukajizo/study_computer_vision