2017年2月7日火曜日

二値画像の膨張処理(DilationFilter)

今回は二値画像の膨張処理を実装します。膨張処理とは、二値画像における処理方法のひとつで、各ピクセルについてそのピクセルと周囲のピクセルを調べ、一つでも白色があるならば白色に変換する処理です。そのため、処理の後は基本的に白色が増えます。具体的な処理などは前回同様以下のHPを参照してください。
http://imagingsolution.blog107.fc2.com/blog-entry-101.html

プログラムのコーディングに移ります。 Tutorial1Activityクラスと同じ場所にDilationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
    public int[] filter(int[] imageArray, int width, int height,int n) {
        int[] oimgArray = new int[imageArray.length];
        for(int nth=0;nth < n;nth++){
            int[] blackArray=new int[imageArray.length];
            for(int i =0;i < imageArray.length;i++){
                blackArray[i]=imageArray[i]& 0xff;
            }
            for (int x = 1; x < width-1; x++) {
                for (int y = 1; y < height-1; y++) {
                    int black=blackArray[x + y * width]+blackArray[x + y * width+1]+blackArray[x + y * width-1]
                            +blackArray[x + (y-1) * width]+blackArray[x + (y+1) * width]
                            +blackArray[x + (y-1) * width+1]+blackArray[x + (y-1) * width-1]
                            +blackArray[x + (y+1) * width+1]+blackArray[x + (y+1) * width-1];//①
                    if(black > 0){
                        oimgArray[x + y * width] = 0xFFFFFFFF;
                    }else{
                        oimgArray[x + y * width] = 0xFF000000;
                    }
                }
            }
            for (int i = 0; i < imageArray.length; i++) {
                if (oimgArray[i]==0) {
                    oimgArray[i] = 0xFFFFFFFF;
                }
            }
            imageArray=oimgArray;
        }
        return oimgArray;
    }

 前回と異なる場所は①の場所(前回の④)のみです。ここでは、あるピクセルとその周囲のピクセルについて、白黒の値の論理和を求めます。このとき、黒がいくつあっても白が一つでもあれば①の答えは0より大きくなります。逆にすべてのピクセルが黒の場合は答えは0になります。

Tutorial1ActivityクラスにDilationFilterを記入する際には必ず二値処理の後に加えます。今回は以下のような順番で記載しました。
imageArray =new PTileFilter().filter(imageArray, imagewidth, imageheight,50);
imageArray =new DilationFilter().filter(imageArray, imagewidth, imageheight, 2);
imageArray =new HistogramFilter().filter(imageArray, imagewidth, imageheight);


DilationFilterの第四引数は膨張回数を示しており、回数だけ膨張処理が繰り返されます。この例では2回繰り返されます。
 以下に実機での実行結果を示します。繰り返し回数は2です。Pタイル法フィルターの実行結果に比べて白が増えていることがわかります。ヒストグラムでも0(黒)のバーが短く、255(白)のバーが長くなっています。


0 件のコメント:

コメントを投稿