2017年2月10日金曜日

HSV変換による彩度フィルタ(SaturationFilter)

今回はHSV変換を用いた彩度変換フィルタを作成します。前回(ヒートマップフィルタ)で作成したHSVTransクラスを使用しますので作成していない方は作成してください。基本的な考え方はHSVの各値の中でSの値を変化させることで彩度を変化させます。

 Tutorial1Activityクラスと同じ場所にSaturationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height, int value) {
        HSVTrans trans=new HSVTrans();
        int length = width*height;
        int[] oimgArray = new int[imageArray.length];
        int hsv[]=new int[3];
        for(int i =0;i < length;i++){
            hsv=trans.RGBtoHSV(imageArray[i]);//①
            hsv[1]+=value;//②
            if(hsv[1] > 255){
                hsv[1]=255;//③
            }else if(hsv[1] < 0){
                hsv[1]=0;//③
            }
            oimgArray[i]=trans.HSVtoRGB(hsv);
        }
        return oimgArray;
    }

①ではRGB値を含むint型の値をHSV配列に変換します。
 ②ではHSVのなかでSに任意の値(メソッドの第4引数)を加えます。
 ③では②で変化したSの値が0~255の範囲となるように値をまるめます。
 ④ではHSVの値をRGBに戻します。

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

メソッドの第4引数が変化させる彩度の値を示します。

 以下に実機での実行結果を示します。元の画像から少し鮮やかさが増しているのがわかります。


0 件のコメント:

コメントを投稿