2017年2月7日火曜日

Pタイル法フィルター(PTileFilter)

 今回は二値変換の方法の一つであるPタイル法について書きます。Pタイル法は画像の二値化したい領域が全画像の領域に占める割合を パーセント(%)で指定し二値化する手法です。Pタイル法については以下のHPをご覧ください。
http://imagingsolution.blog107.fc2.com/blog-entry-112.html

プログラムのコーディングを行います。  Tutorial1Activityクラスと同じ場所にPTileFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray,int width, int height, int threshould) {
        int tone[]=new int[256];
        int length=width*height;
        int border_length=length*threshould/100;//①
        int y_val = 0;
        int rgb = 0;
        int red = 0, green = 0, blue = 0;
        int[] oimgArray = new int[imageArray.length];
        for (int j = 0; j < imageArray.length; j++) {
            rgb = imageArray[j];
            red = (rgb >> 16) & 0xff;
            green = (rgb >> 8) & 0xff;
            blue = (rgb) & 0xff;
            y_val = ( 2 * red + 4 * green + blue ) / 7;//②
            oimgArray[j]=y_val;
            tone[y_val]++;//③
        }
        int total=0;
        int border=-1;
        for(int i =0;i < 256;i++){
            total+=tone[i];//④
            if(total>border_length){//⑤
                border=i;
                break;
            }
        }
        for (int j = 0; j < imageArray.length; j++) {
            if(oimgArray[j]>border){//⑥
                oimgArray[j] = 0xFFFFFFFF;
            }else{
                oimgArray[j] = 0xFF000000;
            }
        }
        return oimgArray;
    }

 ①は全ピクセル数について、閾値の割合に対応するピクセル数を取得しています。閾値が50ならば、全ピクセル数の50%に当たる数を取得します。
 ②はBinaryFilterによる二値化と同様に輝度を計算しています。
 ③は各輝度(0~255)について、出現回数を計算しています。
 ④は各輝度の出現回数を、0から順番に積み上げていきます。そして、⑤で①のピクセル数以上になったときに、その輝度を境界線として記録します。
 ⑥では 各ピクセルの輝度について境界線と比較し、高いならば白に、低いならば黒に色を変換します。

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

この時、第四引数が閾値(%)を示します。範囲を外れてもエラーは発生しませんが、基本的に閾値の範囲は0~100までとなります。なお、BinaryFilterについてはコメントアウトしておいてください。
 以下に実機での実行結果を示します。 閾値は50%です。BinaryFilterと比較して、白の割合が増えています。また、ヒストグラムを見るとわかりますが、BinaryFilterでは異なっていた0のバーと255のバーの長さが、Pタイル法ではほぼ同じになっています。

0 件のコメント:

コメントを投稿