OSDN Git Service

[TAG]NyARToolkit/2.5.0
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.5.0 / src / jp / nyatla / nyartoolkit / core / analyzer / histogram / NyARHistogramAnalyzer_KittlerThreshold.java
1 package jp.nyatla.nyartoolkit.core.analyzer.histogram;\r
2 \r
3 import jp.nyatla.nyartoolkit.core.types.NyARHistogram;\r
4 \r
5 \r
6 /**\r
7  * kittlerThresholdの方式で閾値を求めます。\r
8  * @param i_histogram\r
9  * @return\r
10  */\r
11 public class NyARHistogramAnalyzer_KittlerThreshold implements INyARHistogramAnalyzer_Threshold\r
12 {\r
13         public int getThreshold(NyARHistogram i_histogram)\r
14         {\r
15                 int i;          \r
16                 double min=Double.MAX_VALUE;\r
17                 int th=0;\r
18                 int da,sa,db,sb,pa,pb;\r
19                 double oa,ob;\r
20                 \r
21                 int[] hist=i_histogram.data;\r
22                 int n=i_histogram.length;\r
23                 //Low側\r
24                 da=pa=0;\r
25                 int h;\r
26                 for(i=0;i<n;i++){\r
27                         h=hist[i];\r
28                         da+=h*i;        //i*h[i]\r
29                         pa+=h*i*i;      //i*i*h[i]\r
30                 }\r
31                 sa=i_histogram.total_of_data;\r
32                 //High側(i=n-1)\r
33                 db=0;\r
34                 sb=0;\r
35                 pb=0;\r
36                 \r
37                 \r
38                 for(i=n-1;i>0;i--){\r
39                         //次のヒストグラムを計算\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
43                         da-=hist_val;\r
44                         sa-=hist_count;\r
45                         pa-=hist_val2;\r
46                         db+=hist_val;\r
47                         sb+=hist_count;                 \r
48                         pb+=hist_val2;\r
49 \r
50                         //初期化\r
51                         double wa=(double)sa/(sa+sb);\r
52                         double wb=(double)sb/(sa+sb);\r
53                         if(wa==0 || wb==0){\r
54                                 continue;\r
55                         }\r
56 \r
57                         oa=ob=0;\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
61 \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
65 \r
66                         double kai=wa*Math.log(oa/wa)+wb*Math.log(ob/wb);\r
67                         if(kai>0 && min>kai){\r
68                                 min=kai;\r
69                                 th=i;\r
70                         }\r
71                         //System.out.println(kai);\r
72 \r
73                 }\r
74                 return th;//129//7.506713872738873\r
75         }\r
76         public static void main(String[] args)\r
77         {\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
81                 }\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
86                 return;\r
87         }\r
88 }\r