2017年2月9日木曜日

カラー版誤差拡散法(ErrorDiffusionColorFilter)

 今回はカラー版の誤差拡散法フィルタを作成します。考え方は前回の誤差拡散法と同様ですが、白黒の2色ではなく赤緑青がそれぞれ255または0のときの色を用います。そのため、全部で8色が使用されます。
 Tutorial1Activityクラスと同じ場所にErrorDiffusionColorFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height) {
        int length = width*height;
        int rgbarray[][]=new int[3][imageArray.length];
        int[] oimgArray = new int[imageArray.length];
        int rgb;
        int red,green,blue;
        int y_val;
        for(int i =0;i < length;i++){
            rgb = imageArray[i];
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            rgbarray[0][i]=red;//①
            rgbarray[1][i]=green;
            rgbarray[2][i]=blue;
        }
        int point=0;
        int error=0;
        for(int i=0;i < 3;i++){
            for(int y=0;y < height; y++){
                for(int x=0;x < width;x++){
                    point=x+y*width;
                    if(rgbarray[i][point] > 127){//②
                        error=rgbarray[i][point]-255;
                        rgbarray[i][point]=255;
                    }else{
                        error=rgbarray[i][point];
                        rgbarray[i][point]=0;
                    }
                    if((x+1) < width){
                        rgbarray[i][point+1]+=error*7/16;//③
                    }
                    if((y+1) < height){
                        if((x-1) >= 0){
                            rgbarray[i][point-1+width]+=error*3/16;
                        }
                        rgbarray[i][point+width]+=error*5/16;
                        if((x+1) < width){
                            rgbarray[i][point+1+width]+=error*1/16;
                        }
                    }
                }
            }
        }

        for(int i =0;i < length;i++){
            oimgArray[i]=255*16777216+rgbarray[0][i]*65536+rgbarray[1][i]*256+rgbarray[2][i];
        }
        return oimgArray;
    }


①ではまず赤緑青の値を配列に格納しています。
②では赤緑青それぞれの色の値を127と比較し、0や255との差をエラー値として格納しています。
③ではフロイド-スタインバーグ・ディザリングの伝播方法に基づいてエラー値を伝播させます。

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

以下に実機での実行結果を示します。8色で作製したにもかかわらず、実際の色をかなり再現できていることがわかります。

0 件のコメント:

コメントを投稿