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
00026 #ifndef MLN_UPSCALING_ART_SCALE2X_HH
00027 # define MLN_UPSCALING_ART_SCALE2X_HH
00028
00032
00033
00034 # include <mln/core/concept/box.hh>
00035 # include <mln/core/concept/image.hh>
00036 # include <mln/core/alias/neighb2d.hh>
00037 # include <mln/core/alias/dpoint2d.hh>
00038
00039 # include <mln/extension/adjust_duplicate.hh>
00040
00041
00042 namespace mln
00043 {
00044
00045 namespace upscaling
00046 {
00047
00048 namespace art
00049 {
00050
00062 template <typename I>
00063 mln_concrete(I)
00064 scale2x(const Image<I>& input);
00065
00066
00067 # ifndef MLN_INCLUDE_ONLY
00068
00069
00070 template <typename I>
00071 mln_concrete(I)
00072 scale2x(const Image<I>& input_)
00073 {
00074 trace::entering("mln::upscaling::art::scale2x");
00075
00076 const I& input = exact(input_);
00077 mln_precondition(input.is_valid());
00078 mlc_is_a(mln_domain(I), Box)::check();
00079
00080 extension::adjust_duplicate(input, 1);
00081
00082 mln_domain(I) ext_domain(input.domain().pmin() * 2,
00083 input.domain().pmax() * 2
00084 + mln::down_right);
00085
00086 mln_concrete(I) output(ext_domain);
00087
00088 mln_piter(I) p(input.domain());
00089 for_all(p)
00090 {
00091
00092
00093
00094
00095 mln_site(I)
00096 pA = p + mln::up,
00097 pB = p + mln::right,
00098 pC = p + mln::left,
00099 pD = p + mln::down,
00100 pOut = p * 2;
00101
00102
00103 if (input(pC) == input(pA)
00104 && input(pC) != input(pD)
00105 && input(pA) != input(pB))
00106 output(pOut) = input(pA);
00107 else
00108 output(pOut) = input(p);
00109
00110
00111 if (input(pA) == input(pB)
00112 && input(pA) != input(pC)
00113 && input(pB) != input(pD))
00114 output(pOut + mln::right) = input(pB);
00115 else
00116 output(pOut + mln::right) = input(p);
00117
00118
00119 if (input(pD) == input(pC)
00120 && input(pD) != input(pB)
00121 && input(pC) != input(pA))
00122 output(pOut + mln::down) = input(pC);
00123 else
00124 output(pOut + mln::down) = input(p);
00125
00126
00127 if (input(pB) == input(pD)
00128 && input(pB) != input(pA)
00129 && input(pD) != input(pC))
00130 output(pOut + mln::down_right) = input(pD);
00131 else
00132 output(pOut + mln::down_right) = input(p);
00133
00134 }
00135
00136 trace::exiting("mln::upscaling::art::scale2x");
00137 return output;
00138 }
00139
00140
00141 # endif // ! MLN_INCLUDE_ONLY
00142
00143
00144 }
00145
00146 }
00147
00148 }
00149
00150
00151 #endif // ! MLN_UPSCALING_ART_SCALE2X_HH