public static PerceptionLib.CIEXYZ bradford(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.21356178444864, a2 = 0.0147697138198462, a3 = 0.000993117471369376,
            //       b1 = -0.00599909318707803, b2 = 1.23251321283751, b3 = 0.000563974739215607,
            //       c1 = -0.0229710501639069, c2 = 0.109301363961475, c3 = 1.22235691025888;

              //double a1 = 3.680878397355853, a2 = -0.125561420765456, a3 = -0.031693982497234,

              //        b1 = 0.130942826233715, b2 = 3.378993619275563, b3 = -0.017998480571422,

              //        c1 = -0.455826584037247, c2 = -1.394610457951430, c3 = 3.596564478605494;

            //SMALL
              //double a1 = 3.817540589912686, a2 = -0.149043618721286, a3 = -0.044288984594160,
              //    b1 = 0.178356377375283, b2 = 3.418828936965993, b3 = -0.025150970813326,
              //    c1 = -0.727790647275128, c2 = -1.788890974311670, c3 = 3.714721548607603;

              double a1 = 2.539646708493598, a2 = -0.069844059176038, a3 = 0.012712286366642,
               b1 = -0.031485757614926, b2 = 2.555427511744631, b3 = 0.007219094009670,
               c1 = 0.596124927992591, c2 = -0.168411491698087, c3 = 2.505201559076051;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0,0,0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return colorObject;
        }
