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_SCALE3X_HH
00027 # define MLN_UPSCALING_ART_SCALE3X_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       scale3x(const Image<I>& input);
00065 
00066 
00067 # ifndef MLN_INCLUDE_ONLY
00068 
00069 
00070       template <typename I>
00071       mln_concrete(I)
00072       scale3x(const Image<I>& input_)
00073       {
00074         trace::entering("mln::upscaling::art::scale3x");
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() * 3,
00083                                  input.domain().pmax() * 3
00084                                  + 2 * mln::down_right);
00085 
00086         mln_concrete(I) output(ext_domain);
00087 
00088 
00089         mln_piter(I) p(input.domain());
00090         for_all(p)
00091         {
00092 
00093           
00094           
00095           
00096           mln_site(I)
00097             pA = p + mln::up_left,
00098             pB = p + mln::up,
00099             pC = p + mln::up_right,
00100             pD = p + mln::left,
00101             pE = p,
00102             pF = p + mln::right,
00103             pG = p + mln::down_left,
00104             pH = p + mln::down,
00105             pI = p + mln::down_right,
00106             pOut = p * 3 + mln::down_right;
00107 
00108           
00109           if (input(pD) == input(pB)
00110               && input(pD) != input(pH)
00111               && input(pB) != input(pF))
00112             output(pOut + mln::up_left) = input(pD);
00113           else
00114             output(pOut + mln::up_left) = input(p);
00115 
00116           
00117           
00118           if ((input(pD) == input(pB)
00119                && input(pD) != input(pH)
00120                && input(pB) != input(pF)
00121                && input(pE) != input(pC))
00122               || (input(pB) == input(pF)
00123                   && input(pB) != input(pD)
00124                   && input(pF) != input(pH)
00125                   && input(pE) != input(pA)))
00126             output(pOut + mln::up) = input(pB);
00127           else
00128             output(pOut + mln::up) = input(p);
00129 
00130           
00131           if (input(pB) == input(pF)
00132               && input(pB) != input(pD)
00133               && input(pF) != input(pH))
00134             output(pOut + mln::up_right) = input(pF);
00135           else
00136             output(pOut + mln::up_right) = input(p);
00137 
00138           
00139           
00140           if ((input(pH) == input(pD)
00141                && input(pH) != input(pF)
00142                && input(pD) != input(pB)
00143                && input(pE) != input(pA))
00144               || (input(pD) == input(pB)
00145                   && input(pD) != input(pH)
00146                   && input(pB) != input(pF)
00147                   && input(pE) != input(pG)))
00148             output(pOut + mln::left) = input(pD);
00149           else
00150             output(pOut + mln::left) = input(p);
00151 
00152           
00153           output(pOut) = input(p);
00154 
00155           
00156           
00157           if ((input(pB) == input(pF)
00158                && input(pB) != input(pD)
00159                && input(pF) != input(pH)
00160                && input(pE) != input(pI))
00161               || (input(pF) == input(pH)
00162                   && input(pF) != input(pB)
00163                   && input(pH) != input(pD)
00164                   && input(pE) != input(pC)))
00165             output(pOut + mln::right) = input(pF);
00166           else
00167             output(pOut + mln::right) = input(p);
00168 
00169           
00170           if (input(pH) == input(pD)
00171               && input(pH) != input(pF)
00172               && input(pD) != input(pB))
00173             output(pOut + mln::down_left) = input(pD);
00174           else
00175             output(pOut + mln::down_left) = input(p);
00176 
00177 
00178           
00179           
00180           if ((input(pF) == input(pH)
00181                && input(pF) != input(pB)
00182                && input(pH) != input(pD)
00183                && input(pE) != input(pG))
00184               || (input(pH) == input(pD)
00185                   && input(pH) != input(pF)
00186                   && input(pD) != input(pB)
00187                   && input(pE) != input(pI)))
00188             output(pOut + mln::down) = input(pH);
00189           else
00190             output(pOut + mln::down) = input(p);
00191 
00192 
00193           
00194           if (input(pF) == input(pH)
00195               && input(pF) != input(pB)
00196               && input(pH) != input(pD))
00197             output(pOut + mln::down_right) = input(pF);
00198           else
00199             output(pOut + mln::down_right) = input(p);
00200 
00201         }
00202 
00203         trace::exiting("mln::upscaling::art::scale3x");
00204         return output;
00205       }
00206 
00207 
00208 # endif // ! MLN_INCLUDE_ONLY
00209 
00210 
00211     } 
00212 
00213   } 
00214 
00215 } 
00216 
00217 
00218 #endif // ! MLN_UPSCALING_ART_SCALE3X_HH