2017年2月10日金曜日

ポスタリゼーションフィルタ(PosterizationFilter)

今回はポスタリゼーションフィルタを作成します。ポスタリゼーションとは、画像の階調(通常各色255段階)を落とすことでポスターを描いているような描写にする処理です。階調は任意の数を指定することができます。例えば、3段階の階調に変更する場合は、0~85までの値を0に、86~170までの値を127に、171~255までの値を255に変換します。詳しくは以下のサイトを参照してください。
http://www.sm.rim.or.jp/~shishido/post.html

Tutorial1Activityクラスと同じ場所にPosterizationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height, int gradation) {
        int range=255/(gradation-1);
        int slash=255/gradation;
        int table[]=new int[256];
        int num=0;
        for(int i =0;i < 256;i++){
            num=i/slash;
            if(num==0){
                table[i]=0;
            }else if(num >= gradation-1){
                table[i]=255;
            }else{
                table[i]=range*num;
            }
        }
        int length = width*height;
        int[] oimgArray = new int[imageArray.length];
        int rgb;
        int alpha,red,green,blue;
        for(int i =0;i < length;i++){
            rgb = imageArray[i];
            alpha = (rgb >> 24) & 0xff;
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            oimgArray[i]=alpha*16777216+
                    table[red]*65536+table[green]*256+table[blue];
        }
        imageArray=null;
        return oimgArray;
    }

 ①は階調変換後の値を決めるための値の増加幅を計算しています。例えば、階調数が5ならば、63が増加幅になります。
 ②は階調変換の区間幅を指定します。階調数が5ならば51ごとの区間になります。
 ③は0~255の値のそれぞれについて、階調数ある区間のなかで、どの区間に相当するかを計算しています。階調数が5ならば、0~51は0番の区間、52~102は1番の区間になります。
 ④は0番の区間についてルックアップテーブルの値を0に設定しています。
 ⑤は階調数-1以上の区間についてルックアップテーブルの値を255に設定しています。
 ⑥ではそれら以外の区間について、ルックアップテーブルを区間番号×①の増加幅に設定しています。
 ⑦ではこれまでに得られたルックアップテーブルを用いて色の変換を行っています。

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

メソッドの第4引数が階調数を示します。
 以下に実機での実行結果を示します。階調数は5です。ポスターのように色がグラディエーションではなく段階になっていることがわかります。また、ヒストグラムも5本のバーで構成されていることがわかります。




0 件のコメント:

コメントを投稿