2017年2月8日水曜日

ランダムディザフィルタ(RandomDitherFilter)

 今回は二値化方法の一つであるランダムディザフィルタを作成します。ディザ、ディザリングとは制限された色数でそれ以上の色調を表現する技法です。今回は、黒(0)と白(255)からグレイスケール(0-255)のような画像を作成します。ランダムディザでは、まず画像を輝度グレイスケールに変換します。その後、ここで得た 0から255までの256階調を使って白にするか黒にするか確率計算を行います。例えば、得られた値が128のとき、128/255で約50%の確率になります。そのため、確率50%で白に、確率50%で黒になります。得られた値が64の場合は25%で白に、75%で黒になります。
http://blog.nariyu.jp/2015/01/canvas-image-effects/#fx-random-dither

 Tutorial1Activityクラスと同じ場所にRandomDitherFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height) {
        int length = width*height;
        int[] oimgArray = new int[imageArray.length];
        int rgb;
        int red,green,blue;
        int y_val;
        double rand;
        for(int i =0;i < length;i++){
            rgb = imageArray[i];
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            y_val = ( 2 * red + 4 * green + blue ) / 7;
            rand=Math.random()*255;//①
            if(y_val>=rand){//②
                y_val=255;
            }else{
                y_val=0;
            }
            oimgArray[i]=255*16777216+y_val*65536+y_val*256+y_val;
        }
        return oimgArray;
    }

 ①では確率の計算用に0~1の乱数を発生させています。そして、②でピクセルの輝度が乱数以上ならば白に、乱数以下ならば黒にします。

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

以下に実機での実行結果を示します。白黒の二値画像ですが、Pタイル法などで2値画像にした時よりも人物の輪郭や髪の濃淡などがわかるようになっています。




0 件のコメント:

コメントを投稿