00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef CLIP_MIN_MAX_HH_
00026 #define CLIP_MIN_MAX_HH_
00027
00028 namespace ost { namespace img { namespace alg {
00029
00030 namespace {
00031
00032 template<typename T>
00033 bool cbigger(T& v, Real rv, const Complex& cv);
00034
00035 template<>
00036 bool cbigger<Real>(Real& v, Real rv, const Complex& cv) {return v>=rv;}
00037
00038 template<>
00039 bool cbigger<Complex>(Complex& v, Real rv, const Complex& cv) {return std::abs(v)>=std::abs(cv);}
00040
00041 template<typename T>
00042 bool cbigger(T& v, Real rv, const Complex& cv)
00043 {
00044 return static_cast<Real>(v)>=rv;
00045 }
00046 template<typename T>
00047 T get_t(Real rv, const Complex& cv);
00048 template<>
00049 Real get_t<Real>(Real rv, const Complex& cv){return rv;}
00050 template<>
00051 Complex get_t<Complex>(Real rv, const Complex& cv){return cv;}
00052 template<typename T>
00053 T get_t(Real rv, const Complex& cv){return static_cast<T>(rv);}
00054
00055 struct ClipMinMaxFnc {
00056 explicit ClipMinMaxFnc() { set_rl(0.0); set_ru(1.0); }
00057 explicit ClipMinMaxFnc(Real l,Real u) {set_rl(l);set_ru(u);}
00058 explicit ClipMinMaxFnc(const Complex& l, const Complex& u) {set_cl(l);set_cu(u);}
00059
00060 void SetThresholds(Real l,Real u) {set_rl(l);set_ru(u);}
00061 void SetThresholds(const Complex& l, const Complex& u) {set_cl(l);set_cu(u);}
00062
00063 template <typename T, class D>
00064 void VisitState(ImageStateImpl<T,D>& isi) const {
00065 for(T* p = isi.Data().GetData(); p<isi.Data().GetEnd();++p) {
00066 (*p)= cbigger<T>(*p,r_tl_,c_tl_)? (cbigger<T>(*p,r_tu_,c_tu_)? get_t<T>(r_tu_,c_tu_) :(*p)) :get_t<T>(r_tl_,c_tl_) ;
00067 }
00068 }
00069
00070 static String GetAlgorithmName() {return "ClipMinMax";}
00071
00072 private:
00073 Real r_tl_;
00074 Real r_tu_;
00075 Complex c_tl_;
00076 Complex c_tu_;
00077
00078 void set_rl(Real f) {r_tl_=f; c_tl_=Val2Val<Real,Complex>(f);}
00079 void set_ru(Real f) {r_tu_=f; c_tu_=Val2Val<Real,Complex>(f);}
00080 void set_cl(const Complex& f) {c_tl_=f; r_tl_=Val2Val<Complex,Real>(f);}
00081 void set_cu(const Complex& f) {c_tu_=f; r_tu_=Val2Val<Complex,Real>(f);}
00082
00083 };
00084
00085 }
00086
00087 typedef ImageStateConstModIPAlgorithm<ClipMinMaxFnc> ClipMinMax;
00088
00089 }
00090
00091
00092
00093 }}
00094
00095
00096
00097 #endif