1 package jp.nyatla.nyartoolkit.core.analyzer.histgram;
\r
3 import jp.nyatla.nyartoolkit.core.types.NyARHistgram;
\r
7 * 画素数が2048^2に満たない場合は、fixedint(24-8)で計算できます。
\r
12 public class NyARHistgramAnalyzer_DiscriminantThreshold implements INyARHistgramAnalyzer_Threshold
\r
14 private double _score;
\r
17 public int getThreshold(NyARHistgram i_histgram)
\r
19 int[] hist=i_histgram.data;
\r
20 int n=i_histgram.length;
\r
21 int da,sa,db,sb,dt,pt,st;
\r
29 pt+=h*i*i;//正規化の時に使う定数
\r
31 st=i_histgram.total_of_data;
\r
40 //各ヒストグラムの分離度を計算する(1<=i<=n-1の範囲で評価)
\r
43 int hist_count=hist[i];
\r
44 int hist_val=hist_count*i;
\r
52 double mt=(double)(da+db)/dv;
\r
53 double ma=(sa!=0?((double)da/(double)sa):0)-mt;
\r
54 double mb=(sb!=0?((double)db/(double)sb):0)-mt;
\r
55 double kai=((double)(sa*(ma*ma)+sb*(mb*mb)))/dv;
\r
61 //System.out.println(kai);
\r
64 this._score=max/((double)(pt+max_mt*max_mt*st-2*max_mt*dt)/st);//129,0.8888888888888887
\r
68 * 最後に実行したgetThresholdのスコアを返します。
\r
69 * スコアは正規化された分離度。1.0-0.0の範囲を取る。0.7以上なら概ね双峰的です。
\r
72 public final double getLastScore()
\r
79 public static void main(String[] args)
\r
81 NyARHistgram data=new NyARHistgram(256);
\r
82 for(int i=0;i<256;i++){
\r
83 data.data[i]=128-i>0?128-i:i-128;
\r
85 data.total_of_data=data.getTotal(0,255);
\r
86 NyARHistgramAnalyzer_DiscriminantThreshold an=new NyARHistgramAnalyzer_DiscriminantThreshold();
\r
87 int th=an.getThreshold(data);
\r
88 System.out.print(th);
\r