1 package jp.nyatla.nyartoolkit.core.analyzer.histogram;
\r
3 import jp.nyatla.nyartoolkit.core.types.NyARHistogram;
\r
7 * kittlerThresholdの方式で閾値を求めます。
\r
11 public class NyARHistogramAnalyzer_KittlerThreshold implements INyARHistogramAnalyzer_Threshold
\r
13 public int getThreshold(NyARHistogram i_histogram)
\r
16 double min=Double.MAX_VALUE;
\r
18 int da,sa,db,sb,pa,pb;
\r
21 int[] hist=i_histogram.data;
\r
22 int n=i_histogram.length;
\r
29 pa+=h*i*i; //i*i*h[i]
\r
31 sa=i_histogram.total_of_data;
\r
40 int hist_count=hist[i];//h[i]
\r
41 int hist_val =hist_count*i; //h[i]*i
\r
42 int hist_val2=hist_val*i; //h[i]*i*i
\r
51 double wa=(double)sa/(sa+sb);
\r
52 double wb=(double)sb/(sa+sb);
\r
58 double ma=sa!=0?(double)da/sa:0;
\r
59 //Σ(i-ma)^2*h[i]=Σ(i^2*h[i])+Σ(ma^2*h[i])-Σ(2*i*ma*h[i])
\r
60 oa=((double)(pa+ma*ma*sa-2*ma*da))/sa;
\r
62 double mb=sb!=0?(double)db/sb:0;
\r
63 //Σ(i-mb)^2*h[i]=Σ(i^2*h[i])+Σ(mb^2*h[i])-Σ(2*i*mb*h[i])
\r
64 ob=((double)(pb+mb*mb*sb-2*mb*db))/sb;
\r
66 double kai=wa*Math.log(oa/wa)+wb*Math.log(ob/wb);
\r
67 if(kai>0 && min>kai){
\r
71 //System.out.println(kai);
\r
74 return th;//129//7.506713872738873
\r
76 public static void main(String[] args)
\r
78 NyARHistogram data=new NyARHistogram(256);
\r
79 for(int i=0;i<256;i++){
\r
80 data.data[i]=128-i>0?128-i:i-128;
\r
82 data.total_of_data=data.getTotal(0,255);
\r
83 NyARHistogramAnalyzer_KittlerThreshold an=new NyARHistogramAnalyzer_KittlerThreshold();
\r
84 int th=an.getThreshold(data);
\r
85 System.out.print(th);
\r