http://www.sm.rim.or.jp/~shishido/post.html
Tutorial1Activityクラスと同じ場所にPosterizationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height, int gradation) {
int range=255/(gradation-1);
int slash=255/gradation;
int table[]=new int[256];
int num=0;
for(int i =0;i < 256;i++){
num=i/slash;
if(num==0){
table[i]=0;
}else if(num >= gradation-1){
table[i]=255;
}else{
table[i]=range*num;
}
}
int length = width*height;
int[] oimgArray = new int[imageArray.length];
int rgb;
int alpha,red,green,blue;
for(int i =0;i < length;i++){
rgb = imageArray[i];
alpha = (rgb >> 24) & 0xff;
red = (rgb >> 16) & 0xff;
green = (rgb >> 8) & 0xff;
blue = (rgb) & 0xff;
oimgArray[i]=alpha*16777216+
table[red]*65536+table[green]*256+table[blue];
}
imageArray=null;
return oimgArray;
}
①は階調変換後の値を決めるための値の増加幅を計算しています。例えば、階調数が5ならば、63が増加幅になります。
②は階調変換の区間幅を指定します。階調数が5ならば51ごとの区間になります。
③は0~255の値のそれぞれについて、階調数ある区間のなかで、どの区間に相当するかを計算しています。階調数が5ならば、0~51は0番の区間、52~102は1番の区間になります。
④は0番の区間についてルックアップテーブルの値を0に設定しています。
⑤は階調数-1以上の区間についてルックアップテーブルの値を255に設定しています。
⑥ではそれら以外の区間について、ルックアップテーブルを区間番号×①の増加幅に設定しています。
⑦ではこれまでに得られたルックアップテーブルを用いて色の変換を行っています。
最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new PosterizationFilter().filter(imageArray, imagewidth, imageheight,5);
メソッドの第4引数が階調数を示します。
以下に実機での実行結果を示します。階調数は5です。ポスターのように色がグラディエーションではなく段階になっていることがわかります。また、ヒストグラムも5本のバーで構成されていることがわかります。

0 件のコメント:
コメントを投稿