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