2017年2月17日金曜日

シグモイド関数フィルタ(SigmoidToneFilter)

 今回はコントラスト変換の一手法であるシグモイド関数によるフィルタを作成します。シグモイド関数はS字を描く曲線で、次の式で表されます。
f(x)=1/(1+e-x)
これを変形すると以下の式になります。
f(x)=M/(1+e-α(x-M/2))
f(x):変換後の画素値, x:元の画素値, M:255, a:パラメータ)
この式に基づいてトーンカーブを作成すると以下のようなトーンカーブになります。
このようなトーンカーブを使用する場合、上下限マッピングフィルタと同様にコントラストが強調されます。
 
  Tutorial1Activityクラスと同じ場所にSigmoidToneFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height,double a) {
        if(a <= 0){
            return imageArray;//①
        }
        int table[]=new int[256];
        double e = Math.E;
        for(int i =0;i < 256;i++){
            table[i]=(int) (255.0/(1+Math.pow(e, -a*(((double)i)-127.0))));//②
            if(table[i] > 255){
                table[i]=255;
            }else if(table[i] < 0){
                table[i]=0;
            }
        }
        int length = width*height;
        int point=0;
        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];
        }
        return oimgArray;
    }

 ①は0以下のパラメータについては処理を行わないように設定しています。パラメータのとりうる値は0より大きい値のみです。
 ②はシグモイド関数の計算処理です。M=255として計算しています。
 最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new SigmoidToneFilter().filter(imageArray, imagewidth, imageheight, 0.03);

第4引数がシグモイド関数のパラメータを示しています。パラメータは0より大きい値を入れます。
 以下に実機での実行結果を示します。パラメータは0.03を用いました。元画像よりコントラストが上がっているのがわかります。また、S字曲線の特性から、ヒストグラムが上限や下限付近に多く分布していることがわかります。



0 件のコメント:

コメントを投稿