Compare RGB colors in c#

前端 未结 8 2060
予麋鹿
予麋鹿 2020-11-29 04:38

I\'m trying to find a way to compare two colors to find out how much they are alike. I can\'t seem to find any resources about the subject so I\'m hoping to get some pointer

8条回答
  •  鱼传尺愫
    2020-11-29 05:20

    I've translated the code for DeltaE2000 on Bruce Lindbloom's page into C.

    Here:

         //
         //  deltae2000.c
         //
         //  Translated by Dr Cube on 10/1/16.
         //  Translated to C from this javascript code written by Bruce LindBloom:
         //    http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html
         //    http://www.brucelindbloom.com/javascript/ColorDiff.js
    
         #include 
         #include 
    
         #define Lab2k struct Lab2kStruct
         Lab2k
         {
            float L;
            float a;
            float b;
         };
    
         // function expects Lab where: 0 >= L <=100.0 , -100 >=a <= 100.0  and  -100 >= b <= 100.0
    
         float
         DeltaE2000(Lab2k Lab1,Lab2k Lab2)
         {
            float kL = 1.0;
            float kC = 1.0;
            float kH = 1.0;
            float lBarPrime = 0.5 * (Lab1.L + Lab2.L);
            float c1 = sqrtf(Lab1.a * Lab1.a + Lab1.b * Lab1.b);
            float c2 = sqrtf(Lab2.a * Lab2.a + Lab2.b * Lab2.b);
            float cBar = 0.5 * (c1 + c2);
            float cBar7 = cBar * cBar * cBar * cBar * cBar * cBar * cBar;
            float g = 0.5 * (1.0 - sqrtf(cBar7 / (cBar7 + 6103515625.0)));  /* 6103515625 = 25^7 */
            float a1Prime = Lab1.a * (1.0 + g);
            float a2Prime = Lab2.a * (1.0 + g);
            float c1Prime = sqrtf(a1Prime * a1Prime + Lab1.b * Lab1.b);
            float c2Prime = sqrtf(a2Prime * a2Prime + Lab2.b * Lab2.b);
            float cBarPrime = 0.5 * (c1Prime + c2Prime);
            float h1Prime = (atan2f(Lab1.b, a1Prime) * 180.0) / M_PI;
            float dhPrime; // not initialized on purpose
    
            if (h1Prime < 0.0)
               h1Prime += 360.0;
            float h2Prime = (atan2f(Lab2.b, a2Prime) * 180.0) / M_PI;
            if (h2Prime < 0.0)
               h2Prime += 360.0;
            float hBarPrime = (fabsf(h1Prime - h2Prime) > 180.0) ? (0.5 * (h1Prime + h2Prime + 360.0)) : (0.5 * (h1Prime + h2Prime));
            float t = 1.0 -
            0.17 * cosf(M_PI * (      hBarPrime - 30.0) / 180.0) +
            0.24 * cosf(M_PI * (2.0 * hBarPrime       ) / 180.0) +
            0.32 * cosf(M_PI * (3.0 * hBarPrime +  6.0) / 180.0) -
            0.20 * cosf(M_PI * (4.0 * hBarPrime - 63.0) / 180.0);
            if (fabsf(h2Prime - h1Prime) <= 180.0)
               dhPrime = h2Prime - h1Prime;
            else
               dhPrime = (h2Prime <= h1Prime) ? (h2Prime - h1Prime + 360.0) : (h2Prime - h1Prime - 360.0);
            float dLPrime = Lab2.L - Lab1.L;
            float dCPrime = c2Prime - c1Prime;
            float dHPrime = 2.0 * sqrtf(c1Prime * c2Prime) * sinf(M_PI * (0.5 * dhPrime) / 180.0);
            float sL = 1.0 + ((0.015 * (lBarPrime - 50.0) * (lBarPrime - 50.0)) / sqrtf(20.0 + (lBarPrime - 50.0) * (lBarPrime - 50.0)));
            float sC = 1.0 + 0.045 * cBarPrime;
            float sH = 1.0 + 0.015 * cBarPrime * t;
            float dTheta = 30.0 * expf(-((hBarPrime - 275.0) / 25.0) * ((hBarPrime - 275.0) / 25.0));
            float cBarPrime7 = cBarPrime * cBarPrime * cBarPrime * cBarPrime * cBarPrime * cBarPrime * cBarPrime;
            float rC = sqrtf(cBarPrime7 / (cBarPrime7 + 6103515625.0));
            float rT = -2.0 * rC * sinf(M_PI * (2.0 * dTheta) / 180.0);
            return(sqrtf(
                               (dLPrime / (kL * sL)) * (dLPrime / (kL * sL)) +
                               (dCPrime / (kC * sC)) * (dCPrime / (kC * sC)) +
                               (dHPrime / (kH * sH)) * (dHPrime / (kH * sH)) +
                               (dCPrime / (kC * sC)) * (dHPrime / (kH * sH)) * rT
                          )
             );
         }
    

提交回复
热议问题