Olena-patches
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
September 2009
- 9 participants
- 188 discussions
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-09-07 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Fix output dimensions.
* fabien/mln/upsampling/hq4x.hh: Fix output dimensions.
---
hq4x.hh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh (revision 4433)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh (revision 4434)
@@ -340,7 +340,7 @@
int nrows = geom::nrows(input);
int ncols = geom::ncols(input);
- mln_concrete(image2d<T>) output(nrows * 3, ncols * 3);
+ mln_concrete(image2d<T>) output(nrows * 4, ncols * 4);
int LUT16to32[65536];
int RGBtoYUV[65536];
1
0
r4433: Add HQ4x algorithm, change license and add credit to original author
by Fabien Freling 07 Sep '09
by Fabien Freling 07 Sep '09
07 Sep '09
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-09-07 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Add HQ4x algorithm, change license and add credit to original author.
* fabien/mln/upsampling/hq2x.hh: Change license and add credit to
original author.
* fabien/mln/upsampling/hq3x.hh: Change license and add credit to
original author.
* fabien/mln/upsampling/hq4x.hh: Implement HQ4x algorithm, still
not working properly.
* fabien/tests/upsampling/Makefile: Add target `hq4x'.
* fabien/tests/upsampling/hq4x.cc: New test file for hq4x().
---
mln/upsampling/hq2x.hh | 37
mln/upsampling/hq3x.hh | 36
mln/upsampling/hq4x.hh | 5419 ++++++++++++++++++++++++++++++++++++++++++++++
tests/upsampling/Makefile | 3
tests/upsampling/hq4x.cc | 29
5 files changed, 5481 insertions(+), 43 deletions(-)
Index: trunk/milena/sandbox/fabien/tests/upsampling/hq4x.cc
===================================================================
--- trunk/milena/sandbox/fabien/tests/upsampling/hq4x.cc (revision 0)
+++ trunk/milena/sandbox/fabien/tests/upsampling/hq4x.cc (revision 4433)
@@ -0,0 +1,29 @@
+#include <mln/core/image/image2d.hh>
+
+#include <mln/io/ppm/all.hh>
+#include <mln/value/rgb8.hh>
+
+#include <mln/upsampling/hq4x.hh>
+
+
+using namespace mln;
+using value::rgb8;
+
+
+int main(int argc, char* argv[])
+{
+ if (argc != 3)
+ {
+ std::cout << "Usage: " << argv[0] << " input output" << std::endl;
+ return 1;
+ }
+
+ image2d<rgb8> ima;
+ io::ppm::load(ima, argv[1]);
+
+ image2d<rgb8> hq4x_ima;
+ hq4x_ima = upsampling::hq4x(ima);
+ io::ppm::save(hq4x_ima, argv[2]);
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/tests/upsampling/Makefile
===================================================================
--- trunk/milena/sandbox/fabien/tests/upsampling/Makefile (revision 4432)
+++ trunk/milena/sandbox/fabien/tests/upsampling/Makefile (revision 4433)
@@ -7,3 +7,6 @@
hq3x: hq3x.cc
${CXX} ${CXXFLAGS} ${INC} $^ -o hq3x
+
+hq4x: hq4x.cc
+ ${CXX} ${CXXFLAGS} ${INC} $^ -o hq4x
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh (revision 4432)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh (revision 4433)
@@ -1,34 +1,28 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
-//
-// This file is part of Olena.
-//
-// Olena is free software: you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, version 2 of the License.
+//Copyright (C) 2003 MaxSt ( maxst(a)hiend3d.com )
+
+//This program is free software; you can redistribute it and/or
+//modify it under the terms of the GNU Lesser General Public
+//License as published by the Free Software Foundation; either
+//version 2.1 of the License, or (at your option) any later version.
//
-// Olena is distributed in the hope that it will be useful,
+//This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Public License for more details.
+//Lesser General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with Olena. If not, see <http://www.gnu.org/licenses/>.
-//
-// As a special exception, you may use this file as part of a free
-// software project without restriction. Specifically, if other files
-// instantiate templates or use macros or inline functions from this
-// file, or you compile this file and link it with other files to produce
-// an executable, this file does not by itself cause the resulting
-// executable to be covered by the GNU General Public License. This
-// exception does not however invalidate any other reasons why the
-// executable file might be covered by the GNU General Public License.
+//You should have received a copy of the GNU Lesser General Public
+//License along with this program; if not, write to the Free Software
+//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
#ifndef MLN_UPSAMPLING_HQ2X_HH
# define MLN_UPSAMPLING_HQ2X_HH
/// \file
///
-/// Produce an up-scaled image using hq2x algorithm.
+/// Produce an up-scaled image using hq2x algorithm by Maxim Stepin.
+/// Reference can be found at:
+/// http://web.archive.org/web/20070624082212/www.hiend3d.com/hq2x.html
# include <mln/geom/ncols.hh>
# include <mln/geom/nrows.hh>
@@ -41,7 +35,6 @@
namespace upsampling
{
- /// Subsampling FIXME : doxy
template <typename I>
inline
mln_concrete(I)
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh (revision 4432)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh (revision 4433)
@@ -1,34 +1,28 @@
-// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
-//
-// This file is part of Olena.
-//
-// Olena is free software: you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation, version 2 of the License.
+//Copyright (C) 2003 MaxSt ( maxst(a)hiend3d.com )
+
+//This program is free software; you can redistribute it and/or
+//modify it under the terms of the GNU Lesser General Public
+//License as published by the Free Software Foundation; either
+//version 2.1 of the License, or (at your option) any later version.
//
-// Olena is distributed in the hope that it will be useful,
+//This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Public License for more details.
+//Lesser General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with Olena. If not, see <http://www.gnu.org/licenses/>.
-//
-// As a special exception, you may use this file as part of a free
-// software project without restriction. Specifically, if other files
-// instantiate templates or use macros or inline functions from this
-// file, or you compile this file and link it with other files to produce
-// an executable, this file does not by itself cause the resulting
-// executable to be covered by the GNU General Public License. This
-// exception does not however invalidate any other reasons why the
-// executable file might be covered by the GNU General Public License.
+//You should have received a copy of the GNU Lesser General Public
+//License along with this program; if not, write to the Free Software
+//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
#ifndef MLN_UPSAMPLING_HQ3X_HH
# define MLN_UPSAMPLING_HQ3X_HH
/// \file
///
-/// Produce an up-scaled image using hq3x algorithm.
+/// Produce an up-scaled image using hq3x algorithm by Maxim Stepin.
+/// Reference can be found at:
+/// http://web.archive.org/web/20070624082212/www.hiend3d.com/hq3x.html
# include <mln/geom/ncols.hh>
# include <mln/geom/nrows.hh>
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh (revision 0)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq4x.hh (revision 4433)
@@ -0,0 +1,5419 @@
+//Copyright (C) 2003 MaxSt ( maxst(a)hiend3d.com )
+
+//This program is free software; you can redistribute it and/or
+//modify it under the terms of the GNU Lesser General Public
+//License as published by the Free Software Foundation; either
+//version 2.1 of the License, or (at your option) any later version.
+//
+//This program is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+//Lesser General Public License for more details.
+//
+//You should have received a copy of the GNU Lesser General Public
+//License along with this program; if not, write to the Free Software
+//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+#ifndef MLN_UPSAMPLING_HQ4X_HH
+# define MLN_UPSAMPLING_HQ4X_HH
+
+/// \file
+///
+/// Produce an up-scaled image using hq4x algorithm by Maxim Stepin.
+/// Reference can be found at:
+/// http://web.archive.org/web/20070624082212/www.hiend3d.com/hq4x.html
+
+# include <mln/geom/ncols.hh>
+# include <mln/geom/nrows.hh>
+# include <mln/value/rgb8.hh>
+
+
+namespace mln
+{
+
+ namespace upsampling
+ {
+
+ /// Subsampling FIXME : doxy
+ template <typename I>
+ inline
+ mln_concrete(I)
+ hq4x(const Image<I>& input);
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+ inline
+ unsigned short
+ rgb8toShort(value::rgb8 val)
+ {
+ unsigned short result = 0;
+
+ result += val.red() >> 3;
+ result = result << 6;
+ result += val.green() >> 2;
+ result = result << 5;
+ result += val.blue() >> 3;
+
+ return result;
+ }
+
+ inline
+ void
+ intToRgb8(int in, value::rgb8& out)
+ {
+ out.blue() = in % 256;
+ out.green() = (in >> 8) % 256;
+ out.red() = (in >> 16) % 256;
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp1(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 * 3 + c2) >> 2, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp2(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 2 + c2 + c3) >> 2, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp3(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 * 7 + c2) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp5(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 + c2) >> 1, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp6(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 5 + c2 * 2 + c3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp7(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 6 + c2 + c3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp8(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 * 5 + c2 * 3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ InterpI(image2d<T>& output, int row, int col, int c1)
+ {
+ intToRgb8(c1, output.at_(row, col));
+ }
+
+
+# define PIXEL00_0 InterpI(output, i * 4, j * 4, c[5]);
+# define PIXEL00_11 Interp1(output, i * 4, j * 4, c[5], c[4]);
+# define PIXEL00_12 Interp1(output, i * 4, j * 4, c[5], c[2]);
+# define PIXEL00_20 Interp2(output, i * 4, j * 4, c[5], c[2], c[4]);
+# define PIXEL00_50 Interp5(output, i * 4, j * 4, c[2], c[4]);
+# define PIXEL00_80 Interp8(output, i * 4, j * 4, c[5], c[1]);
+# define PIXEL00_81 Interp8(output, i * 4, j * 4, c[5], c[4]);
+# define PIXEL00_82 Interp8(output, i * 4, j * 4, c[5], c[2]);
+
+# define PIXEL01_0 InterpI(output, i * 4, j * 4 + 1, c[5]);
+# define PIXEL01_10 Interp1(output, i * 4, j * 4 + 1, c[5], c[1]);
+# define PIXEL01_12 Interp1(output, i * 4, j * 4 + 1, c[5], c[2]);
+# define PIXEL01_14 Interp1(output, i * 4, j * 4 + 1, c[2], c[5]);
+# define PIXEL01_21 Interp2(output, i * 4, j * 4 + 1, c[2], c[5], c[4]);
+# define PIXEL01_31 Interp3(output, i * 4, j * 4 + 1, c[5], c[4]);
+# define PIXEL01_50 Interp5(output, i * 4, j * 4 + 1, c[2], c[5]);
+# define PIXEL01_60 Interp6(output, i * 4, j * 4 + 1, c[5], c[2], c[4]);
+# define PIXEL01_61 Interp6(output, i * 4, j * 4 + 1, c[5], c[2], c[1]);
+# define PIXEL01_82 Interp8(output, i * 4, j * 4 + 1, c[5], c[2]);
+# define PIXEL01_83 Interp8(output, i * 4, j * 4 + 1, c[2], c[4]);
+
+# define PIXEL02_0 InterpI(output, i * 4, j * 4 + 2, c[5]);
+# define PIXEL02_10 Interp1(output, i * 4, j * 4 + 2, c[5], c[3]);
+# define PIXEL02_11 Interp1(output, i * 4, j * 4 + 2, c[5], c[2]);
+# define PIXEL02_13 Interp1(output, i * 4, j * 4 + 2, c[2], c[5]);
+# define PIXEL02_21 Interp2(output, i * 4, j * 4 + 2, c[2], c[5], c[6]);
+# define PIXEL02_32 Interp3(output, i * 4, j * 4 + 2, c[5], c[6]);
+# define PIXEL02_50 Interp5(output, i * 4, j * 4 + 2, c[2], c[5]);
+# define PIXEL02_60 Interp6(output, i * 4, j * 4 + 2, c[5], c[2], c[6]);
+# define PIXEL02_61 Interp6(output, i * 4, j * 4 + 2, c[5], c[2], c[3]);
+# define PIXEL02_81 Interp8(output, i * 4, j * 4 + 2, c[5], c[2]);
+# define PIXEL02_83 Interp8(output, i * 4, j * 4 + 2, c[2], c[6]);
+
+# define PIXEL03_0 InterpI(output, i * 4, j * 4 + 3, c[5]);
+# define PIXEL03_11 Interp1(output, i * 4, j * 4 + 3, c[5], c[2]);
+# define PIXEL03_12 Interp1(output, i * 4, j * 4 + 3, c[5], c[6]);
+# define PIXEL03_20 Interp2(output, i * 4, j * 4 + 3, c[5], c[2], c[6]);
+# define PIXEL03_50 Interp5(output, i * 4, j * 4 + 3, c[2], c[6]);
+# define PIXEL03_80 Interp8(output, i * 4, j * 4 + 3, c[5], c[3]);
+# define PIXEL03_81 Interp8(output, i * 4, j * 4 + 3, c[5], c[2]);
+# define PIXEL03_82 Interp8(output, i * 4, j * 4 + 3, c[5], c[6]);
+
+# define PIXEL10_0 InterpI(output, i * 4 + 1, j * 4, c[5]);
+# define PIXEL10_10 Interp1(output, i * 4 + 1, j * 4, c[5], c[1]);
+# define PIXEL10_11 Interp1(output, i * 4 + 1, j * 4, c[5], c[4]);
+# define PIXEL10_13 Interp1(output, i * 4 + 1, j * 4, c[4], c[5]);
+# define PIXEL10_21 Interp2(output, i * 4 + 1, j * 4, c[4], c[5], c[2]);
+# define PIXEL10_32 Interp3(output, i * 4 + 1, j * 4, c[5], c[2]);
+# define PIXEL10_50 Interp5(output, i * 4 + 1, j * 4, c[4], c[5]);
+# define PIXEL10_60 Interp6(output, i * 4 + 1, j * 4, c[5], c[4], c[2]);
+# define PIXEL10_61 Interp6(output, i * 4 + 1, j * 4, c[5], c[4], c[1]);
+# define PIXEL10_81 Interp8(output, i * 4 + 1, j * 4, c[5], c[4]);
+# define PIXEL10_83 Interp8(output, i * 4 + 1, j * 4, c[4], c[2]);
+
+# define PIXEL11_0 InterpI(output, i * 4 + 1, j * 4 + 1, c[5]);
+# define PIXEL11_30 Interp3(output, i * 4 + 1, j * 4 + 1, c[5], c[1]);
+# define PIXEL11_31 Interp3(output, i * 4 + 1, j * 4 + 1, c[5], c[4]);
+# define PIXEL11_32 Interp3(output, i * 4 + 1, j * 4 + 1, c[5], c[2]);
+# define PIXEL11_70 Interp7(output, i * 4 + 1, j * 4 + 1, c[5], c[4], c[2]);
+
+# define PIXEL12_0 InterpI(output, i * 4 + 1, j * 4 + 2, c[5]);
+# define PIXEL12_30 Interp3(output, i * 4 + 1, j * 4 + 2, c[5], c[3]);
+# define PIXEL12_31 Interp3(output, i * 4 + 1, j * 4 + 2, c[5], c[2]);
+# define PIXEL12_32 Interp3(output, i * 4 + 1, j * 4 + 2, c[5], c[6]);
+# define PIXEL12_70 Interp7(output, i * 4 + 1, j * 4 + 2, c[5], c[6], c[2]);
+
+# define PIXEL13_0 InterpI(output, i * 4 + 1, j * 4 + 3, c[5]);
+# define PIXEL13_10 Interp1(output, i * 4 + 1, j * 4 + 3, c[5], c[3]);
+# define PIXEL13_12 Interp1(output, i * 4 + 1, j * 4 + 3, c[5], c[6]);
+# define PIXEL13_14 Interp1(output, i * 4 + 1, j * 4 + 3, c[6], c[5]);
+# define PIXEL13_21 Interp2(output, i * 4 + 1, j * 4 + 3, c[6], c[5], c[2]);
+# define PIXEL13_31 Interp3(output, i * 4 + 1, j * 4 + 3, c[5], c[2]);
+# define PIXEL13_50 Interp5(output, i * 4 + 1, j * 4 + 3, c[6], c[5]);
+# define PIXEL13_60 Interp6(output, i * 4 + 1, j * 4 + 3, c[5], c[6], c[2]);
+# define PIXEL13_61 Interp6(output, i * 4 + 1, j * 4 + 3, c[5], c[6], c[3]);
+# define PIXEL13_82 Interp8(output, i * 4 + 1, j * 4 + 3, c[5], c[6]);
+# define PIXEL13_83 Interp8(output, i * 4 + 1, j * 4 + 3, c[6], c[2]);
+
+# define PIXEL20_0 InterpI(output, i * 4 + 2, j * 4, c[5]);
+# define PIXEL20_10 Interp1(output, i * 4 + 2, j * 4, c[5], c[7]);
+# define PIXEL20_12 Interp1(output, i * 4 + 2, j * 4, c[5], c[4]);
+# define PIXEL20_14 Interp1(output, i * 4 + 2, j * 4, c[4], c[5]);
+# define PIXEL20_21 Interp2(output, i * 4 + 2, j * 4, c[4], c[5], c[8]);
+# define PIXEL20_31 Interp3(output, i * 4 + 2, j * 4, c[5], c[8]);
+# define PIXEL20_50 Interp5(output, i * 4 + 2, j * 4, c[4], c[5]);
+# define PIXEL20_60 Interp6(output, i * 4 + 2, j * 4, c[5], c[4], c[8]);
+# define PIXEL20_61 Interp6(output, i * 4 + 2, j * 4, c[5], c[4], c[7]);
+# define PIXEL20_82 Interp8(output, i * 4 + 2, j * 4, c[5], c[4]);
+# define PIXEL20_83 Interp8(output, i * 4 + 2, j * 4, c[4], c[8]);
+
+# define PIXEL21_0 InterpI(output, i * 4 + 2, j * 4 + 1, c[5]);
+# define PIXEL21_30 Interp3(output, i * 4 + 2, j * 4 + 1, c[5], c[7]);
+# define PIXEL21_31 Interp3(output, i * 4 + 2, j * 4 + 1, c[5], c[8]);
+# define PIXEL21_32 Interp3(output, i * 4 + 2, j * 4 + 1, c[5], c[4]);
+# define PIXEL21_70 Interp7(output, i * 4 + 2, j * 4 + 1, c[5], c[4], c[8]);
+
+# define PIXEL22_0 InterpI(output, i * 4 + 2, j * 4 + 2, c[5]);
+# define PIXEL22_30 Interp3(output, i * 4 + 2, j * 4 + 2, c[5], c[9]);
+# define PIXEL22_31 Interp3(output, i * 4 + 2, j * 4 + 2, c[5], c[6]);
+# define PIXEL22_32 Interp3(output, i * 4 + 2, j * 4 + 2, c[5], c[8]);
+# define PIXEL22_70 Interp7(output, i * 4 + 2, j * 4 + 2, c[5], c[6], c[8]);
+
+# define PIXEL23_0 InterpI(output, i * 4 + 2, j * 4 + 3, c[5]);
+# define PIXEL23_10 Interp1(output, i * 4 + 2, j * 4 + 3, c[5], c[9]);
+# define PIXEL23_11 Interp1(output, i * 4 + 2, j * 4 + 3, c[5], c[6]);
+# define PIXEL23_13 Interp1(output, i * 4 + 2, j * 4 + 3, c[6], c[5]);
+# define PIXEL23_21 Interp2(output, i * 4 + 2, j * 4 + 3, c[6], c[5], c[8]);
+# define PIXEL23_32 Interp3(output, i * 4 + 2, j * 4 + 3, c[5], c[8]);
+# define PIXEL23_50 Interp5(output, i * 4 + 2, j * 4 + 3, c[6], c[5]);
+# define PIXEL23_60 Interp6(output, i * 4 + 2, j * 4 + 3, c[5], c[6], c[8]);
+# define PIXEL23_61 Interp6(output, i * 4 + 2, j * 4 + 3, c[5], c[6], c[9]);
+# define PIXEL23_81 Interp8(output, i * 4 + 2, j * 4 + 3, c[5], c[6]);
+# define PIXEL23_83 Interp8(output, i * 4 + 2, j * 4 + 3, c[6], c[8]);
+
+# define PIXEL30_0 InterpI(output, i * 4 + 3, j * 4, c[5]);
+# define PIXEL30_11 Interp1(output, i * 4 + 3, j * 4, c[5], c[8]);
+# define PIXEL30_12 Interp1(output, i * 4 + 3, j * 4, c[5], c[4]);
+# define PIXEL30_20 Interp2(output, i * 4 + 3, j * 4, c[5], c[8], c[4]);
+# define PIXEL30_50 Interp5(output, i * 4 + 3, j * 4, c[8], c[4]);
+# define PIXEL30_80 Interp8(output, i * 4 + 3, j * 4, c[5], c[7]);
+# define PIXEL30_81 Interp8(output, i * 4 + 3, j * 4, c[5], c[8]);
+# define PIXEL30_82 Interp8(output, i * 4 + 3, j * 4, c[5], c[4]);
+
+# define PIXEL31_0 InterpI(output, i * 4 + 3, j * 4 + 1, c[5]);
+# define PIXEL31_10 Interp1(output, i * 4 + 3, j * 4 + 1, c[5], c[7]);
+# define PIXEL31_11 Interp1(output, i * 4 + 3, j * 4 + 1, c[5], c[8]);
+# define PIXEL31_13 Interp1(output, i * 4 + 3, j * 4 + 1, c[8], c[5]);
+# define PIXEL31_21 Interp2(output, i * 4 + 3, j * 4 + 1, c[8], c[5], c[4]);
+# define PIXEL31_32 Interp3(output, i * 4 + 3, j * 4 + 1, c[5], c[4]);
+# define PIXEL31_50 Interp5(output, i * 4 + 3, j * 4 + 1, c[8], c[5]);
+# define PIXEL31_60 Interp6(output, i * 4 + 3, j * 4 + 1, c[5], c[8], c[4]);
+# define PIXEL31_61 Interp6(output, i * 4 + 3, j * 4 + 1, c[5], c[8], c[7]);
+# define PIXEL31_81 Interp8(output, i * 4 + 3, j * 4 + 1, c[5], c[8]);
+# define PIXEL31_83 Interp8(output, i * 4 + 3, j * 4 + 1, c[8], c[4]);
+
+# define PIXEL32_0 InterpI(output, i * 4 + 3, j * 4 + 2, c[5]);
+# define PIXEL32_10 Interp1(output, i * 4 + 3, j * 4 + 2, c[5], c[9]);
+# define PIXEL32_12 Interp1(output, i * 4 + 3, j * 4 + 2, c[5], c[8]);
+# define PIXEL32_14 Interp1(output, i * 4 + 3, j * 4 + 2, c[8], c[5]);
+# define PIXEL32_21 Interp2(output, i * 4 + 3, j * 4 + 2, c[8], c[5], c[6]);
+# define PIXEL32_31 Interp3(output, i * 4 + 3, j * 4 + 2, c[5], c[6]);
+# define PIXEL32_50 Interp5(output, i * 4 + 3, j * 4 + 2, c[8], c[5]);
+# define PIXEL32_60 Interp6(output, i * 4 + 3, j * 4 + 2, c[5], c[8], c[6]);
+# define PIXEL32_61 Interp6(output, i * 4 + 3, j * 4 + 2, c[5], c[8], c[9]);
+# define PIXEL32_82 Interp8(output, i * 4 + 3, j * 4 + 2, c[5], c[8]);
+# define PIXEL32_83 Interp8(output, i * 4 + 3, j * 4 + 2, c[8], c[6]);
+
+# define PIXEL33_0 InterpI(output, i * 4 + 3, j * 4 + 3, c[5]);
+# define PIXEL33_11 Interp1(output, i * 4 + 3, j * 4 + 3, c[5], c[6]);
+# define PIXEL33_12 Interp1(output, i * 4 + 3, j * 4 + 3, c[5], c[8]);
+# define PIXEL33_20 Interp2(output, i * 4 + 3, j * 4 + 3, c[5], c[8], c[6]);
+# define PIXEL33_50 Interp5(output, i * 4 + 3, j * 4 + 3, c[8], c[6]);
+# define PIXEL33_80 Interp8(output, i * 4 + 3, j * 4 + 3, c[5], c[9]);
+# define PIXEL33_81 Interp8(output, i * 4 + 3, j * 4 + 3, c[5], c[6]);
+# define PIXEL33_82 Interp8(output, i * 4 + 3, j * 4 + 3, c[5], c[8]);
+
+
+
+ inline
+ bool
+ Diff(int& YUV1, int& YUV2, int* RGBtoYUV,
+ const int trY, const int trU, const int trV,
+ const int Ymask, const int Umask, const int Vmask,
+ unsigned int w1, unsigned int w2)
+ {
+ YUV1 = RGBtoYUV[w1];
+ YUV2 = RGBtoYUV[w2];
+ return ((abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) ||
+ (abs((YUV1 & Umask) - (YUV2 & Umask)) > trU) ||
+ (abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV));
+ }
+
+ inline
+ void
+ initLUTs(int LUT16to32[65536], int RGBtoYUV[65536])
+ {
+ int i, j, k, r, g, b, Y, u, v;
+
+ for (i=0; i<65536; i++)
+ LUT16to32[i] = ((i & 0xF800) << 8) + ((i & 0x07E0) << 5) + ((i & 0x001F) << 3);
+
+ for (i=0; i<32; i++)
+ for (j=0; j<64; j++)
+ for (k=0; k<32; k++)
+ {
+ r = i << 3;
+ g = j << 2;
+ b = k << 3;
+ Y = (r + g + b) >> 2;
+ u = 128 + ((r - b) >> 2);
+ v = 128 + ((-r + 2*g -b)>>3);
+ RGBtoYUV[ (i << 11) + (j << 5) + k ] = (Y<<16) + (u<<8) + v;
+ }
+ }
+
+
+ //FIXME: In Milena, nrows != row max
+ template <typename T>
+ inline
+ mln_concrete(image2d<T>)
+ hq4x_(const image2d<T>& input)
+ {
+ trace::entering("upsampling::impl::hq4x_");
+
+ int nrows = geom::nrows(input);
+ int ncols = geom::ncols(input);
+ mln_concrete(image2d<T>) output(nrows * 3, ncols * 3);
+
+ int LUT16to32[65536];
+ int RGBtoYUV[65536];
+ int YUV1, YUV2;
+ const int Ymask = 0x00FF0000;
+ const int Umask = 0x0000FF00;
+ const int Vmask = 0x000000FF;
+ const int trY = 0x00300000;
+ const int trU = 0x00000700;
+ const int trV = 0x00000006;
+
+ initLUTs(LUT16to32, RGBtoYUV);
+
+ unsigned int w[10];
+ unsigned int c[10];
+
+ // +----+----+----+
+ // | | | |
+ // | w1 | w2 | w3 |
+ // +----+----+----+
+ // | | | |
+ // | w4 | w5 | w6 |
+ // +----+----+----+
+ // | | | |
+ // | w7 | w8 | w9 |
+ // +----+----+----+
+ //
+ // w5 is the current point.
+
+ for (int j = 0; j < ncols; j++)
+ {
+ for (int i = 0; i < nrows; i++)
+ {
+ w[1] = rgb8toShort(input.at_(i - 1, j - 1));
+ w[2] = rgb8toShort(input.at_(i - 1, j));
+ w[3] = rgb8toShort(input.at_(i - 1, j + 1));
+ w[4] = rgb8toShort(input.at_(i, j - 1));
+ w[5] = rgb8toShort(input.at_(i, j));
+ w[6] = rgb8toShort(input.at_(i, j + 1));
+ w[7] = rgb8toShort(input.at_(i + 1, j - 1));
+ w[8] = rgb8toShort(input.at_(i + 1, j));
+ w[9] = rgb8toShort(input.at_(i + 1, j + 1));
+
+ int pattern = 0;
+ int flag = 1;
+
+ YUV1 = RGBtoYUV[w[5]];
+
+ for (int k = 1; k <= 9; k++)
+ {
+ if (k == 5)
+ continue;
+
+ if (w[k] != w[5])
+ {
+ YUV2 = RGBtoYUV[w[k]];
+ if ((abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) ||
+ (abs((YUV1 & Umask) - (YUV2 & Umask)) > trU) ||
+ (abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV))
+ pattern |= flag;
+ }
+ flag <<= 1;
+ }
+
+ for (int k = 1; k <= 9; k++)
+ c[k] = LUT16to32[w[k]];
+
+ switch (pattern)
+ {
+ case 0:
+ case 1:
+ case 4:
+ case 32:
+ case 128:
+ case 5:
+ case 132:
+ case 160:
+ case 33:
+ case 129:
+ case 36:
+ case 133:
+ case 164:
+ case 161:
+ case 37:
+ case 165:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 2:
+ case 34:
+ case 130:
+ case 162:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 16:
+ case 17:
+ case 48:
+ case 49:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 64:
+ case 65:
+ case 68:
+ case 69:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 8:
+ case 12:
+ case 136:
+ case 140:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 3:
+ case 35:
+ case 131:
+ case 163:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 6:
+ case 38:
+ case 134:
+ case 166:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 20:
+ case 21:
+ case 52:
+ case 53:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 144:
+ case 145:
+ case 176:
+ case 177:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 192:
+ case 193:
+ case 196:
+ case 197:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 96:
+ case 97:
+ case 100:
+ case 101:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 40:
+ case 44:
+ case 168:
+ case 172:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 9:
+ case 13:
+ case 137:
+ case 141:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 18:
+ case 50:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL12_0
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 80:
+ case 81:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_61
+ PIXEL21_30
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 72:
+ case 76:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL21_0
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 10:
+ case 138:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ PIXEL11_0
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 66:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 24:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 7:
+ case 39:
+ case 135:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 148:
+ case 149:
+ case 180:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 224:
+ case 228:
+ case 225:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 41:
+ case 169:
+ case 45:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 22:
+ case 54:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 208:
+ case 209:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 104:
+ case 108:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 11:
+ case 139:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 19:
+ case 51:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL00_12
+ PIXEL01_14
+ PIXEL02_83
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_21
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 146:
+ case 178:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL23_32
+ PIXEL33_82
+ }
+ else
+ {
+ PIXEL02_21
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_83
+ PIXEL23_13
+ PIXEL33_11
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ break;
+ }
+ case 84:
+ case 85:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL03_81
+ PIXEL13_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL03_12
+ PIXEL13_14
+ PIXEL22_70
+ PIXEL23_83
+ PIXEL32_21
+ PIXEL33_50
+ }
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 112:
+ case 113:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_70
+ PIXEL23_21
+ PIXEL30_11
+ PIXEL31_13
+ PIXEL32_83
+ PIXEL33_50
+ }
+ break;
+ }
+ case 200:
+ case 204:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ }
+ else
+ {
+ PIXEL20_21
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_83
+ PIXEL32_14
+ PIXEL33_12
+ }
+ PIXEL22_31
+ PIXEL23_81
+ break;
+ }
+ case 73:
+ case 77:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_82
+ PIXEL10_32
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL00_11
+ PIXEL10_13
+ PIXEL20_83
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_21
+ }
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 42:
+ case 170:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL20_31
+ PIXEL30_81
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_21
+ PIXEL10_83
+ PIXEL11_70
+ PIXEL20_14
+ PIXEL30_12
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 14:
+ case 142:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_83
+ PIXEL02_13
+ PIXEL03_11
+ PIXEL10_21
+ PIXEL11_70
+ }
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 67:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 70:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 28:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 152:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 194:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 98:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 56:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 25:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 26:
+ case 31:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 82:
+ case 214:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 88:
+ case 248:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ break;
+ }
+ case 74:
+ case 107:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_61
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 27:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 86:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 216:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 106:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 30:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 210:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 120:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 75:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 29:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 198:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 184:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 99:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 57:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 71:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 156:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 226:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 60:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 195:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 102:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 153:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 58:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 83:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_61
+ PIXEL21_30
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 92:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 202:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_61
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 78:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 154:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 114:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ PIXEL30_82
+ PIXEL31_32
+ break;
+ }
+ case 89:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 90:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 55:
+ case 23:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL12_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL00_12
+ PIXEL01_14
+ PIXEL02_83
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_21
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 182:
+ case 150:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL23_32
+ PIXEL33_82
+ }
+ else
+ {
+ PIXEL02_21
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_83
+ PIXEL23_13
+ PIXEL33_11
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ break;
+ }
+ case 213:
+ case 212:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL03_81
+ PIXEL13_31
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL03_12
+ PIXEL13_14
+ PIXEL22_70
+ PIXEL23_83
+ PIXEL32_21
+ PIXEL33_50
+ }
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 241:
+ case 240:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL22_70
+ PIXEL23_21
+ PIXEL30_11
+ PIXEL31_13
+ PIXEL32_83
+ PIXEL33_50
+ }
+ break;
+ }
+ case 236:
+ case 232:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_70
+ PIXEL13_60
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL30_0
+ PIXEL31_0
+ PIXEL32_31
+ PIXEL33_81
+ }
+ else
+ {
+ PIXEL20_21
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_83
+ PIXEL32_14
+ PIXEL33_12
+ }
+ PIXEL22_31
+ PIXEL23_81
+ break;
+ }
+ case 109:
+ case 105:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_82
+ PIXEL10_32
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL00_11
+ PIXEL10_13
+ PIXEL20_83
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_21
+ }
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 171:
+ case 43:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL20_31
+ PIXEL30_81
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_21
+ PIXEL10_83
+ PIXEL11_70
+ PIXEL20_14
+ PIXEL30_12
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 143:
+ case 15:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_0
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_83
+ PIXEL02_13
+ PIXEL03_11
+ PIXEL10_21
+ PIXEL11_70
+ }
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 124:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 203:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 62:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 211:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 118:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 217:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 110:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 155:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 188:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 185:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 61:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 157:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 103:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 227:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 230:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 199:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 220:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ break;
+ }
+ case 158:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL12_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 234:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_61
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 242:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_82
+ PIXEL31_32
+ break;
+ }
+ case 59:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL11_0
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 121:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 87:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_0
+ PIXEL20_61
+ PIXEL21_30
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 79:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL11_0
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 122:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 94:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL12_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 218:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ break;
+ }
+ case 91:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL11_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 229:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 167:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 173:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 181:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 186:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 115:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ PIXEL30_82
+ PIXEL31_32
+ break;
+ }
+ case 93:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ break;
+ }
+ case 206:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 205:
+ case 201:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ }
+ else
+ {
+ PIXEL20_12
+ PIXEL21_0
+ PIXEL30_20
+ PIXEL31_11
+ }
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 174:
+ case 46:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL10_10
+ PIXEL11_30
+ }
+ else
+ {
+ PIXEL00_20
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_0
+ }
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 179:
+ case 147:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ }
+ else
+ {
+ PIXEL02_11
+ PIXEL03_20
+ PIXEL12_0
+ PIXEL13_12
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 117:
+ case 116:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ }
+ else
+ {
+ PIXEL22_0
+ PIXEL23_11
+ PIXEL32_12
+ PIXEL33_20
+ }
+ PIXEL30_82
+ PIXEL31_32
+ break;
+ }
+ case 189:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 231:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 126:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 219:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 125:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_82
+ PIXEL10_32
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL00_11
+ PIXEL10_13
+ PIXEL20_83
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_21
+ }
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 221:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL03_81
+ PIXEL13_31
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL03_12
+ PIXEL13_14
+ PIXEL22_70
+ PIXEL23_83
+ PIXEL32_21
+ PIXEL33_50
+ }
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 207:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_0
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_83
+ PIXEL02_13
+ PIXEL03_11
+ PIXEL10_21
+ PIXEL11_70
+ }
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_31
+ PIXEL23_81
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 238:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL30_0
+ PIXEL31_0
+ PIXEL32_31
+ PIXEL33_81
+ }
+ else
+ {
+ PIXEL20_21
+ PIXEL21_70
+ PIXEL30_50
+ PIXEL31_83
+ PIXEL32_14
+ PIXEL33_12
+ }
+ PIXEL22_31
+ PIXEL23_81
+ break;
+ }
+ case 190:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL23_32
+ PIXEL33_82
+ }
+ else
+ {
+ PIXEL02_21
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_83
+ PIXEL23_13
+ PIXEL33_11
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ break;
+ }
+ case 187:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL20_31
+ PIXEL30_81
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_21
+ PIXEL10_83
+ PIXEL11_70
+ PIXEL20_14
+ PIXEL30_12
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 243:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_82
+ PIXEL21_32
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL22_70
+ PIXEL23_21
+ PIXEL30_11
+ PIXEL31_13
+ PIXEL32_83
+ PIXEL33_50
+ }
+ break;
+ }
+ case 119:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL12_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL00_12
+ PIXEL01_14
+ PIXEL02_83
+ PIXEL03_50
+ PIXEL12_70
+ PIXEL13_21
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 237:
+ case 233:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_60
+ PIXEL03_20
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_70
+ PIXEL13_60
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_31
+ PIXEL23_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 175:
+ case 47:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_70
+ PIXEL23_60
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_60
+ PIXEL33_20
+ break;
+ }
+ case 183:
+ case 151:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_60
+ PIXEL21_70
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_20
+ PIXEL31_60
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 245:
+ case 244:
+ {
+ PIXEL00_20
+ PIXEL01_60
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_60
+ PIXEL11_70
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 250:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ break;
+ }
+ case 123:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 95:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_80
+ PIXEL31_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 222:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 252:
+ {
+ PIXEL00_80
+ PIXEL01_61
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_31
+ PIXEL13_31
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 249:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_61
+ PIXEL03_80
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ break;
+ }
+ case 235:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_61
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_31
+ PIXEL23_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 111:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_32
+ PIXEL13_82
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_61
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 63:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_61
+ PIXEL33_80
+ break;
+ }
+ case 159:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_80
+ PIXEL31_61
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 215:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_61
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 246:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_61
+ PIXEL11_30
+ PIXEL12_0
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 254:
+ {
+ PIXEL00_80
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_10
+ PIXEL11_30
+ PIXEL12_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 253:
+ {
+ PIXEL00_82
+ PIXEL01_82
+ PIXEL02_81
+ PIXEL03_81
+ PIXEL10_32
+ PIXEL11_32
+ PIXEL12_31
+ PIXEL13_31
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_0
+ PIXEL23_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 251:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_10
+ PIXEL03_80
+ PIXEL11_0
+ PIXEL12_30
+ PIXEL13_10
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ break;
+ }
+ case 239:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ PIXEL02_32
+ PIXEL03_82
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_32
+ PIXEL13_82
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_31
+ PIXEL23_81
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ PIXEL32_31
+ PIXEL33_81
+ break;
+ }
+ case 127:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL02_0
+ PIXEL03_0
+ PIXEL13_0
+ }
+ else
+ {
+ PIXEL02_50
+ PIXEL03_50
+ PIXEL13_50
+ }
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL20_0
+ PIXEL30_0
+ PIXEL31_0
+ }
+ else
+ {
+ PIXEL20_50
+ PIXEL30_50
+ PIXEL31_50
+ }
+ PIXEL21_0
+ PIXEL22_30
+ PIXEL23_10
+ PIXEL32_10
+ PIXEL33_80
+ break;
+ }
+ case 191:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_31
+ PIXEL21_31
+ PIXEL22_32
+ PIXEL23_32
+ PIXEL30_81
+ PIXEL31_81
+ PIXEL32_82
+ PIXEL33_82
+ break;
+ }
+ case 223:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_0
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_50
+ PIXEL01_50
+ PIXEL10_50
+ }
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_10
+ PIXEL21_30
+ PIXEL22_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL23_0
+ PIXEL32_0
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL23_50
+ PIXEL32_50
+ PIXEL33_50
+ }
+ PIXEL30_80
+ PIXEL31_10
+ break;
+ }
+ case 247:
+ {
+ PIXEL00_81
+ PIXEL01_31
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL10_81
+ PIXEL11_31
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_82
+ PIXEL21_32
+ PIXEL22_0
+ PIXEL23_0
+ PIXEL30_82
+ PIXEL31_32
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ case 255:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_0
+ PIXEL02_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL03_0
+ }
+ else
+ {
+ PIXEL03_20
+ }
+ PIXEL10_0
+ PIXEL11_0
+ PIXEL12_0
+ PIXEL13_0
+ PIXEL20_0
+ PIXEL21_0
+ PIXEL22_0
+ PIXEL23_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL30_0
+ }
+ else
+ {
+ PIXEL30_20
+ }
+ PIXEL31_0
+ PIXEL32_0
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL33_0
+ }
+ else
+ {
+ PIXEL33_20
+ }
+ break;
+ }
+ }
+
+ }
+ }
+
+ trace::exiting("upsampling::impl::hq4x_");
+ return output;
+ }
+
+ } // end of namespace mln::upsampling::impl
+
+
+ template <typename I>
+ inline
+ mln_concrete(I)
+ hq4x(const Image<I>& input)
+ {
+ trace::entering("upsampling::hq4x");
+ mln_precondition(exact(input).is_valid());
+
+ mln_concrete(I) output;
+
+ output = impl::hq4x_(exact(input));
+
+ trace::exiting("upsampling::hq4x");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::upsampling
+
+} // end of namespace mln
+
+
+#endif // ! MLN_UPSAMPLING_HQ4X_HH
1
0
[PATCH 6/8] WIP: Restore comments dropped by the tool that update copyright notices.
by Roland Levillain 07 Sep '09
by Roland Levillain 07 Sep '09
07 Sep '09
---
.../morpho/artificial_line_graph_image_wst.cc | 22 ++++++++++++++++++
milena/tests/morpho/complex_image_morpho.cc | 4 +++
milena/tests/morpho/complex_image_wst.cc | 5 ++++
milena/tests/morpho/graph_image_morpho.cc | 4 +++
milena/tests/morpho/graph_image_wst.cc | 3 ++
milena/tests/morpho/lena_line_graph_image_wst1.cc | 21 +++++++++++++++++
milena/tests/morpho/lena_line_graph_image_wst2.cc | 24 ++++++++++++++++++++
milena/tests/morpho/line_graph_image_morpho.cc | 4 +++
milena/tests/morpho/line_graph_image_wst.cc | 4 +++
9 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/milena/tests/morpho/artificial_line_graph_image_wst.cc b/milena/tests/morpho/artificial_line_graph_image_wst.cc
index 9d09ab5..3b019ba 100644
--- a/milena/tests/morpho/artificial_line_graph_image_wst.cc
+++ b/milena/tests/morpho/artificial_line_graph_image_wst.cc
@@ -23,6 +23,28 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/* FIXME: We should factor as much things as possible between
+ tests/morpho/lena_line_graph_image_wst1.cc,
+ tests/morpho/lena_line_graph_image_wst2.cc and this file, starting
+ with conversion routines. */
+
+/** \file
+ \brief Tests on the Watershed Transform (WST) on an artificial
+ mln::line_graph_image.
+
+ The scenario is as follows:
+ \li create an artificial (checkboard) 2-D image ;
+ \li convert this 2-D image into a line graph-based one, where values
+ on edges are computed as the absolute value of the difference
+ between the values on the vertices adjacent to the edge, so as to
+ create a (norm of the) gradient ``between the pixels'' of the
+ input image;
+ \li perform a WST on this line graph image;
+ \li create a 2-D, color output image with height and width double
+ the size the original one, and copy the data of the input image
+ in it, interpolating inter-pixel points;
+ \li print the watershed on lines into that same image, and save it. */
+
#include <mln/core/image/image2d.hh>
#include <mln/core/alias/point2d.hh>
#include <mln/core/alias/window2d.hh>
diff --git a/milena/tests/morpho/complex_image_morpho.cc b/milena/tests/morpho/complex_image_morpho.cc
index 31e202d..601b7a9 100644
--- a/milena/tests/morpho/complex_image_morpho.cc
+++ b/milena/tests/morpho/complex_image_morpho.cc
@@ -23,6 +23,10 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// Test of mln::complex_image with morphological filters.
+
#include <iostream>
#include <mln/value/int_u8.hh>
diff --git a/milena/tests/morpho/complex_image_wst.cc b/milena/tests/morpho/complex_image_wst.cc
index 239630b..ef7adea 100644
--- a/milena/tests/morpho/complex_image_wst.cc
+++ b/milena/tests/morpho/complex_image_wst.cc
@@ -23,6 +23,11 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Testing the Watershed Transform by flooding an
+/// mln::complex_image.
+
#include <iostream>
#include <fstream>
#include <sstream>
diff --git a/milena/tests/morpho/graph_image_morpho.cc b/milena/tests/morpho/graph_image_morpho.cc
index 0a78462..bfa16c6 100644
--- a/milena/tests/morpho/graph_image_morpho.cc
+++ b/milena/tests/morpho/graph_image_morpho.cc
@@ -23,6 +23,10 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// \brief Tests on a graph-based image with morphological filters.
+
#include <mln/accu/shape/bbox.hh>
#include <mln/core/alias/box2d.hh>
#include <mln/core/alias/point2d.hh>
diff --git a/milena/tests/morpho/graph_image_wst.cc b/milena/tests/morpho/graph_image_wst.cc
index bbc9e74..735b648 100644
--- a/milena/tests/morpho/graph_image_wst.cc
+++ b/milena/tests/morpho/graph_image_wst.cc
@@ -23,6 +23,9 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+/// \brief Tests on the Watershed Transform on a graph-based image.
+
#include <vector>
#include <mln/core/alias/point2d.hh>
diff --git a/milena/tests/morpho/lena_line_graph_image_wst1.cc b/milena/tests/morpho/lena_line_graph_image_wst1.cc
index 98d20d8..aef5cc3 100644
--- a/milena/tests/morpho/lena_line_graph_image_wst1.cc
+++ b/milena/tests/morpho/lena_line_graph_image_wst1.cc
@@ -23,6 +23,27 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/* FIXME: We should factor as much things as possible between
+ tests/morpho/lena_line_graph_image_wst1.cc and
+ tests/morpho/lena_line_graph_image_wst2.cc, starting from conversion
+ routines. */
+
+/** \file
+ \brief Tests on the Watershed Transform (WST) on a mln::line_graph_image.
+
+ The scenario is as follows:
+ \li load a 2-D, gray-level image from a PGM file;
+ \li compute a morphological gradient of this image;
+ \li simplify the image to reduce the number of local minima;
+ \li convert this 2-D image into a line graph-based one, where values
+ on edges are computed as the maxmimum of the values on the vertices
+ adjacent to the edge;
+ \li perform a WST on the line graph image;
+ \li create an 2-D, color output image with height and width double
+ the size the original one, and copy the data of the input image
+ in it, interpolating inter-pixel points;
+ \li print the watershed on lines into that same image, and save it. */
+
#include <map>
#include <vector>
diff --git a/milena/tests/morpho/lena_line_graph_image_wst2.cc b/milena/tests/morpho/lena_line_graph_image_wst2.cc
index 697bbfe..ab650b6 100644
--- a/milena/tests/morpho/lena_line_graph_image_wst2.cc
+++ b/milena/tests/morpho/lena_line_graph_image_wst2.cc
@@ -23,6 +23,30 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/* FIXME: We should factor as much things as possible between
+ tests/morpho/lena_line_graph_image_wst1.cc and
+ tests/morpho/lena_line_graph_image_wst2.cc, starting from conversion
+ routines. */
+
+/** \file
+ \brief More tests on the Watershed Transform (WST) on a
+ mln::line_graph_image.
+
+ The scenario is as follows:
+ \li load a 2-D, gray-level image from a PGM file;
+ \li convert this 2-D image into a line graph-based one, where values
+ on edges are computed as the absolute value of the difference
+ between the values on the vertices adjacent to the edge, so as to
+ create a (norm of the) gradient ``between the pixels'' of the
+ input image;
+ \li reduce the number of minima using an area opening (counting the
+ vertices to compute the area, not the edges);
+ \li perform a WST on this simplified line graph image;
+ \li create a 2-D, color output image with height and width double
+ the size the original one, and copy the data of the input image
+ in it, interpolating inter-pixel points;
+ \li print the watershed on lines into that same image, and save it. */
+
#include <mln/core/image/image2d.hh>
#include <mln/core/alias/point2d.hh>
#include <mln/core/alias/window2d.hh>
diff --git a/milena/tests/morpho/line_graph_image_morpho.cc b/milena/tests/morpho/line_graph_image_morpho.cc
index 945a47c..21ce087 100644
--- a/milena/tests/morpho/line_graph_image_morpho.cc
+++ b/milena/tests/morpho/line_graph_image_morpho.cc
@@ -23,6 +23,10 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file
+///
+/// Tests on line a graph-based image with morphological filters.
+
#include <mln/core/alias/point2d.hh>
/// Required for line graph images.
diff --git a/milena/tests/morpho/line_graph_image_wst.cc b/milena/tests/morpho/line_graph_image_wst.cc
index 2d10779..2ce2cb6 100644
--- a/milena/tests/morpho/line_graph_image_wst.cc
+++ b/milena/tests/morpho/line_graph_image_wst.cc
@@ -23,6 +23,10 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
+/// \file tests/morpho/line_graph_image_wst.cc
+///
+/// Tests on the Watershed Transform on a line graph-based image.
+
#include <mln/core/alias/point2d.hh>
/// Required for line graph images.
--
1.6.4.2
1
1
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena/sandbox
ChangeLog:
2009-09-04 Fabien Freling <fabien.freling(a)lrde.epita.fr>
Implement HQ2x upscaling algorithm.
* fabien/mln/upsampling/hq2x.hh: Implement HQ2x algorithm.
* fabien/mln/upsampling/hq3x.hh: Remove dead code.
* fabien/tests/upsampling/Makefile: Add `hq2x' target.
* fabien/tests/upsampling/hq2x.cc: New test file for HQ2x.
---
mln/upsampling/hq2x.hh | 2988 ++++++++++++++++++++++++++++++++++++++++++++++
mln/upsampling/hq3x.hh | 30
tests/upsampling/Makefile | 3
tests/upsampling/hq2x.cc | 29
4 files changed, 3020 insertions(+), 30 deletions(-)
Index: trunk/milena/sandbox/fabien/tests/upsampling/hq2x.cc
===================================================================
--- trunk/milena/sandbox/fabien/tests/upsampling/hq2x.cc (revision 0)
+++ trunk/milena/sandbox/fabien/tests/upsampling/hq2x.cc (revision 4432)
@@ -0,0 +1,29 @@
+#include <mln/core/image/image2d.hh>
+
+#include <mln/io/ppm/all.hh>
+#include <mln/value/rgb8.hh>
+
+#include <mln/upsampling/hq2x.hh>
+
+
+using namespace mln;
+using value::rgb8;
+
+
+int main(int argc, char* argv[])
+{
+ if (argc != 3)
+ {
+ std::cout << "Usage: " << argv[0] << " input output" << std::endl;
+ return 1;
+ }
+
+ image2d<rgb8> ima;
+ io::ppm::load(ima, argv[1]);
+
+ image2d<rgb8> hq2x_ima;
+ hq2x_ima = upsampling::hq2x(ima);
+ io::ppm::save(hq2x_ima, argv[2]);
+
+ return 0;
+}
Index: trunk/milena/sandbox/fabien/tests/upsampling/Makefile
===================================================================
--- trunk/milena/sandbox/fabien/tests/upsampling/Makefile (revision 4431)
+++ trunk/milena/sandbox/fabien/tests/upsampling/Makefile (revision 4432)
@@ -2,5 +2,8 @@
CXXFLAGS = -DNDEBUG -O1
INC = -I../../ -I../../../../
+hq2x: hq2x.cc
+ ${CXX} ${CXXFLAGS} ${INC} $^ -o hq2x
+
hq3x: hq3x.cc
${CXX} ${CXXFLAGS} ${INC} $^ -o hq3x
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh (revision 0)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq2x.hh (revision 4432)
@@ -0,0 +1,2988 @@
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+#ifndef MLN_UPSAMPLING_HQ2X_HH
+# define MLN_UPSAMPLING_HQ2X_HH
+
+/// \file
+///
+/// Produce an up-scaled image using hq2x algorithm.
+
+# include <mln/geom/ncols.hh>
+# include <mln/geom/nrows.hh>
+# include <mln/value/rgb8.hh>
+
+
+namespace mln
+{
+
+ namespace upsampling
+ {
+
+ /// Subsampling FIXME : doxy
+ template <typename I>
+ inline
+ mln_concrete(I)
+ hq2x(const Image<I>& input);
+
+# ifndef MLN_INCLUDE_ONLY
+
+ namespace impl
+ {
+ inline
+ unsigned short
+ rgb8toShort(value::rgb8 val)
+ {
+ unsigned short result = 0;
+
+ result += val.red() >> 3;
+ result = result << 6;
+ result += val.green() >> 2;
+ result = result << 5;
+ result += val.blue() >> 3;
+
+ return result;
+ }
+
+ inline
+ void
+ intToRgb8(int in, value::rgb8& out)
+ {
+ out.blue() = in % 256;
+ out.green() = (in >> 8) % 256;
+ out.red() = (in >> 16) % 256;
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp1(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 * 3 + c2) >> 2, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp2(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 2 + c2 + c3) >> 2, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp5(image2d<T>& output, int row, int col, int c1, int c2)
+ {
+ intToRgb8((c1 + c2) >> 1, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp6(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 5 + c2 * 2 + c3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp7(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 6 + c2 + c3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp9(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 2 + (c2 + c3) * 3) / 8, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ Interp10(image2d<T>& output, int row, int col, int c1, int c2, int c3)
+ {
+ intToRgb8((c1 * 14 + c2 + c3) / 16, output.at_(row, col));
+ }
+
+ template<typename T>
+ inline
+ void
+ InterpI(image2d<T>& output, int row, int col, int c1)
+ {
+ intToRgb8(c1, output.at_(row, col));
+ }
+
+
+#define PIXEL00_0 InterpI(output, i * 2, j * 2, c[5]);
+#define PIXEL00_10 Interp1(output, i * 2, j * 2, c[5], c[1]);
+#define PIXEL00_11 Interp1(output, i * 2, j * 2, c[5], c[4]);
+#define PIXEL00_12 Interp1(output, i * 2, j * 2, c[5], c[2]);
+#define PIXEL00_20 Interp2(output, i * 2, j * 2, c[5], c[4], c[2]);
+#define PIXEL00_21 Interp2(output, i * 2, j * 2, c[5], c[1], c[2]);
+#define PIXEL00_22 Interp2(output, i * 2, j * 2, c[5], c[1], c[4]);
+#define PIXEL00_60 Interp6(output, i * 2, j * 2, c[5], c[2], c[4]);
+#define PIXEL00_61 Interp6(output, i * 2, j * 2, c[5], c[4], c[2]);
+#define PIXEL00_70 Interp7(output, i * 2, j * 2, c[5], c[4], c[2]);
+#define PIXEL00_90 Interp9(output, i * 2, j * 2, c[5], c[4], c[2]);
+#define PIXEL00_100 Interp10(output, i * 2, j * 2, c[5], c[4], c[2]);
+
+#define PIXEL01_0 InterpI(output, i * 2, j * 2 + 1, c[5]);
+#define PIXEL01_10 Interp1(output, i * 2, j * 2 + 1, c[5], c[3]);
+#define PIXEL01_11 Interp1(output, i * 2, j * 2 + 1, c[5], c[2]);
+#define PIXEL01_12 Interp1(output, i * 2, j * 2 + 1, c[5], c[6]);
+#define PIXEL01_20 Interp2(output, i * 2, j * 2 + 1, c[5], c[2], c[6]);
+#define PIXEL01_21 Interp2(output, i * 2, j * 2 + 1, c[5], c[3], c[6]);
+#define PIXEL01_22 Interp2(output, i * 2, j * 2 + 1, c[5], c[3], c[2]);
+#define PIXEL01_60 Interp6(output, i * 2, j * 2 + 1, c[5], c[6], c[2]);
+#define PIXEL01_61 Interp6(output, i * 2, j * 2 + 1, c[5], c[2], c[6]);
+#define PIXEL01_70 Interp7(output, i * 2, j * 2 + 1, c[5], c[2], c[6]);
+#define PIXEL01_90 Interp9(output, i * 2, j * 2 + 1, c[5], c[2], c[6]);
+#define PIXEL01_100 Interp10(output, i * 2, j * 2 + 1, c[5], c[2], c[6]);
+
+#define PIXEL10_0 InterpI(output, i * 2 + 1, j * 2, c[5]);
+#define PIXEL10_10 Interp1(output, i * 2 + 1, j * 2, c[5], c[7]);
+#define PIXEL10_11 Interp1(output, i * 2 + 1, j * 2, c[5], c[8]);
+#define PIXEL10_12 Interp1(output, i * 2 + 1, j * 2, c[5], c[4]);
+#define PIXEL10_20 Interp2(output, i * 2 + 1, j * 2, c[5], c[8], c[4]);
+#define PIXEL10_21 Interp2(output, i * 2 + 1, j * 2, c[5], c[7], c[4]);
+#define PIXEL10_22 Interp2(output, i * 2 + 1, j * 2, c[5], c[7], c[8]);
+#define PIXEL10_60 Interp6(output, i * 2 + 1, j * 2, c[5], c[4], c[8]);
+#define PIXEL10_61 Interp6(output, i * 2 + 1, j * 2, c[5], c[8], c[4]);
+#define PIXEL10_70 Interp7(output, i * 2 + 1, j * 2, c[5], c[8], c[4]);
+#define PIXEL10_90 Interp9(output, i * 2 + 1, j * 2, c[5], c[8], c[4]);
+#define PIXEL10_100 Interp10(output, i * 2 + 1, j * 2, c[5], c[8], c[4]);
+
+#define PIXEL11_0 InterpI(output, i * 2 + 1, j * 2 + 1, c[5]);
+#define PIXEL11_10 Interp1(output, i * 2 + 1, j * 2 + 1, c[5], c[9]);
+#define PIXEL11_11 Interp1(output, i * 2 + 1, j * 2 + 1, c[5], c[6]);
+#define PIXEL11_12 Interp1(output, i * 2 + 1, j * 2 + 1, c[5], c[8]);
+#define PIXEL11_20 Interp2(output, i * 2 + 1, j * 2 + 1, c[5], c[6], c[8]);
+#define PIXEL11_21 Interp2(output, i * 2 + 1, j * 2 + 1, c[5], c[9], c[8]);
+#define PIXEL11_22 Interp2(output, i * 2 + 1, j * 2 + 1, c[5], c[9], c[6]);
+#define PIXEL11_60 Interp6(output, i * 2 + 1, j * 2 + 1, c[5], c[8], c[6]);
+#define PIXEL11_61 Interp6(output, i * 2 + 1, j * 2 + 1, c[5], c[6], c[8]);
+#define PIXEL11_70 Interp7(output, i * 2 + 1, j * 2 + 1, c[5], c[6], c[8]);
+#define PIXEL11_90 Interp9(output, i * 2 + 1, j * 2 + 1, c[5], c[6], c[8]);
+#define PIXEL11_100 Interp10(output, i * 2 + 1, j * 2 + 1, c[5], c[6], c[8]);
+
+
+ inline
+ bool
+ Diff(int& YUV1, int& YUV2, int* RGBtoYUV,
+ const int trY, const int trU, const int trV,
+ const int Ymask, const int Umask, const int Vmask,
+ unsigned int w1, unsigned int w2)
+ {
+ YUV1 = RGBtoYUV[w1];
+ YUV2 = RGBtoYUV[w2];
+ return ((abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) ||
+ (abs((YUV1 & Umask) - (YUV2 & Umask)) > trU) ||
+ (abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV));
+ }
+
+ inline
+ void
+ initLUTs(int LUT16to32[65536], int RGBtoYUV[65536])
+ {
+ int i, j, k, r, g, b, Y, u, v;
+
+ for (i=0; i<65536; i++)
+ LUT16to32[i] = ((i & 0xF800) << 8) + ((i & 0x07E0) << 5) + ((i & 0x001F) << 3);
+
+ for (i=0; i<32; i++)
+ for (j=0; j<64; j++)
+ for (k=0; k<32; k++)
+ {
+ r = i << 3;
+ g = j << 2;
+ b = k << 3;
+ Y = (r + g + b) >> 2;
+ u = 128 + ((r - b) >> 2);
+ v = 128 + ((-r + 2*g -b)>>3);
+ RGBtoYUV[ (i << 11) + (j << 5) + k ] = (Y<<16) + (u<<8) + v;
+ }
+ }
+
+
+ //FIXME: In Milena, nrows != row max
+ template <typename T>
+ inline
+ mln_concrete(image2d<T>)
+ hq2x_(const image2d<T>& input)
+ {
+ trace::entering("upsampling::impl::hq2x_");
+
+ int nrows = geom::nrows(input);
+ int ncols = geom::ncols(input);
+ mln_concrete(image2d<T>) output(nrows * 2, ncols * 2);
+
+ int LUT16to32[65536];
+ int RGBtoYUV[65536];
+ int YUV1, YUV2;
+ const int Ymask = 0x00FF0000;
+ const int Umask = 0x0000FF00;
+ const int Vmask = 0x000000FF;
+ const int trY = 0x00300000;
+ const int trU = 0x00000700;
+ const int trV = 0x00000006;
+
+ initLUTs(LUT16to32, RGBtoYUV);
+
+ unsigned int w[10];
+ unsigned int c[10];
+
+ // +----+----+----+
+ // | | | |
+ // | w1 | w2 | w3 |
+ // +----+----+----+
+ // | | | |
+ // | w4 | w5 | w6 |
+ // +----+----+----+
+ // | | | |
+ // | w7 | w8 | w9 |
+ // +----+----+----+
+ //
+ // w5 is the current point.
+
+ for (int j = 0; j < ncols; j++)
+ {
+ for (int i = 0; i < nrows; i++)
+ {
+ w[1] = rgb8toShort(input.at_(i - 1, j - 1));
+ w[2] = rgb8toShort(input.at_(i - 1, j));
+ w[3] = rgb8toShort(input.at_(i - 1, j + 1));
+ w[4] = rgb8toShort(input.at_(i, j - 1));
+ w[5] = rgb8toShort(input.at_(i, j));
+ w[6] = rgb8toShort(input.at_(i, j + 1));
+ w[7] = rgb8toShort(input.at_(i + 1, j - 1));
+ w[8] = rgb8toShort(input.at_(i + 1, j));
+ w[9] = rgb8toShort(input.at_(i + 1, j + 1));
+
+ int pattern = 0;
+ int flag = 1;
+
+ YUV1 = RGBtoYUV[w[5]];
+
+ for (int k = 1; k <= 9; k++)
+ {
+ if (k == 5)
+ continue;
+
+ if (w[k] != w[5])
+ {
+ YUV2 = RGBtoYUV[w[k]];
+ if ((abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) ||
+ (abs((YUV1 & Umask) - (YUV2 & Umask)) > trU) ||
+ (abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV))
+ pattern |= flag;
+ }
+ flag <<= 1;
+ }
+
+ for (int k = 1; k <= 9; k++)
+ c[k] = LUT16to32[w[k]];
+
+ switch (pattern)
+ {
+ case 0:
+ case 1:
+ case 4:
+ case 32:
+ case 128:
+ case 5:
+ case 132:
+ case 160:
+ case 33:
+ case 129:
+ case 36:
+ case 133:
+ case 164:
+ case 161:
+ case 37:
+ case 165:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 2:
+ case 34:
+ case 130:
+ case 162:
+ {
+ PIXEL00_22
+ PIXEL01_21
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 16:
+ case 17:
+ case 48:
+ case 49:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 64:
+ case 65:
+ case 68:
+ case 69:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_21
+ PIXEL11_22
+ break;
+ }
+ case 8:
+ case 12:
+ case 136:
+ case 140:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 3:
+ case 35:
+ case 131:
+ case 163:
+ {
+ PIXEL00_11
+ PIXEL01_21
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 6:
+ case 38:
+ case 134:
+ case 166:
+ {
+ PIXEL00_22
+ PIXEL01_12
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 20:
+ case 21:
+ case 52:
+ case 53:
+ {
+ PIXEL00_20
+ PIXEL01_11
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 144:
+ case 145:
+ case 176:
+ case 177:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ PIXEL10_20
+ PIXEL11_12
+ break;
+ }
+ case 192:
+ case 193:
+ case 196:
+ case 197:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_21
+ PIXEL11_11
+ break;
+ }
+ case 96:
+ case 97:
+ case 100:
+ case 101:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_12
+ PIXEL11_22
+ break;
+ }
+ case 40:
+ case 44:
+ case 168:
+ case 172:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ PIXEL10_11
+ PIXEL11_20
+ break;
+ }
+ case 9:
+ case 13:
+ case 137:
+ case 141:
+ {
+ PIXEL00_12
+ PIXEL01_20
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 18:
+ case 50:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 80:
+ case 81:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 72:
+ case 76:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 10:
+ case 138:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 66:
+ {
+ PIXEL00_22
+ PIXEL01_21
+ PIXEL10_21
+ PIXEL11_22
+ break;
+ }
+ case 24:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 7:
+ case 39:
+ case 135:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 148:
+ case 149:
+ case 180:
+ {
+ PIXEL00_20
+ PIXEL01_11
+ PIXEL10_20
+ PIXEL11_12
+ break;
+ }
+ case 224:
+ case 228:
+ case 225:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 41:
+ case 169:
+ case 45:
+ {
+ PIXEL00_12
+ PIXEL01_20
+ PIXEL10_11
+ PIXEL11_20
+ break;
+ }
+ case 22:
+ case 54:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 208:
+ case 209:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 104:
+ case 108:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 11:
+ case 139:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 19:
+ case 51:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_11
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL00_60
+ PIXEL01_90
+ }
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 146:
+ case 178:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ PIXEL11_12
+ }
+ else
+ {
+ PIXEL01_90
+ PIXEL11_61
+ }
+ PIXEL10_20
+ break;
+ }
+ case 84:
+ case 85:
+ {
+ PIXEL00_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL01_11
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL01_60
+ PIXEL11_90
+ }
+ PIXEL10_21
+ break;
+ }
+ case 112:
+ case 113:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL10_12
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL10_61
+ PIXEL11_90
+ }
+ break;
+ }
+ case 200:
+ case 204:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ PIXEL11_11
+ }
+ else
+ {
+ PIXEL10_90
+ PIXEL11_60
+ }
+ break;
+ }
+ case 73:
+ case 77:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_12
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL00_61
+ PIXEL10_90
+ }
+ PIXEL01_20
+ PIXEL11_22
+ break;
+ }
+ case 42:
+ case 170:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ PIXEL10_11
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL10_60
+ }
+ PIXEL01_21
+ PIXEL11_20
+ break;
+ }
+ case 14:
+ case 142:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ PIXEL01_12
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL01_61
+ }
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 67:
+ {
+ PIXEL00_11
+ PIXEL01_21
+ PIXEL10_21
+ PIXEL11_22
+ break;
+ }
+ case 70:
+ {
+ PIXEL00_22
+ PIXEL01_12
+ PIXEL10_21
+ PIXEL11_22
+ break;
+ }
+ case 28:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 152:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 194:
+ {
+ PIXEL00_22
+ PIXEL01_21
+ PIXEL10_21
+ PIXEL11_11
+ break;
+ }
+ case 98:
+ {
+ PIXEL00_22
+ PIXEL01_21
+ PIXEL10_12
+ PIXEL11_22
+ break;
+ }
+ case 56:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 25:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 26:
+ case 31:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 82:
+ case 214:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 88:
+ case 248:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 74:
+ case 107:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 27:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_10
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 86:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_21
+ PIXEL11_10
+ break;
+ }
+ case 216:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ PIXEL10_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 106:
+ {
+ PIXEL00_10
+ PIXEL01_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 30:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 210:
+ {
+ PIXEL00_22
+ PIXEL01_10
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 120:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_10
+ break;
+ }
+ case 75:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ PIXEL10_10
+ PIXEL11_22
+ break;
+ }
+ case 29:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ PIXEL10_22
+ PIXEL11_21
+ break;
+ }
+ case 198:
+ {
+ PIXEL00_22
+ PIXEL01_12
+ PIXEL10_21
+ PIXEL11_11
+ break;
+ }
+ case 184:
+ {
+ PIXEL00_21
+ PIXEL01_22
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 99:
+ {
+ PIXEL00_11
+ PIXEL01_21
+ PIXEL10_12
+ PIXEL11_22
+ break;
+ }
+ case 57:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 71:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_21
+ PIXEL11_22
+ break;
+ }
+ case 156:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 226:
+ {
+ PIXEL00_22
+ PIXEL01_21
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 60:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 195:
+ {
+ PIXEL00_11
+ PIXEL01_21
+ PIXEL10_21
+ PIXEL11_11
+ break;
+ }
+ case 102:
+ {
+ PIXEL00_22
+ PIXEL01_12
+ PIXEL10_12
+ PIXEL11_22
+ break;
+ }
+ case 153:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 58:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 83:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 92:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 202:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ PIXEL01_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ PIXEL11_11
+ break;
+ }
+ case 78:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ PIXEL11_22
+ break;
+ }
+ case 154:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 114:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 89:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 90:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 55:
+ case 23:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_11
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL00_60
+ PIXEL01_90
+ }
+ PIXEL10_20
+ PIXEL11_21
+ break;
+ }
+ case 182:
+ case 150:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ PIXEL11_12
+ }
+ else
+ {
+ PIXEL01_90
+ PIXEL11_61
+ }
+ PIXEL10_20
+ break;
+ }
+ case 213:
+ case 212:
+ {
+ PIXEL00_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL01_11
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL01_60
+ PIXEL11_90
+ }
+ PIXEL10_21
+ break;
+ }
+ case 241:
+ case 240:
+ {
+ PIXEL00_20
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL10_12
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL10_61
+ PIXEL11_90
+ }
+ break;
+ }
+ case 236:
+ case 232:
+ {
+ PIXEL00_21
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ PIXEL11_11
+ }
+ else
+ {
+ PIXEL10_90
+ PIXEL11_60
+ }
+ break;
+ }
+ case 109:
+ case 105:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_12
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_61
+ PIXEL10_90
+ }
+ PIXEL01_20
+ PIXEL11_22
+ break;
+ }
+ case 171:
+ case 43:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL10_11
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL10_60
+ }
+ PIXEL01_21
+ PIXEL11_20
+ break;
+ }
+ case 143:
+ case 15:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_12
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL01_61
+ }
+ PIXEL10_22
+ PIXEL11_20
+ break;
+ }
+ case 124:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_10
+ break;
+ }
+ case 203:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ PIXEL10_10
+ PIXEL11_11
+ break;
+ }
+ case 62:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 211:
+ {
+ PIXEL00_11
+ PIXEL01_10
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 118:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_12
+ PIXEL11_10
+ break;
+ }
+ case 217:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ PIXEL10_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 110:
+ {
+ PIXEL00_10
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 155:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_10
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 188:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 185:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 61:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 157:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 103:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_12
+ PIXEL11_22
+ break;
+ }
+ case 227:
+ {
+ PIXEL00_11
+ PIXEL01_21
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 230:
+ {
+ PIXEL00_22
+ PIXEL01_12
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 199:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_21
+ PIXEL11_11
+ break;
+ }
+ case 220:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 158:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 234:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ PIXEL01_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_11
+ break;
+ }
+ case 242:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 59:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 121:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 87:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 79:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ PIXEL11_22
+ break;
+ }
+ case 122:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 94:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 218:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 91:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 229:
+ {
+ PIXEL00_20
+ PIXEL01_20
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 167:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_20
+ PIXEL11_20
+ break;
+ }
+ case 173:
+ {
+ PIXEL00_12
+ PIXEL01_20
+ PIXEL10_11
+ PIXEL11_20
+ break;
+ }
+ case 181:
+ {
+ PIXEL00_20
+ PIXEL01_11
+ PIXEL10_20
+ PIXEL11_12
+ break;
+ }
+ case 186:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 115:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 93:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 206:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ PIXEL11_11
+ break;
+ }
+ case 205:
+ case 201:
+ {
+ PIXEL00_12
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_10
+ }
+ else
+ {
+ PIXEL10_70
+ }
+ PIXEL11_11
+ break;
+ }
+ case 174:
+ case 46:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_10
+ }
+ else
+ {
+ PIXEL00_70
+ }
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_20
+ break;
+ }
+ case 179:
+ case 147:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_10
+ }
+ else
+ {
+ PIXEL01_70
+ }
+ PIXEL10_20
+ PIXEL11_12
+ break;
+ }
+ case 117:
+ case 116:
+ {
+ PIXEL00_20
+ PIXEL01_11
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_10
+ }
+ else
+ {
+ PIXEL11_70
+ }
+ break;
+ }
+ case 189:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 231:
+ {
+ PIXEL00_11
+ PIXEL01_12
+ PIXEL10_12
+ PIXEL11_11
+ break;
+ }
+ case 126:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_10
+ break;
+ }
+ case 219:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_10
+ PIXEL10_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 125:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL00_12
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL00_61
+ PIXEL10_90
+ }
+ PIXEL01_11
+ PIXEL11_10
+ break;
+ }
+ case 221:
+ {
+ PIXEL00_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL01_11
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL01_60
+ PIXEL11_90
+ }
+ PIXEL10_10
+ break;
+ }
+ case 207:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL01_12
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL01_61
+ }
+ PIXEL10_10
+ PIXEL11_11
+ break;
+ }
+ case 238:
+ {
+ PIXEL00_10
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ PIXEL11_11
+ }
+ else
+ {
+ PIXEL10_90
+ PIXEL11_60
+ }
+ break;
+ }
+ case 190:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ PIXEL11_12
+ }
+ else
+ {
+ PIXEL01_90
+ PIXEL11_61
+ }
+ PIXEL10_11
+ break;
+ }
+ case 187:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ PIXEL10_11
+ }
+ else
+ {
+ PIXEL00_90
+ PIXEL10_60
+ }
+ PIXEL01_10
+ PIXEL11_12
+ break;
+ }
+ case 243:
+ {
+ PIXEL00_11
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL10_12
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL10_61
+ PIXEL11_90
+ }
+ break;
+ }
+ case 119:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL00_11
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL00_60
+ PIXEL01_90
+ }
+ PIXEL10_12
+ PIXEL11_10
+ break;
+ }
+ case 237:
+ case 233:
+ {
+ PIXEL00_12
+ PIXEL01_20
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ PIXEL11_11
+ break;
+ }
+ case 175:
+ case 47:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ PIXEL01_12
+ PIXEL10_11
+ PIXEL11_20
+ break;
+ }
+ case 183:
+ case 151:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_20
+ PIXEL11_12
+ break;
+ }
+ case 245:
+ case 244:
+ {
+ PIXEL00_20
+ PIXEL01_11
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 250:
+ {
+ PIXEL00_10
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 123:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_10
+ break;
+ }
+ case 95:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_10
+ PIXEL11_10
+ break;
+ }
+ case 222:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 252:
+ {
+ PIXEL00_21
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 249:
+ {
+ PIXEL00_12
+ PIXEL01_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 235:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ PIXEL11_11
+ break;
+ }
+ case 111:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_22
+ break;
+ }
+ case 63:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_11
+ PIXEL11_21
+ break;
+ }
+ case 159:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_22
+ PIXEL11_12
+ break;
+ }
+ case 215:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_21
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 246:
+ {
+ PIXEL00_22
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 254:
+ {
+ PIXEL00_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 253:
+ {
+ PIXEL00_12
+ PIXEL01_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 251:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ PIXEL01_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 239:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ PIXEL01_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ PIXEL11_11
+ break;
+ }
+ case 127:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_20
+ }
+ PIXEL11_10
+ break;
+ }
+ case 191:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_11
+ PIXEL11_12
+ break;
+ }
+ case 223:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_20
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_10
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_20
+ }
+ break;
+ }
+ case 247:
+ {
+ PIXEL00_11
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ PIXEL10_12
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+ case 255:
+ {
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[4], w[2]))
+ {
+ PIXEL00_0
+ }
+ else
+ {
+ PIXEL00_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[2], w[6]))
+ {
+ PIXEL01_0
+ }
+ else
+ {
+ PIXEL01_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[8], w[4]))
+ {
+ PIXEL10_0
+ }
+ else
+ {
+ PIXEL10_100
+ }
+ if (Diff(YUV1, YUV2, RGBtoYUV, trY, trU, trV, Ymask, Umask, Vmask, w[6], w[8]))
+ {
+ PIXEL11_0
+ }
+ else
+ {
+ PIXEL11_100
+ }
+ break;
+ }
+
+ }
+ }
+ }
+
+ trace::exiting("upsampling::impl::hq2x_");
+ return output;
+ }
+
+ } // end of namespace mln::upsampling::impl
+
+
+ template <typename I>
+ inline
+ mln_concrete(I)
+ hq2x(const Image<I>& input)
+ {
+ trace::entering("upsampling::hq2x");
+ mln_precondition(exact(input).is_valid());
+
+ mln_concrete(I) output;
+
+ output = impl::hq2x_(exact(input));
+
+ trace::exiting("upsampling::hq2x");
+ return output;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace mln::upsampling
+
+} // end of namespace mln
+
+
+#endif // ! MLN_UPSAMPLING_HQ2X_HH
Index: trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh
===================================================================
--- trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh (revision 4431)
+++ trunk/milena/sandbox/fabien/mln/upsampling/hq3x.hh (revision 4432)
@@ -52,22 +52,6 @@
namespace impl
{
inline
- int
- rgb8toInt(value::rgb8 val)
- {
- int result = 0;
-
- result += val.blue();
- result = result << 8;
- result += val.green();
- result = result << 8;
- result += val.red();
- //result = result << 8;
-
- return result;
- }
-
- inline
unsigned short
rgb8toShort(value::rgb8 val)
{
@@ -83,20 +67,6 @@
}
inline
- unsigned int
- rgb8toYuv(value::rgb8 val)
- {
- unsigned int result = 0;
-
- result += (val.red() + val.green() + val.blue()) / 3;
- result = result << 8;
- result = result << 8;
- //result = result << 8;
-
- return result;
- }
-
- inline
void
intToRgb8(int in, value::rgb8& out)
{
1
0
* levillain/: Rename directory as...
* roland/: ...this.
---
milena/sandbox/ChangeLog | 7 +++++++
milena/sandbox/{levillain => roland}/.gitignore | 0
milena/sandbox/{levillain => roland}/Makefile | 0
milena/sandbox/{levillain => roland}/alexandre | 0
.../constrained-connectivity.cc | 0
milena/sandbox/{levillain => roland}/double.cc | 0
milena/sandbox/{levillain => roland}/min-max.cc | 0
.../morpho/lower_completion.hh | 0
.../morpho/shortest_path_watershed.hh | 0
milena/sandbox/{levillain => roland}/soille.pgm | 0
milena/sandbox/{levillain => roland}/theo | 0
11 files changed, 7 insertions(+), 0 deletions(-)
rename milena/sandbox/{levillain => roland}/.gitignore (100%)
rename milena/sandbox/{levillain => roland}/Makefile (100%)
rename milena/sandbox/{levillain => roland}/alexandre (100%)
rename milena/sandbox/{levillain => roland}/constrained-connectivity.cc (100%)
rename milena/sandbox/{levillain => roland}/double.cc (100%)
rename milena/sandbox/{levillain => roland}/min-max.cc (100%)
rename milena/sandbox/{levillain => roland}/morpho/lower_completion.hh (100%)
rename milena/sandbox/{levillain => roland}/morpho/shortest_path_watershed.hh (100%)
rename milena/sandbox/{levillain => roland}/soille.pgm (100%)
rename milena/sandbox/{levillain => roland}/theo (100%)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 24378ce..4b53f49 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,12 @@
2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+ Rename Roland's sandbox.
+
+ * levillain/: Rename directory as...
+ * roland/: ...this.
+
+2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+
* levillain/constrained-connectivity.cc: Aesthetic changes.
2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
diff --git a/milena/sandbox/levillain/.gitignore b/milena/sandbox/roland/.gitignore
similarity index 100%
rename from milena/sandbox/levillain/.gitignore
rename to milena/sandbox/roland/.gitignore
diff --git a/milena/sandbox/levillain/Makefile b/milena/sandbox/roland/Makefile
similarity index 100%
rename from milena/sandbox/levillain/Makefile
rename to milena/sandbox/roland/Makefile
diff --git a/milena/sandbox/levillain/alexandre b/milena/sandbox/roland/alexandre
similarity index 100%
rename from milena/sandbox/levillain/alexandre
rename to milena/sandbox/roland/alexandre
diff --git a/milena/sandbox/levillain/constrained-connectivity.cc b/milena/sandbox/roland/constrained-connectivity.cc
similarity index 100%
rename from milena/sandbox/levillain/constrained-connectivity.cc
rename to milena/sandbox/roland/constrained-connectivity.cc
diff --git a/milena/sandbox/levillain/double.cc b/milena/sandbox/roland/double.cc
similarity index 100%
rename from milena/sandbox/levillain/double.cc
rename to milena/sandbox/roland/double.cc
diff --git a/milena/sandbox/levillain/min-max.cc b/milena/sandbox/roland/min-max.cc
similarity index 100%
rename from milena/sandbox/levillain/min-max.cc
rename to milena/sandbox/roland/min-max.cc
diff --git a/milena/sandbox/levillain/morpho/lower_completion.hh b/milena/sandbox/roland/morpho/lower_completion.hh
similarity index 100%
rename from milena/sandbox/levillain/morpho/lower_completion.hh
rename to milena/sandbox/roland/morpho/lower_completion.hh
diff --git a/milena/sandbox/levillain/morpho/shortest_path_watershed.hh b/milena/sandbox/roland/morpho/shortest_path_watershed.hh
similarity index 100%
rename from milena/sandbox/levillain/morpho/shortest_path_watershed.hh
rename to milena/sandbox/roland/morpho/shortest_path_watershed.hh
diff --git a/milena/sandbox/levillain/soille.pgm b/milena/sandbox/roland/soille.pgm
similarity index 100%
rename from milena/sandbox/levillain/soille.pgm
rename to milena/sandbox/roland/soille.pgm
diff --git a/milena/sandbox/levillain/theo b/milena/sandbox/roland/theo
similarity index 100%
rename from milena/sandbox/levillain/theo
rename to milena/sandbox/roland/theo
--
1.6.4.2
1
0
---
ChangeLog | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5ded2bf..353fbaa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -31,6 +31,10 @@
* build-aux/mln_check_guards: New.
+2009-07-14 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
+
+ * lrde-upload.sh: Set permissions on specific directories only.
+
2009-07-14 Roland Levillain <roland(a)lrde.epita.fr>
* configure.ac, NEWS: Version 1.0a.
@@ -44,10 +48,6 @@
2009-07-13 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
- * lrde-upload.sh: Set permissions on specific directories only.
-
-2009-07-13 Guillaume Lazzara <lazzara(a)lrde.epita.fr>
-
* lrde-upload.sh: Set writing permissions for group on uploaded
files.
--
1.6.1.2
1
0
[PATCH 8/8] levillain/constrained-connectivity.cc: Aesthetic changes.
by Roland Levillain 04 Sep '09
by Roland Levillain 04 Sep '09
04 Sep '09
---
milena/sandbox/ChangeLog | 4 +
.../sandbox/levillain/constrained-connectivity.cc | 86 +++++++++----------
2 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 4dcc85b..24378ce 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,9 @@
2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+ * levillain/constrained-connectivity.cc: Aesthetic changes.
+
+2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+
Finish the experiment for Laurent.
* levillain/constrained-connectivity.cc: Complete the processing
diff --git a/milena/sandbox/levillain/constrained-connectivity.cc b/milena/sandbox/levillain/constrained-connectivity.cc
index 81c86ca..af5e49a 100644
--- a/milena/sandbox/levillain/constrained-connectivity.cc
+++ b/milena/sandbox/levillain/constrained-connectivity.cc
@@ -102,15 +102,16 @@ int main(int argc, char* argv[])
// Double its resolution.
image2d<int_u8> f(input.nrows() * 2, input.ncols() * 2);
- mln_piter_(image2d<int_u8>) p(f.domain());
- for_all(p)
+ mln_piter_(image2d<int_u8>) p_ima(f.domain());
+ for_all(p_ima)
{
- /* This conversion from ``piter'' to ``point'' is required, since
- an iterator does not expose the interface of the underlying
- point (among which the methods row(), col(), etc.). */
- point2d p_ = p;
- point2d q(p_.row() / 2, p_.col() / 2);
- f(p) = input(q);
+ /* This conversion from a ``piter'' type to point2d is required,
+ since an iterator does not expose the interface of the
+ underlying point (among which the methods row(), col(),
+ etc.). */
+ point2d p_ima_ = p_ima;
+ point2d p_f(p_ima_.row() / 2, p_ima_.col() / 2);
+ f(p_ima) = input(p_f);
}
debug::println(f);
@@ -130,86 +131,81 @@ int main(int argc, char* argv[])
std::set<int_u8> values;
mln_piter_(w_t) p2(w.domain());
for_all(p2)
- values.insert (w(p2));
+ values.insert(w(p2));
- // Thresholding for each value of W.
+ // Thresholding W for each value of the image.
for (std::set<int_u8>::const_iterator alpha = values.begin();
alpha != values.end(); ++alpha)
{
mln_VAR(alpha_cc, w | (pw::value(w) > pw::cst(*alpha)));
+ std::cout << *alpha << "-cc:" << std::endl;
/* FIXME: There should be variants of debug::println allowing
the user to pass an optional ``support'' larger than the
actual domain of the image. For now, use a low-level routine
as a workaround. */
- std::cout << *alpha << "-cc:" << std::endl;
debug::impl::println(w.unmorph_().domain(), alpha_cc);
}
- // Compute attributes on the components of the topological watershed (W).
- typedef p_array<tree_t::site> sites_t;
- sites_t sites = data::sort_psites_decreasing(w);
+ // Compute the height (max - min) of connected components on the line
+ // graph-based watershed, but with min and max values computed on
+ // vertices.
- /* FIXME: Of course, we'd like to be able to reuse the component tree
- within TREE instead of rebuilding a morpho::tree::data... This
- requires some changes in the topological WST implementation to
- make its component tree structure compatible with
+ /* FIXME: Of course, we'd like to be able to reuse the component
+ tree within TREE instead of rebuilding a morpho::tree::data...
+ This requires some changes in the topological WST implementation,
+ to make its component tree structure compatible with
morpho::tree::data. */
+ typedef p_array<tree_t::site> sites_t;
+ sites_t sites = data::sort_psites_decreasing(w);
morpho::tree::data<w_t, sites_t> t(w, sites, cplx2d::e2e());
- // Height (max-min) on the line graph WST, but with min and max
- // values computed on vertices.
+ // Create initial images for min and max values on sites (not components).
mln_ch_value_(w_t, accu::stat::min<int_u8>) init_min_val;
initialize (init_min_val, w);
mln_ch_value_(w_t, accu::stat::max<int_u8>) init_max_val;
initialize (init_max_val, w);
- mln_fwd_piter_(w_t) e(w.domain());
- mln_niter_(cplx2d::dbl_neighb2d) v(cplx2d::e2p(), e);
+ /* Compute the min and max values on vertices (pixels) adjacent to
+ edge E.
+
+ Unfortunately, the data structure G does not record any
+ information from the image F (i.e., the values on
+ vertices/pixels). We have to convert the coordinates of V to its
+ equivalent in F's domain to get the values on vertices. */
+ mln_piter_(w_t) e(w.domain());
+ mln_niter_(cplx2d::dbl_neighb2d) v_g(cplx2d::e2p(), e);
for_all(e)
- {
- // Compute the min and max values on vertices (pixels) adjacent to edge E.
- for_all(v)
+ for_all(v_g)
{
- /* Unfortunately, the data structure G does not record any
- information from the image F (i.e., the values on
- vertices/pixels). We have to convert the coordinates of V
- to its equivalent in F's domain to get the values on
- vertices.
-
- In addition, note that an explicit `to_site()' conversion
- is required here, since an iterator does not expose the
- interface of the underlying point (among which the methods
- row(), col(), etc.). */
- point2d v_(v.to_site().row() / 2, v.to_site().col() / 2);
- init_min_val(e).take(f(v_));
- init_max_val(e).take(f(v_));
+ // Same remark as above avour piter to point2d conversions.
+ point2d v_g_ = v_g;
+ point2d v_f(v_g_.row() / 2, v_g_.col() / 2);
+ init_min_val(e).take(f(v_f));
+ init_max_val(e).take(f(v_f));
}
- }
+ // Attribute images of min and max values on components.
accu::stat::min<int_u8> min_accu;
mln_ch_value_(w_t, int_u8) min_val =
morpho::tree::compute_attribute_image_from(min_accu, t, init_min_val);
accu::stat::max<int_u8> max_accu;
mln_ch_value_(w_t, int_u8) max_val =
morpho::tree::compute_attribute_image_from(max_accu, t, init_max_val);
-
+ // Attribute image of components' height.
mln_ch_value_(w_t, int_u8) height;
initialize(height, w);
for_all(e)
height(e) = max_val(e) - min_val(e);
debug::println(height);
- // Thresholding for the first integer values with a condition on HEIGHT.
+ // Thresholding W using first integer values with a condition on HEIGHT.
for (unsigned alpha = 0; alpha <= 6; ++alpha)
{
mln_VAR(alpha_alpha_cc,
w | (pw::value(w) > pw::cst(alpha)
|| (pw::value(height) > pw::cst(alpha))));
- /* FIXME: There should be variants of debug::println allowing
- the user to pass an optional ``support'' larger than the
- actual domain of the image. For now, use a low-level routine
- as a workaround. */
std::cout << "(" << alpha << ", " << alpha << ")-cc:" << std::endl;
+ // FIXME: Same remark as above about println.
debug::impl::println(w.unmorph_().domain(), alpha_alpha_cc);
}
}
--
1.6.4.2
1
0
* levillain/constrained-connectivity.cc: Complete the processing
chain.
Add a copyright header.
Translate the documentation into English.
s/ima/input/g.
s/ima_x2/f/g.
* levillain/soille.pgm: New.
* levillain/Makefile: New.
---
milena/sandbox/ChangeLog | 13 ++
milena/sandbox/levillain/Makefile | 27 +++
.../sandbox/levillain/constrained-connectivity.cc | 175 ++++++++++++++++----
milena/sandbox/levillain/soille.pgm | 11 ++
4 files changed, 197 insertions(+), 29 deletions(-)
create mode 100644 milena/sandbox/levillain/Makefile
create mode 100644 milena/sandbox/levillain/soille.pgm
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 673d4d8..4dcc85b 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,3 +1,16 @@
+2009-09-04 Roland Levillain <roland(a)lrde.epita.fr>
+
+ Finish the experiment for Laurent.
+
+ * levillain/constrained-connectivity.cc: Complete the processing
+ chain.
+ Add a copyright header.
+ Translate the documentation into English.
+ s/ima/input/g.
+ s/ima_x2/f/g.
+ * levillain/soille.pgm: New.
+ * levillain/Makefile: New.
+
2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
Start a new experiment for Laurent.
diff --git a/milena/sandbox/levillain/Makefile b/milena/sandbox/levillain/Makefile
new file mode 100644
index 0000000..d95c7a5
--- /dev/null
+++ b/milena/sandbox/levillain/Makefile
@@ -0,0 +1,27 @@
+# FIXME: A part of this should move out of this sandbox and into milena/apps.
+
+milena_dir = ../..
+img_dir = $(milena_dir)/img
+
+CPPFLAGS = -I. -I$(milena_dir)
+CXXFLAGS = -ggdb -Wall -Werror
+
+PROGRAMS = double min-max constrained-connectivity
+
+all: $(PROGRAMS)
+
+check: check-double check-min-max check-constrained-connectivity
+check-double: double
+ ./$<
+check-min-max: min-max
+ ./$<
+check-constrained-connectivity: constrained-connectivity soille.pgm
+ ./$< soille.pgm
+
+CLEANFILES = double min-max constrained-connectivity
+
+clean:
+ rm -f $(CLEANFILES)
+
+.PHONY: all check clean
+.PHONY: check-double check-min-max check-constrained-connectivity
diff --git a/milena/sandbox/levillain/constrained-connectivity.cc b/milena/sandbox/levillain/constrained-connectivity.cc
index d740956..81c86ca 100644
--- a/milena/sandbox/levillain/constrained-connectivity.cc
+++ b/milena/sandbox/levillain/constrained-connectivity.cc
@@ -1,21 +1,65 @@
-/* The Work:
-
- - Prendre une image 2d
- - En doubler les pixels (un pixel -> un carré de quatre pixels)
- - En calculer un graphe d'arrête (passage en complexe cubique)
- - Valuer les arrêtes avec une magnitude de gradient (|v1 - v2|)
- - Calculer une LPE topo sur ce gradient
- - Seuiller les valeurs de cette LPE doit être équivalent aux
- alpha-CC de Pierre Soille (hypothèse de Laurent)
+// Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/** \file constrained-connectivity.cc
- - Puis, sur l'arbre des coupes (correspondant à la LPE topo
- calculée ci-avant), calculer pour chaque arrête `e' un attribut
- initialisé tel que `a(e) = (min(v1,v2), max(v1,v2))' (couple) où
- `v1' et `v2' sont adjacents à `e', et propager ce min et ce max
- sur tous les noeuds.
- - Il doit normalement être possible d'obtenir les (alpha,
- omega)-CC de Pierre Soille en filtrant cet arbre. */
-
+ \brief A topological watershed-based implementation of Pierre
+ Soille's constrained connectivity segmentation.
+
+ Reference:
+
+ Pierre Soille. Constrained Connectivity for Hierarchical Image
+ Partitioning and Simplification. In: IEEE Transactions on
+ Pattern Analysis and Machine Intelligence, vol. 30, no. 7, July
+ 2008, pages 1132-1145.
+
+
+ The scenario is as follows.
+
+ Part 1.
+ \li Load a 2D image.
+ \li Double its resolution (a pixel becomes a square of four pixels).
+ \li Compute a line graph from this image and
+ \li Assign values of a gradient to the edges (e.g., |v1 - v2|).
+ \li Compute a topological watershed transform on this gradient.
+ \li Thresholding the values of this watershed gives
+ alpha-connected component (alpha-cc) described by Pierre Soille.
+
+ Part 2.
+ \li For each edge of the watershed (line graph-based) image,
+ compute the min and max value of the adjacent vertices (pixels).
+ \li Using the component tree corresponding to the previously
+ computed topological watershed transform, propagate and
+ compute the min and max value for each component of the
+ watershed.
+ \li Create an image of ``heights'' by subtracting the image of min
+ values from the image of max values.
+ \li Thresholding the watershed image (using a parameter alpha)
+ <em>and</em> the height image (using a parameter omega) gives
+ the (alpha, omega)-connected component (alpha-omega cc)
+ described by Pierre Soille. */
#include <cstdio>
@@ -27,15 +71,19 @@
#include <mln/pw/all.hh>
-#include <mln/io/pgm/load.hh>
-#include <mln/debug/println.hh>
-
// From Théo's sandbox.
#include <theo/cplx2d.hh>
// From Alexandre Abraham's sandbox.
#include <alexandre/topo_wst.hh>
+#include <mln/morpho/tree/compute_attribute_image.hh>
+#include <mln/accu/stat/min.hh>
+#include <mln/accu/stat/max.hh>
+
+#include <mln/io/pgm/load.hh>
+#include <mln/debug/println.hh>
+
int main(int argc, char* argv[])
{
@@ -49,12 +97,12 @@ int main(int argc, char* argv[])
using mln::value::int_u8;
// Load an image.
- image2d<int_u8> ima;
- io::pgm::load(ima, argv[1]);
+ image2d<int_u8> input;
+ io::pgm::load(input, argv[1]);
// Double its resolution.
- image2d<int_u8> ima_x2 (10, 10);
- mln_piter_(image2d<int_u8>) p(ima_x2.domain());
+ image2d<int_u8> f(input.nrows() * 2, input.ncols() * 2);
+ mln_piter_(image2d<int_u8>) p(f.domain());
for_all(p)
{
/* This conversion from ``piter'' to ``point'' is required, since
@@ -62,16 +110,17 @@ int main(int argc, char* argv[])
point (among which the methods row(), col(), etc.). */
point2d p_ = p;
point2d q(p_.row() / 2, p_.col() / 2);
- ima_x2(p) = ima(q);
+ f(p) = input(q);
}
- debug::println(ima_x2);
+ debug::println(f);
// Compute the associated line graph gradient.
- mln_VAR(g, cplx2d::f_to_g(ima_x2) );
+ mln_VAR(g, cplx2d::f_to_g(f) );
debug::println("g:", g);
// Compute a topological watershed transform on this gradient.
- morpho::topo_wst<g_t, cplx2d::dbl_neighb2d> tree(g, cplx2d::e2e());
+ typedef morpho::topo_wst<g_t, cplx2d::dbl_neighb2d> tree_t;
+ tree_t tree(g, cplx2d::e2e());
tree.go();
mln_VAR(w, morpho::topo_watershed(tree));
debug::println("w:", w);
@@ -84,7 +133,7 @@ int main(int argc, char* argv[])
values.insert (w(p2));
// Thresholding for each value of W.
- for (std::set<int_u8>::iterator alpha = values.begin();
+ for (std::set<int_u8>::const_iterator alpha = values.begin();
alpha != values.end(); ++alpha)
{
mln_VAR(alpha_cc, w | (pw::value(w) > pw::cst(*alpha)));
@@ -95,4 +144,72 @@ int main(int argc, char* argv[])
std::cout << *alpha << "-cc:" << std::endl;
debug::impl::println(w.unmorph_().domain(), alpha_cc);
}
+
+
+ // Compute attributes on the components of the topological watershed (W).
+ typedef p_array<tree_t::site> sites_t;
+ sites_t sites = data::sort_psites_decreasing(w);
+
+ /* FIXME: Of course, we'd like to be able to reuse the component tree
+ within TREE instead of rebuilding a morpho::tree::data... This
+ requires some changes in the topological WST implementation to
+ make its component tree structure compatible with
+ morpho::tree::data. */
+ morpho::tree::data<w_t, sites_t> t(w, sites, cplx2d::e2e());
+
+ // Height (max-min) on the line graph WST, but with min and max
+ // values computed on vertices.
+ mln_ch_value_(w_t, accu::stat::min<int_u8>) init_min_val;
+ initialize (init_min_val, w);
+ mln_ch_value_(w_t, accu::stat::max<int_u8>) init_max_val;
+ initialize (init_max_val, w);
+
+ mln_fwd_piter_(w_t) e(w.domain());
+ mln_niter_(cplx2d::dbl_neighb2d) v(cplx2d::e2p(), e);
+ for_all(e)
+ {
+ // Compute the min and max values on vertices (pixels) adjacent to edge E.
+ for_all(v)
+ {
+ /* Unfortunately, the data structure G does not record any
+ information from the image F (i.e., the values on
+ vertices/pixels). We have to convert the coordinates of V
+ to its equivalent in F's domain to get the values on
+ vertices.
+
+ In addition, note that an explicit `to_site()' conversion
+ is required here, since an iterator does not expose the
+ interface of the underlying point (among which the methods
+ row(), col(), etc.). */
+ point2d v_(v.to_site().row() / 2, v.to_site().col() / 2);
+ init_min_val(e).take(f(v_));
+ init_max_val(e).take(f(v_));
+ }
+ }
+ accu::stat::min<int_u8> min_accu;
+ mln_ch_value_(w_t, int_u8) min_val =
+ morpho::tree::compute_attribute_image_from(min_accu, t, init_min_val);
+ accu::stat::max<int_u8> max_accu;
+ mln_ch_value_(w_t, int_u8) max_val =
+ morpho::tree::compute_attribute_image_from(max_accu, t, init_max_val);
+
+ mln_ch_value_(w_t, int_u8) height;
+ initialize(height, w);
+ for_all(e)
+ height(e) = max_val(e) - min_val(e);
+ debug::println(height);
+
+ // Thresholding for the first integer values with a condition on HEIGHT.
+ for (unsigned alpha = 0; alpha <= 6; ++alpha)
+ {
+ mln_VAR(alpha_alpha_cc,
+ w | (pw::value(w) > pw::cst(alpha)
+ || (pw::value(height) > pw::cst(alpha))));
+ /* FIXME: There should be variants of debug::println allowing
+ the user to pass an optional ``support'' larger than the
+ actual domain of the image. For now, use a low-level routine
+ as a workaround. */
+ std::cout << "(" << alpha << ", " << alpha << ")-cc:" << std::endl;
+ debug::impl::println(w.unmorph_().domain(), alpha_alpha_cc);
+ }
}
diff --git a/milena/sandbox/levillain/soille.pgm b/milena/sandbox/levillain/soille.pgm
new file mode 100644
index 0000000..7b1593b
--- /dev/null
+++ b/milena/sandbox/levillain/soille.pgm
@@ -0,0 +1,11 @@
+P2
+7 7
+255
+
+1 3 8 7 8 8 2
+2 1 9 8 8 9 1
+1 0 4 1 1 2 5
+1 1 9 3 4 2 6
+3 2 7 9 9 1 1
+1 0 8 4 9 6 7
+0 2 9 3 8 5 9
--
1.6.4.2
1
0
* levillain/.gitignore: Add constrained-connectivity.
* levillain/alexandre: New symlink to abraham/mln/morpho.
* levillain/theo: New symlink to theo/esiee/laurent/ismm09.
* levillain/constrained-connectivity.cc: New.
---
milena/sandbox/ChangeLog | 9 ++
milena/sandbox/levillain/.gitignore | 1 +
milena/sandbox/levillain/alexandre | 1 +
.../sandbox/levillain/constrained-connectivity.cc | 98 ++++++++++++++++++++
milena/sandbox/levillain/theo | 1 +
5 files changed, 110 insertions(+), 0 deletions(-)
create mode 120000 milena/sandbox/levillain/alexandre
create mode 100644 milena/sandbox/levillain/constrained-connectivity.cc
create mode 120000 milena/sandbox/levillain/theo
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 83ef8c3..673d4d8 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,14 @@
2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
+ Start a new experiment for Laurent.
+
+ * levillain/.gitignore: Add constrained-connectivity.
+ * levillain/alexandre: New symlink to abraham/mln/morpho.
+ * levillain/theo: New symlink to theo/esiee/laurent/ismm09.
+ * levillain/constrained-connectivity.cc: New.
+
+2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
+
* theo/esiee/laurent/ismm09/cplx2d.hh: Include mln/core/var.hh.
2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
diff --git a/milena/sandbox/levillain/.gitignore b/milena/sandbox/levillain/.gitignore
index 627984b..e55cea5 100644
--- a/milena/sandbox/levillain/.gitignore
+++ b/milena/sandbox/levillain/.gitignore
@@ -1,2 +1,3 @@
+constrained-connectivity
double
min-max
diff --git a/milena/sandbox/levillain/alexandre b/milena/sandbox/levillain/alexandre
new file mode 120000
index 0000000..5edb140
--- /dev/null
+++ b/milena/sandbox/levillain/alexandre
@@ -0,0 +1 @@
+../abraham/mln/morpho/
\ No newline at end of file
diff --git a/milena/sandbox/levillain/constrained-connectivity.cc b/milena/sandbox/levillain/constrained-connectivity.cc
new file mode 100644
index 0000000..d740956
--- /dev/null
+++ b/milena/sandbox/levillain/constrained-connectivity.cc
@@ -0,0 +1,98 @@
+/* The Work:
+
+ - Prendre une image 2d
+ - En doubler les pixels (un pixel -> un carré de quatre pixels)
+ - En calculer un graphe d'arrête (passage en complexe cubique)
+ - Valuer les arrêtes avec une magnitude de gradient (|v1 - v2|)
+ - Calculer une LPE topo sur ce gradient
+ - Seuiller les valeurs de cette LPE doit être équivalent aux
+ alpha-CC de Pierre Soille (hypothèse de Laurent)
+
+ - Puis, sur l'arbre des coupes (correspondant à la LPE topo
+ calculée ci-avant), calculer pour chaque arrête `e' un attribut
+ initialisé tel que `a(e) = (min(v1,v2), max(v1,v2))' (couple) où
+ `v1' et `v2' sont adjacents à `e', et propager ce min et ce max
+ sur tous les noeuds.
+ - Il doit normalement être possible d'obtenir les (alpha,
+ omega)-CC de Pierre Soille en filtrant cet arbre. */
+
+
+#include <cstdio>
+
+#include <set>
+#include <iostream>
+
+#include <mln/value/int_u8.hh>
+#include <mln/core/image/image2d.hh>
+
+#include <mln/pw/all.hh>
+
+#include <mln/io/pgm/load.hh>
+#include <mln/debug/println.hh>
+
+// From Théo's sandbox.
+#include <theo/cplx2d.hh>
+
+// From Alexandre Abraham's sandbox.
+#include <alexandre/topo_wst.hh>
+
+
+int main(int argc, char* argv[])
+{
+ if (argc != 2)
+ {
+ std::cerr << "Usage: " << argv[0] << " input.pbm" << std::endl;
+ std::exit(1);
+ }
+
+ using namespace mln;
+ using mln::value::int_u8;
+
+ // Load an image.
+ image2d<int_u8> ima;
+ io::pgm::load(ima, argv[1]);
+
+ // Double its resolution.
+ image2d<int_u8> ima_x2 (10, 10);
+ mln_piter_(image2d<int_u8>) p(ima_x2.domain());
+ for_all(p)
+ {
+ /* This conversion from ``piter'' to ``point'' is required, since
+ an iterator does not expose the interface of the underlying
+ point (among which the methods row(), col(), etc.). */
+ point2d p_ = p;
+ point2d q(p_.row() / 2, p_.col() / 2);
+ ima_x2(p) = ima(q);
+ }
+ debug::println(ima_x2);
+
+ // Compute the associated line graph gradient.
+ mln_VAR(g, cplx2d::f_to_g(ima_x2) );
+ debug::println("g:", g);
+
+ // Compute a topological watershed transform on this gradient.
+ morpho::topo_wst<g_t, cplx2d::dbl_neighb2d> tree(g, cplx2d::e2e());
+ tree.go();
+ mln_VAR(w, morpho::topo_watershed(tree));
+ debug::println("w:", w);
+
+ // Computing the set of values of W.
+ // FIXME: Milena may provide something simpler than this.
+ std::set<int_u8> values;
+ mln_piter_(w_t) p2(w.domain());
+ for_all(p2)
+ values.insert (w(p2));
+
+ // Thresholding for each value of W.
+ for (std::set<int_u8>::iterator alpha = values.begin();
+ alpha != values.end(); ++alpha)
+ {
+ mln_VAR(alpha_cc, w | (pw::value(w) > pw::cst(*alpha)));
+ /* FIXME: There should be variants of debug::println allowing
+ the user to pass an optional ``support'' larger than the
+ actual domain of the image. For now, use a low-level routine
+ as a workaround. */
+ std::cout << *alpha << "-cc:" << std::endl;
+ debug::impl::println(w.unmorph_().domain(), alpha_cc);
+ }
+}
diff --git a/milena/sandbox/levillain/theo b/milena/sandbox/levillain/theo
new file mode 120000
index 0000000..7612684
--- /dev/null
+++ b/milena/sandbox/levillain/theo
@@ -0,0 +1 @@
+../theo/esiee/laurent/ismm09
\ No newline at end of file
--
1.6.4.2
1
0
[PATCH 4/8] theo/esiee/laurent/ismm09/cplx2d.hh: Include mln/core/var.hh.
by Roland Levillain 04 Sep '09
by Roland Levillain 04 Sep '09
04 Sep '09
---
milena/sandbox/ChangeLog | 4 ++++
milena/sandbox/theo/esiee/laurent/ismm09/cplx2d.hh | 2 ++
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 7003772..83ef8c3 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -1,5 +1,9 @@
2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
+ * theo/esiee/laurent/ismm09/cplx2d.hh: Include mln/core/var.hh.
+
+2009-09-03 Roland Levillain <roland(a)lrde.epita.fr>
+
Fix the topological watershed transform algorithm (mostly).
* abraham/mln/morpho/topo_wst.hh
diff --git a/milena/sandbox/theo/esiee/laurent/ismm09/cplx2d.hh b/milena/sandbox/theo/esiee/laurent/ismm09/cplx2d.hh
index 35458be..482f3de 100644
--- a/milena/sandbox/theo/esiee/laurent/ismm09/cplx2d.hh
+++ b/milena/sandbox/theo/esiee/laurent/ismm09/cplx2d.hh
@@ -7,6 +7,8 @@
#include <mln/core/image/dmorph/image_if.hh>
#include <mln/core/routine/extend.hh>
+#include <mln/core/var.hh>
+
#include <mln/data/paste.hh>
#include <mln/morpho/gradient.hh>
--
1.6.4.2
1
0