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