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 件のコメント:
コメントを投稿