2017年2月13日月曜日

ガンマ補正フィルタ(GammaTransFilter)

 今回はガンマ補正フィルタを作成します。ガンマ補正フィルタはトーンカーブ調整を行うフィルタの一つです。トーンカーブとは画像補正機能の一つで、画像全体の色調やカラーを調整することが出来ます。補正前のデータ値(入力レベル)と補正後のデータ値(出力レベル)の変化を線で表したもので、その線を調整することで画像の色調を細かく補正します。詳しくは以下のサイトを参照してください。
https://www.gen-zo.com/technique/col_tone.html

トーンカーブはPhotoshopでも利用可能です。下にフォトショップでのトーンカーブ画面を表示します。
次に、ガンマ補正ですが、これは明るさを補正するための補正数値を示します。特徴は、モニタ、デジカメ等の画像の階調性を人間の見た目に最適な階調に補正します。その際の補正式はout = inγとなっています。(outやinは0~1の値)このγの値によって、補正の効果が変わります。ガンマ値が1より大きい時は暗くなり、ガンマ値が1より小さい時には明るくなります。ガンマ補正によるトーンカーブの例が下の図になります。

0から255の対角線が基準線を示し、それよりも上にある場合には画像が明るくなり、下にある場合には画像が暗くなります。図のように、ガンマ値が小さければ明るく、大きければ暗くなります。

ガンマ補正を用いた画像処理を実装します。 Tutorial1Activityクラスと同じ場所にGammaTransFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height,double gamma) {
        if(gamma<=0){
            gamma=1;//①
        }
        int table[]=new int[256];
        for(int i =0;i < 256;i++){
            table[i]=(int) (255*Math.pow((((double)i)/255),(1/gamma)));//②
            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 alpha,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以下の引数について1に変換しています。ガンマのとれる値が0より大きい値でなければならないためです。
 ②ではガンマ値の計算を行っています。まず、ルックアップテーブルの現在の値を255で割り、0~1の範囲に変換します。その後、ガンマ値を用いた計算を行います。最後に255をかけて0~255の範囲に戻します。
 それ以降の処理はポスタリゼーションなどルックアップテーブルを用いるフィルタと同じです。
 最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new GammaTransFilter().filter(imageArray, imagewidth, imageheight,1.5);

第4引数がガンマ値にかかわる値で、基本的に0より大きい値を入れます。②からわかるように、この引数が大きいと画像が明るくなり、小さいと画像が暗くなります。

 以下に実機での実行結果を示します。上の図が引数1.5のとき、下の図が引数0.5のときです。ヒストグラムが大きく変化していることがわかります。

0 件のコメント:

コメントを投稿