00001 #ifndef bsta_otsu_threshold_txx_ 00002 #define bsta_otsu_threshold_txx_ 00003 00004 #include "bsta_otsu_threshold.h" 00005 00006 template <class T> 00007 bsta_otsu_threshold<T>::bsta_otsu_threshold(bsta_histogram<T> const& hist) 00008 : distribution_1d_(hist) 00009 { 00010 } 00011 00012 template <class T> 00013 bsta_otsu_threshold<T>::bsta_otsu_threshold(vcl_vector<T> data, T low , T high) 00014 :distribution_1d_(low,high,data) 00015 { 00016 } 00017 00018 template <class T> 00019 bsta_otsu_threshold<T>::~bsta_otsu_threshold() 00020 { 00021 } 00022 00023 template <class T> 00024 unsigned bsta_otsu_threshold<T>::bin_threshold() const 00025 { 00026 T no_of_pixels_in_class1=0; 00027 int threshold =0; 00028 T max_between_class_variance=0; 00029 T no_of_pixels_in_class2 = distribution_1d_.area(); 00030 00031 for (unsigned t=0; t<distribution_1d_.nbins(); ++t) 00032 { 00033 T mu1 = distribution_1d_.mean(0, t); 00034 T mu2 = distribution_1d_.mean(t, distribution_1d_.nbins()-1); 00035 00036 T between_class_variance=no_of_pixels_in_class1*no_of_pixels_in_class2* 00037 (mu1-mu2)*(mu1-mu2); 00038 00039 if (between_class_variance>max_between_class_variance) 00040 { 00041 max_between_class_variance=between_class_variance; 00042 threshold=t; 00043 } 00044 no_of_pixels_in_class1+=distribution_1d_.counts(t); 00045 no_of_pixels_in_class2-=distribution_1d_.counts(t); 00046 } 00047 00048 return threshold; 00049 } 00050 00051 #undef BSTA_OTSU_THRESHOLD_INSTANTIATE 00052 #define BSTA_OTSU_THRESHOLD_INSTANTIATE(T) \ 00053 template class bsta_otsu_threshold<T > 00054 00055 #endif // bsta_otsu_threshold_txx_
1.5.1