Example #2
0
        public static PerceptionLib.CIEXYZ XYZScaling(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.23020670195830, a2 = 0, a3 = 0,
            //       b1 = 0, b2 = 1.22740048850539, b3 = 0,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;

            //double a1 = 3.495660169179846, a2 = 0, a3 = 0,
            //         b1 = 0, b2 = 3.474635163307853, b3 = 0,
            //         c1 = 0, c2 = 0, c3 = 2.426091800356506;


            //double a1 = 3.578954106607625, a2 = 0, a3 = 0,
            //         b1 = 0, b2 = 3.543812149605574, b3 = 0,
            //         c1 = 0, c2 = 0, c3 = 2.263524539896431;



            double a1 = 2.479935501377641, a2 = 0, a3 = 0,
                   b1 = 0, b2 = 2.531639160407189, b3 = 0,
                   c1 = 0, c2 = 0, c3 = 2.9429269532031291;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #3
0
        public static PerceptionLib.CIEXYZ bradford(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.21356178444864, a2 = 0.0147697138198462, a3 = 0.000993117471369376,
            //       b1 = -0.00599909318707803, b2 = 1.23251321283751, b3 = 0.000563974739215607,
            //       c1 = -0.0229710501639069, c2 = 0.109301363961475, c3 = 1.22235691025888;

            //double a1 = 3.680878397355853, a2 = -0.125561420765456, a3 = -0.031693982497234,


            //        b1 = 0.130942826233715, b2 = 3.378993619275563, b3 = -0.017998480571422,


            //        c1 = -0.455826584037247, c2 = -1.394610457951430, c3 = 3.596564478605494;

            //SMALL
            //double a1 = 3.817540589912686, a2 = -0.149043618721286, a3 = -0.044288984594160,
            //    b1 = 0.178356377375283, b2 = 3.418828936965993, b3 = -0.025150970813326,
            //    c1 = -0.727790647275128, c2 = -1.788890974311670, c3 = 3.714721548607603;

            double a1 = 2.539646708493598, a2 = -0.069844059176038, a3 = 0.012712286366642,
                   b1 = -0.031485757614926, b2 = 2.555427511744631, b3 = 0.007219094009670,
                   c1 = 0.596124927992591, c2 = -0.168411491698087, c3 = 2.505201559076051;


            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #4
0
        public static int MatchWithBinned(PerceptionLib.Color ColorToCompensate, DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int    BinNUmber = 0;
            int    i;
            double closestColor = double.MaxValue;

            // double closestColorValue = double.MaxValue;
            //double angleDifference = double.MaxValue;


            PerceptionLib.Color  colorToCompare    = new PerceptionLib.Color();
            PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

            PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
            PerceptionLib.Color  colorToComparePlsBG     = new PerceptionLib.Color();

            for (int index = 0; index < bin.Rows.Count; index++)
            {
                i = index;

                colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
                colorToCompare.A  = Convert.ToDouble(bin.Rows[index][10].ToString());
                colorToCompare.B  = Convert.ToDouble(bin.Rows[index][11].ToString());

                double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);
                if (distance >= closestColor)
                {
                    continue;
                }

                //ClosestL = colorToCompare.LA;
                //ClosestA = colorToCompare.A;
                //ClosestB = colorToCompare.B;

                //int BinNUmber1 = index;
                //colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
                //colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
                //colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

                //colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
                //colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

                //double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
                //if (ColorDistance >= closestColorValue)
                //  continue;


                //closestColorValue = ColorDistance;
                closestColor = distance;


                closestColorInsideTheBin = distance;
                //closestColorOnAddition = ColorDistance;
                //HueAngeDifference = angleDifference;
                BinNUmber = index;
            }
            return(BinNUmber);
        }
Example #5
0
        public static int MatchWithBinnedColorsBasedOn3D(PerceptionLib.Color ColorToCompensate, DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int    BinNUmber = 0;
            int    i;
            double closestColor      = double.MaxValue;
            double closestColorValue = double.MaxValue;

            PerceptionLib.Color colorToCompare = new PerceptionLib.Color();

            double l, a, b;

            PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

            PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
            PerceptionLib.Color  colorToComparePlsBG     = new PerceptionLib.Color();

            Point3D cX      = new Point3D();
            Point3D cXPrime = new Point3D(ColorToCompensate.LA, ColorToCompensate.A, ColorToCompensate.B);

            for (int index = 0; index < bin.Rows.Count; index++)
            {
                i = index;
                l = Convert.ToDouble(bin.Rows[index][9].ToString());
                a = Convert.ToDouble(bin.Rows[index][10].ToString());
                b = Convert.ToDouble(bin.Rows[index][11].ToString());


                Point3D  colorInScreen = new Point3D(l, a, b);
                Vector3D distance      = cXPrime - colorInScreen;


                if (distance.Length >= closestColor)
                {
                    continue;
                }

                colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
                colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
                colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

                colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
                colorToComparePlsBG     = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

                double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
                if (ColorDistance >= closestColorValue)
                {
                    continue;
                }

                closestColorValue = ColorDistance;
                cX           = colorInScreen;
                closestColor = distance.Length;
                BinNUmber    = index;
            }

            return(BinNUmber);
        }
Example #6
0
        public static PerceptionLib.CIEXYZ XYZScaling(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.23020670195830, a2 = 0, a3 = 0,
            //       b1 = 0, b2 = 1.22740048850539, b3 = 0,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;

            double a1 = 3.495660169179846, a2 = 0, a3 = 0,
                   b1 = 0, b2 = 3.474635163307853, b3 = 0,
                   c1 = 0, c2 = 0, c3 = 2.426091800356506;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #7
0
        public static PerceptionLib.CIEXYZ bradford(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.21356178444864, a2 = 0.0147697138198462, a3 = 0.000993117471369376,
            //       b1 = -0.00599909318707803, b2 = 1.23251321283751, b3 = 0.000563974739215607,
            //       c1 = -0.0229710501639069, c2 = 0.109301363961475, c3 = 1.22235691025888;

            double a1 = 3.680878397355853, a2 = -0.125561420765456, a3 = -0.031693982497234,


                   b1 = 0.130942826233715, b2 = 3.378993619275563, b3 = -0.017998480571422,


                   c1 = -0.455826584037247, c2 = -1.394610457951430, c3 = 3.596564478605494;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #8
0
        public static int MatchWithBinnedColors_noSubration(DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int BinNUmber = 0;

            for (int k = 0; k < 1001; k++)
            {
                int i;

                double closestColorValue = double.MaxValue;
                PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

                PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
                PerceptionLib.Color  colorToComparePlsBG     = new PerceptionLib.Color();

                for (int index = 0; index < bin.Rows.Count; index++)
                {
                    i = index;

                    int BinNUmber1 = index;
                    colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
                    colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
                    colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

                    colorToComparePlsBG_XYZ = ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
                    colorToComparePlsBG     = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

                    double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
                    if (ColorDistance >= closestColorValue)
                    {
                        continue;
                    }

                    closestColorValue      = ColorDistance;
                    closestColorOnAddition = ColorDistance;

                    BinNUmber = index;
                    string a = bin.Rows[index][1].ToString();
                }
            }
            return(BinNUmber);
        }
Example #9
0
        public static PerceptionLib.CIEXYZ VonKries(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.22406776615540, a2 = -0.0114965173376411, a3 = 0.0169498465470608,
            //       b1 = -0.00126281088883867, b2 = 1.22833797178289, b3 = 0.000254513376677992,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;



            double a1 = 3.563498356215192, a2 = 0.294040219362152, a3 = -0.229656814142911,


                   b1 = 0.032298232574425, b2 = 3.454281611478240, b3 = -0.006515457264759,

                   c1 = 0, c2 = 0, c3 = 2.426091800356506;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #10
0
        public static PerceptionLib.CIEXYZ VonKries(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.22406776615540, a2 = -0.0114965173376411, a3 = 0.0169498465470608,
            //       b1 = -0.00126281088883867, b2 = 1.22833797178289, b3 = 0.000254513376677992,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;



            //double a1 = 3.563498356215192, a2 = 0.294040219362152, a3 = -0.229656814142911,


            //         b1 = 0.032298232574425, b2 = 3.454281611478240, b3 = -0.006515457264759,

            //         c1 = 0, c2 = 0, c3 = 2.426091800356506;

            //double a1 = 3.666332229286743, a2 = 0.400609336658032, a3 = -0.283244448162549,


            //         b1 = 0.044004094252600, b2 = 3.517532014962554, b3 = -0.0088777160091205,

            //         c1 = 0, c2 = 0, c3 = 2.263524539896431;


            double a1 = 2.501761061219592, a2 = -0.104612026262624, a3 = 0.089077045960337,


                   b1 = -0.011490889109121, b2 = 2.540617599258928, b3 = 0.002317820322725,

                   c1 = 0, c2 = 0, c3 = 2.942926953203129;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return(colorObject);
        }
Example #11
0
        /// <summary>
        /// funtion to calcullate bin number
        /// </summary>
        /// <param name="ColorToCompensate"></param>
        /// <param name="bin"></param>
        /// <returns></returns>
        public static int MatchWithBinnedColors(PerceptionLib.Color ColorToCompensate, DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int    BinNUmber = 0;
            int    i;
            double closestColor      = double.MaxValue;
            double closestColorValue = double.MaxValue;
            double angleDifference   = double.MaxValue;


            PerceptionLib.Color  colorToCompare    = new PerceptionLib.Color();
            PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

            PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
            PerceptionLib.Color  colorToComparePlsBG     = new PerceptionLib.Color();

            for (int index = 0; index < bin.Rows.Count; index++)
            {
                i = index;

                colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
                colorToCompare.A  = Convert.ToDouble(bin.Rows[index][10].ToString());
                colorToCompare.B  = Convert.ToDouble(bin.Rows[index][11].ToString());

                double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);
                if (distance >= closestColor)
                {
                    continue;
                }

                ClosestL = colorToCompare.LA;
                ClosestA = colorToCompare.A;
                ClosestB = colorToCompare.B;

                int BinNUmber1 = index;
                colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
                colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
                colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

                colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
                colorToComparePlsBG     = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

                double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
                if (ColorDistance >= closestColorValue)
                {
                    continue;
                }


                closestColorValue = ColorDistance;
                closestColor      = distance;


                closestColorInsideTheBin = distance;
                closestColorOnAddition   = ColorDistance;
                HueAngeDifference        = angleDifference;
                BinNUmber = index;
            }

            //if (closestColorOnAddition >= 5)
            //{
            //  double LA = Convert.ToDouble(bin.Rows[BinNUmber][9].ToString());
            //  double A = Convert.ToDouble(bin.Rows[BinNUmber][10].ToString());
            //  double B = Convert.ToDouble(bin.Rows[BinNUmber][11].ToString());

            //  for (int index = 0; index < bin.Rows.Count; index++)
            //  {
            //    colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
            //    colorToCompare.A = Convert.ToDouble(bin.Rows[index][10].ToString());
            //    colorToCompare.B = Convert.ToDouble(bin.Rows[index][11].ToString());

            //    if (colorToCompare.LA <= LA + 4 & colorToCompare.LA >= LA - 4)
            //    {
            //      colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
            //      colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
            //      colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

            //      colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
            //      colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

            //      double colorToShowAngle = HueAngle(ColorToShow);
            //      double colorToCompareangle = HueAngle(colorToComparePlsBG);

            //      double angleDiff = Math.Abs(colorToShowAngle - colorToCompareangle);
            //      if (angleDiff >= angleDifference)
            //        continue;

            //      double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
            //      double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);

            //      angleDifference = angleDiff;

            //      closestColorValue = ColorDistance;
            //      closestColor = distance;


            //      closestColorInsideTheBin = distance;
            //      closestColorOnAddition = ColorDistance;
            //      HueAngeDifference = angleDifference;
            //      BinNUmber = index;
            //    }
            //  }
            //}

            //if (closestColorOnAddition >= 5)
            //{
            //  double LA = Convert.ToDouble(bin.Rows[BinNUmber][9].ToString());
            //  double A = Convert.ToDouble(bin.Rows[BinNUmber][10].ToString());
            //  double B = Convert.ToDouble(bin.Rows[BinNUmber][11].ToString());

            //  for (int index = 0; index < bin.Rows.Count; index++)
            //  {
            //    colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
            //    colorToCompare.A = Convert.ToDouble(bin.Rows[index][10].ToString());
            //    colorToCompare.B = Convert.ToDouble(bin.Rows[index][11].ToString());

            //    if (colorToCompare.LA <= LA + 4 & colorToCompare.LA >= LA - 4)
            //    {
            //      colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
            //      colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
            //      colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

            //      colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
            //      colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

            //      double hueDiff = hueDifference(colorToCompare, colorToComparePlsBG);
            //      if (HueDifferenceFlag != 1)
            //      {
            //        if (hueDiff >= angleDifference)
            //          continue;


            //        double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
            //        double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);

            //        angleDifference = hueDiff;

            //        closestColorValue = ColorDistance;
            //        closestColor = distance;


            //        closestColorInsideTheBin = distance;
            //        closestColorOnAddition = ColorDistance;
            //        HueAngeDifference = angleDifference;
            //        BinNUmber = index;
            //      }

            //    }
            //  }

            //}
            return(BinNUmber);
        }
        public static PerceptionLib.CIEXYZ XYZScaling(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.23020670195830, a2 = 0, a3 = 0,
            //       b1 = 0, b2 = 1.22740048850539, b3 = 0,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;

              //double a1 = 3.495660169179846, a2 = 0, a3 = 0,
              //         b1 = 0, b2 = 3.474635163307853, b3 = 0,
              //         c1 = 0, c2 = 0, c3 = 2.426091800356506;

              //double a1 = 3.578954106607625, a2 = 0, a3 = 0,
              //         b1 = 0, b2 = 3.543812149605574, b3 = 0,
              //         c1 = 0, c2 = 0, c3 = 2.263524539896431;

              double a1 = 2.479935501377641, a2 = 0, a3 = 0,
                   b1 = 0, b2 = 2.531639160407189, b3 = 0,
                   c1 = 0, c2 = 0, c3 = 2.9429269532031291;

            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return colorObject;
        }
        public static PerceptionLib.CIEXYZ VonKries(PerceptionLib.CIEXYZ ColorIntended)
        {
            //double a1 = 1.22406776615540, a2 = -0.0114965173376411, a3 = 0.0169498465470608,
            //       b1 = -0.00126281088883867, b2 = 1.22833797178289, b3 = 0.000254513376677992,
            //       c1 = 0, c2 = 0, c3 = 1.30801388705357;

              //double a1 = 3.563498356215192, a2 = 0.294040219362152, a3 = -0.229656814142911,

              //         b1 = 0.032298232574425, b2 = 3.454281611478240, b3 = -0.006515457264759,

              //         c1 = 0, c2 = 0, c3 = 2.426091800356506;

              //double a1 = 3.666332229286743, a2 = 0.400609336658032, a3 = -0.283244448162549,

              //         b1 = 0.044004094252600, b2 = 3.517532014962554, b3 = -0.0088777160091205,

              //         c1 = 0, c2 = 0, c3 = 2.263524539896431;

              double a1 = 2.501761061219592, a2 = -0.104612026262624, a3 = 0.089077045960337,

                   b1 = -0.011490889109121, b2 = 2.540617599258928, b3 = 0.002317820322725,

                   c1 = 0, c2 = 0, c3 = 2.942926953203129;
            PerceptionLib.CIEXYZ colorObject = new PerceptionLib.CIEXYZ(0, 0, 0);
            colorObject.X = (a1 * ColorIntended.X) + (a2 * ColorIntended.Y) + (a3 * ColorIntended.Z);
            colorObject.Y = (b1 * ColorIntended.X) + (b2 * ColorIntended.Y) + (b3 * ColorIntended.Z);
            colorObject.Z = (c1 * ColorIntended.X) + (c2 * ColorIntended.Y) + (c3 * ColorIntended.Z);
            return colorObject;
        }
        public static int MatchWithBinnedColors_noSubration(DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int BinNUmber = 0;
              for (int k = 0; k < 1001; k++)
              {

            int i;

            double closestColorValue = double.MaxValue;
            PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

            PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
            PerceptionLib.Color colorToComparePlsBG = new PerceptionLib.Color();

            for (int index = 0; index < bin.Rows.Count; index++)
            {
              i = index;

              int BinNUmber1 = index;
              colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
              colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
              colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

              colorToComparePlsBG_XYZ = ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
              colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

              double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
              if (ColorDistance >= closestColorValue)
                continue;

              closestColorValue = ColorDistance;
              closestColorOnAddition = ColorDistance;

              BinNUmber = index;
              string a = bin.Rows[index][1].ToString();
            }
              }
              return BinNUmber;
        }
        /// <summary>
        /// funtion to calcullate bin number
        /// </summary>
        /// <param name="ColorToCompensate"></param>
        /// <param name="bin"></param>
        /// <returns></returns>
        public static int MatchWithBinnedColors(PerceptionLib.Color ColorToCompensate, DataTable bin, PerceptionLib.CIEXYZ BG, PerceptionLib.Color ColorToShow)
        {
            int BinNUmber = 0;
              int i;
              double closestColor = double.MaxValue;
              double closestColorValue = double.MaxValue;
              double angleDifference = double.MaxValue;

              PerceptionLib.Color colorToCompare = new PerceptionLib.Color();
              PerceptionLib.CIEXYZ colorToCompareXYZ = new PerceptionLib.CIEXYZ(0, 0, 0);

              PerceptionLib.CIEXYZ colorToComparePlsBG_XYZ = new PerceptionLib.CIEXYZ(0, 0, 0);
              PerceptionLib.Color colorToComparePlsBG = new PerceptionLib.Color();

              for (int index = 0; index < bin.Rows.Count; index++)
              {
            i = index;

            colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
            colorToCompare.A = Convert.ToDouble(bin.Rows[index][10].ToString());
            colorToCompare.B = Convert.ToDouble(bin.Rows[index][11].ToString());

            double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);
            if (distance >= closestColor)
              continue;

            ClosestL = colorToCompare.LA;
            ClosestA = colorToCompare.A;
            ClosestB = colorToCompare.B;

            int BinNUmber1 = index;
            colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
            colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
            colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

            colorToComparePlsBG_XYZ = ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
            colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

            double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
            if (ColorDistance >= closestColorValue)
              continue;

            closestColorValue = ColorDistance;
            closestColor = distance;

            closestColorInsideTheBin = distance;
            closestColorOnAddition = ColorDistance;
            HueAngeDifference = angleDifference;
            BinNUmber = index;

              }

              //if (closestColorOnAddition >= 5)
              //{
              //  double LA = Convert.ToDouble(bin.Rows[BinNUmber][9].ToString());
              //  double A = Convert.ToDouble(bin.Rows[BinNUmber][10].ToString());
              //  double B = Convert.ToDouble(bin.Rows[BinNUmber][11].ToString());

              //  for (int index = 0; index < bin.Rows.Count; index++)
              //  {
              //    colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
              //    colorToCompare.A = Convert.ToDouble(bin.Rows[index][10].ToString());
              //    colorToCompare.B = Convert.ToDouble(bin.Rows[index][11].ToString());

              //    if (colorToCompare.LA <= LA + 4 & colorToCompare.LA >= LA - 4)
              //    {
              //      colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
              //      colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
              //      colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

              //      colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
              //      colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

              //      double colorToShowAngle = HueAngle(ColorToShow);
              //      double colorToCompareangle = HueAngle(colorToComparePlsBG);

              //      double angleDiff = Math.Abs(colorToShowAngle - colorToCompareangle);
              //      if (angleDiff >= angleDifference)
              //        continue;

              //      double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
              //      double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);

              //      angleDifference = angleDiff;

              //      closestColorValue = ColorDistance;
              //      closestColor = distance;

              //      closestColorInsideTheBin = distance;
              //      closestColorOnAddition = ColorDistance;
              //      HueAngeDifference = angleDifference;
              //      BinNUmber = index;
              //    }
              //  }
              //}

              //if (closestColorOnAddition >= 5)
              //{
              //  double LA = Convert.ToDouble(bin.Rows[BinNUmber][9].ToString());
              //  double A = Convert.ToDouble(bin.Rows[BinNUmber][10].ToString());
              //  double B = Convert.ToDouble(bin.Rows[BinNUmber][11].ToString());

              //  for (int index = 0; index < bin.Rows.Count; index++)
              //  {
              //    colorToCompare.LA = Convert.ToDouble(bin.Rows[index][9].ToString());
              //    colorToCompare.A = Convert.ToDouble(bin.Rows[index][10].ToString());
              //    colorToCompare.B = Convert.ToDouble(bin.Rows[index][11].ToString());

              //    if (colorToCompare.LA <= LA + 4 & colorToCompare.LA >= LA - 4)
              //    {
              //      colorToCompareXYZ.X = Convert.ToDouble(bin.Rows[index][12].ToString());
              //      colorToCompareXYZ.Y = Convert.ToDouble(bin.Rows[index][13].ToString());
              //      colorToCompareXYZ.Z = Convert.ToDouble(bin.Rows[index][14].ToString());

              //      colorToComparePlsBG_XYZ = Util.ColorSpaceConverter.AddXYZ(colorToCompareXYZ, BG);
              //      colorToComparePlsBG = PerceptionLib.Color.ToLUV(colorToComparePlsBG_XYZ);

              //      double hueDiff = hueDifference(colorToCompare, colorToComparePlsBG);
              //      if (HueDifferenceFlag != 1)
              //      {
              //        if (hueDiff >= angleDifference)
              //          continue;

              //        double ColorDistance = PerceptionLib.Color.ColorDistanceCalAB(colorToComparePlsBG, ColorToShow);
              //        double distance = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, ColorToCompensate);

              //        angleDifference = hueDiff;

              //        closestColorValue = ColorDistance;
              //        closestColor = distance;

              //        closestColorInsideTheBin = distance;
              //        closestColorOnAddition = ColorDistance;
              //        HueAngeDifference = angleDifference;
              //        BinNUmber = index;
              //      }

              //    }
              //  }

              //}
              return BinNUmber;
        }