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