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;
        }
        /// <summary>
        /// function lakes to lab value to find the huedeffirence between them 
        /// based on :http://www.hunterlab.com/kb/hardware/d25ltvalues.pdf
        /// </summary>
        /// <param name="colorToCompare"></param>
        /// <param name="colorToComparePlsBG"></param>
        /// <returns></returns>
        public static double hueDifference(PerceptionLib.Color colorToCompare, PerceptionLib.Color colorToComparePlsBG)
        {
            double HueDifference = 0;
              // difference in L
              double DifferenceInL = (colorToCompare.LA - colorToComparePlsBG.LA) * (colorToCompare.LA - colorToComparePlsBG.LA);

              //color equlidin distance calculation
              double ColorDifference = PerceptionLib.Color.ColorDistanceCalAB(colorToCompare, colorToComparePlsBG);
              ColorDifference = ColorDifference * ColorDifference;

              //diffence in c calculation
              double Ca = (colorToCompare.A * colorToCompare.A) + (colorToCompare.B * colorToCompare.B);
              double colorToCompareC = Math.Sqrt(Ca);
              if (colorToCompareC > 5)
              {
            Ca = (colorToComparePlsBG.A * colorToComparePlsBG.A) + (colorToComparePlsBG.B * colorToComparePlsBG.B);
            double colorToComparePlsBGC = Math.Sqrt(Ca);
            if (colorToComparePlsBGC > 5)
            {
              double DifferenceInC = Math.Abs(colorToCompareC - colorToComparePlsBGC);
              DifferenceInC = DifferenceInC * DifferenceInC;

              HueDifference = Math.Sqrt(ColorDifference - DifferenceInL - DifferenceInC);
              HueDifferenceFlag = 0;
            }
            else
              HueDifferenceFlag = 1;
              }
              else
            HueDifferenceFlag = 1;

              return HueDifference;
        }
        public static double HueAngle(PerceptionLib.Color colorToShow)
        {
            double value1 = colorToShow.B / colorToShow.A;
              //double value1 = -107.9785394 / 78.5459795;

              double radians = Math.Atan(value1);
              double ColorToShowangle = radians * (180 / Math.PI);

              if (ColorToShowangle < 0)
              {
            ColorToShowangle = ColorToShowangle + 360;
              }
              if (ColorToShowangle >= 360)
              {
            ColorToShowangle = ColorToShowangle - 360;
              }

              return ColorToShowangle;
        }
示例#4
0
        /// <summary>
        /// To find which quadrant
        /// </summary>
        /// <param name="colorToShow"></param>
        /// <returns></returns>
        public static ColorRegion ToFindColorRegion(PerceptionLib.Color colorToShow)
        {
            ColorRegion ColorValues = new ColorRegion();

              // to find if its within nuteral region
              //////////////////////////////////////////////////////////////////////////////////////////////////////////////
              double CylinderRadius = 23; //3 JND
              double NuetralL = Convert.ToInt32(colorToShow.LA);

              // nuetral color near the input color
              Color NuetralValue = new Color();
              NuetralValue.LA = NuetralL;
              NuetralValue.A = 0;
              NuetralValue.B = 0;

              double Distacne = ColorDistanceCalAB(colorToShow, NuetralValue);

              if (Distacne <= CylinderRadius)
            ColorValues.NetralValueFlag=0;
              else
            ColorValues.NetralValueFlag=1;

              // to find L region (High or Low)
              //////////////////////////////////////////////////////////////////////////////////////////////////////////////

              //LValueFlag=0 for L Less than 50 and 1 for other wise
              if (NuetralL < 50)
            ColorValues.LValueFlag = 0;
              else
            ColorValues.LValueFlag = 1;

              // to find which Quadrant color belongs to
              //////////////////////////////////////////////////////////////////////////////////////////////////////////////
              // to calculate the hue angle

              /// <summary>
              /// RegionValue=1 then RegionValue =Red-Yellow
              /// RegionValue=2 then RegionValue =Yellow-Green
              /// RegionValue=3 then RegionValue =Green-Cyan
              /// RegionValue=4 then RegionValue =Cyan-Blue
              /// RegionValue=5 then RegionValue =Blue-Magenta
              /// RegionValue=6 then RegionValue =Magenta-Red
              /// RegionValue=6 then RegionValue =ERROR
              /// </summary>
              ///

              RGBValue ColorVal = new RGBValue();
              ColorVal=ToRBGFromLAB(colorToShow);

              if (ColorVal.R >= ColorVal.G && ColorVal.G>= ColorVal.B)
            ColorValues.RegionValue = 1;
              else if (ColorVal.G > ColorVal.R && ColorVal.R >= ColorVal.B)
            ColorValues.RegionValue = 2;
              else if (ColorVal.G >= ColorVal.B && ColorVal.B > ColorVal.R)
            ColorValues.RegionValue = 3;
              else if (ColorVal.B > ColorVal.G && ColorVal.G > ColorVal.R)
            ColorValues.RegionValue = 4;
              else if (ColorVal.B > ColorVal.R && ColorVal.R >= ColorVal.G)
            ColorValues.RegionValue = 5;
              else if (ColorVal.R >= ColorVal.B && ColorVal.B > ColorVal.G)
            ColorValues.RegionValue = 6;
              //error check
              else
            ColorValues.RegionValue = 0;

              //calculation using lab hue formula -- found not working for the Preucil circle
              //double Hue = HueAngle(colorToShow);
              //if (0 <= Hue && Hue < 60)
              //  ColorValues.QuatarentValue = 1;
              //else if(60 <= Hue && Hue < 120)
              //  ColorValues.QuatarentValue = 2;
              //else if (120 <= Hue && Hue < 180)
              //  ColorValues.QuatarentValue = 3;
              //else if (180 <= Hue && Hue < 240)
              //  ColorValues.QuatarentValue = 4;
              //else if (240 <= Hue && Hue < 300)
              //  ColorValues.QuatarentValue = 5;
              //else if (300 <= Hue && Hue < 0)
              //  ColorValues.QuatarentValue = 6;
              //  //error check
              //else
              //  ColorValues.QuatarentValue = 0;

              return ColorValues;
        }
        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;
        }