2017年2月13日月曜日

上下限マッピングフィルタ(HighLowMapFilter)

今回はトーンカーブ調整手法の一つである上下限マッピングフィルタを作成します。上下限マッピングフィルタでは値の上下限を決め、その範囲内を0-255に変換するフィルタです。トーンカーブは以下の図のようになります。



Tutorial1Activityクラスと同じ場所にHighLowMapFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
 public int[] filter(int[] imageArray, int width, int height, int max , int min) {
  double distance=max-min;//①
  double rate=255/distance;//②
  int table[]=new int[256];
  for(int i =0;i < 256;i++){
   if(i < min){
    table[i]=0;
   }else if(i > max){
    table[i]=255;
   }else{
    table[i]=(int)((i-min)*rate);//③
   }
  }
  int length = width*height;
  int[] oimgArray = new int[imageArray.length];
  int rgb;
  int red,green,blue;
  for(int i =0;i < length;i++){
   rgb = imageArray[i];
   red = (rgb >> 16) & 0xff;
   green = (rgb >> 8) & 0xff;
   blue = (rgb) & 0xff;
   oimgArray[i]=255*16777216+
     table[red]*65536+table[green]*256+table[blue];

  }
  imageArray=null;
  return oimgArray;
 }


 ①では上下限の幅を計算し、②で255をその幅で割ることで、倍率を計算します。
 ③では得られた倍率から、上下限の間の値について、新しい値を計算します。

最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new HighLowMapFilter().filter(imageArray, imagewidth, imageheight, 200,50);

第四引数が上限を、第五引数が下限を示します。
 以下に実機での実行結果を示します。上限は200、下限が50です。白飛びや黒つぶれが発生しますが、コントラスト比が上がっていることがわかります。

また、引数を変えることで以下のようなトーンカーブを得ることができます。
引数の上限を300、下限を-50に指定した場合の実機の画像が以下です。ヒストグラムの分布に上限と下限が現れ、コントラストが下がっていることがわかります。


0 件のコメント:

コメントを投稿