http://www.mis.med.akita-u.ac.jp/~kata/image/equalize.html
Tutorial1Activityクラスと同じ場所にToneEqualizationFilterクラスを作成します。その後、filterメソッドに以下のコードを入力します。
public int[] filter(int[] imageArray, int width, int height) { int tone[][]=ToneCalculator(imageArray);//① int length = width*height; int tonemap[][]=new int[3][256]; tonemap[0]=tonemapping(tone[0],length);//② tonemap[1]=tonemapping(tone[1],length); tonemap[2]=tonemapping(tone[2],length); int[] oimgArray = new int[imageArray.length]; int rgb; int alpha,red,green,blue; for(int i =0;i < length;i++){ rgb = imageArray[i]; red = (rgb >> 16) & 0xff; green = (rgb >> 8) & 0xff; blue = (rgb) & 0xff; oimgArray[i]=255*16777216+ tonemap[0][red]*65536+tonemap[1][green]*256+tonemap[2][blue]; } return oimgArray; }
①は前回同様に画像のヒストグラムを計算します。以下にメソッドを記載します。
public int[][] ToneCalculator(int[] imageArray){ int tone[][]=new int[3][256]; int length = imageArray.length; int rgb; int red,green,blue; for(int i =0;i < length;i++){ rgb = imageArray[i]; red = (rgb >> 16) & 0xff; green = (rgb >> 8) & 0xff; blue = (rgb) & 0xff; tone[0][red]+=1; tone[1][green]+=1; tone[2][blue]+=1; } return tone; }
②はヒストグラムの均一化を行います。以下にメソッドを記載します。
public int[] tonemapping(int tone[], int all_pixel){ int cumulative=0; int tonemap[]=new int[256]; for(int i =0;i < 256;i++){ cumulative+=tone[i];//③ tonemap[i]=(cumulative*255)/all_pixel;//④ } return tonemap; }③はヒストグラムを左から累積した値を示します。
④では累積した値を全画素数で割ることで、現在の色の値(0~255)がどの値にマッピングされるかを計算します。
最後に、 Tutorial1Activityクラスのint imageArray[]=ba2ia(ba);の下に以下の文を記入します。
imageArray=new ToneEqualizationFilter().filter(imageArray, imagewidth, imageheight);
以下に実機での実行結果を示します。ヒストグラムの棒が長いほど、棒の左側に間隔が空くことがわかります。