菜鸟教程小白 发表于 2022-12-12 18:01:23

ios - 将 Lab 颜色转换为 RGB


                                            <p><p>我正在尝试将 Lab 颜色转换为 RGB。作为此转换的示例,Photoshop
转换</p>

<pre><code>L= 100, a = 0, b = 127
</code></pre>

<p>进入</p>

<pre><code>R=255, G=252, B=0.
</code></pre>

<p>这个颜色是亮黄色的。</p>

<p>我编写了以下转换例程(C/Objective C)。然而,有些东西
是不正确的。代码将输出</p>

<pre><code>XYZ = 100.000000 100.000000 4.862713
RGB = 163.908401 90.755638 -13.093634
</code></pre>

<p>这里的 RGB 结果和 Photoshop 的 RGB 之间的不匹配似乎相当大。
负蓝色分量也是个问题。</p>

<p>任何关于如何更正以下代码的想法将不胜感激?或者,任何其他用于将 Lab 转换为 RGB 的算法/公式/伪代码?谢谢。</p>

<p>代码:</p>

<pre><code>/*
*   See Wikipedia artice on Lab color space
*
*    http://en.wikipedia.org/wiki/Lab_color_space
*
*/
CGFloat fInv (CGFloat t) {

   CGFloat T0 = (CGFloat) 6.0f/29.0f;

   if (t &gt; T0) {
       return t*t*t;
   }

   return 3.0 * T0 * T0 * (t - 4.0f/29.0f);

}


int test() {

    //
    //Bright yellow test
    //
    CGFloat Ls = 100.0f;
    CGFloat as = 0.0f;
    CGFloat bs = 127.0f;

    //
    //Reference white point (ad hoc)
    //
    CGFloat Xn = 100;
    CGFloat Yn = 100;   
    CGFloat Zn = 100;

    //
    //   Taken Wikipedia (see above)
    //
    CGFloat X =Xn * fInv(1/116.0f * (Ls + 16.0f) + 1/500.0f * as);
    CGFloat Y =Yn * fInv(1/116.0f * (Ls + 16.0f));
    CGFloat Z =Zn * fInv(1/116.0f * (Ls + 16.0f) - 1/200.0f * bs);

    NSLog(@&#34; XYZ = %f %f %f&#34;, X, Y, Z);

    //
    //
    //   XYZ to RGB transfomration using AppleRGB. Taken from
    //
    //       http://brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html
    //
    //
    CGFloat r =2.9515373 * X- 1.2894116 * Y - 0.4738445 * Z;
    CGFloat g = -1.0851093 * X+ 1.9908566 * Y + 0.0372026 * Z;
    CGFloat b =0.0854934 * X- 0.2694964 * Y + 1.0912975 * Z;

    NSLog(@&#34; RGB = %f %f %f&#34;, r, g, b);

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>尝试实现 <a href="http://www.easyrgb.com/index.php?X=MATH&amp;H=08#text8" rel="noreferrer noopener nofollow">this site</a> 中的公式.我刚刚实现了 RGB->Lab(通过 XYZ),它工作正常。</p>

<p>C++ 代码:</p>

<pre><code>// using http://www.easyrgb.com/index.php?X=MATH&amp;H=01#text1
void rgb2lab( float R, float G, float B, float &amp; l_s, float &amp;a_s, float &amp;b_s )
{
    float var_R = R/255.0;
    float var_G = G/255.0;
    float var_B = B/255.0;


    if ( var_R &gt; 0.04045 ) var_R = pow( (( var_R + 0.055 ) / 1.055 ), 2.4 );
    else                   var_R = var_R / 12.92;
    if ( var_G &gt; 0.04045 ) var_G = pow( ( ( var_G + 0.055 ) / 1.055 ), 2.4);
    else                   var_G = var_G / 12.92;
    if ( var_B &gt; 0.04045 ) var_B = pow( ( ( var_B + 0.055 ) / 1.055 ), 2.4);
    else                   var_B = var_B / 12.92;

    var_R = var_R * 100.;
    var_G = var_G * 100.;
    var_B = var_B * 100.;

    //Observer. = 2°, Illuminant = D65
    float X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
    float Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
    float Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;


    float var_X = X / 95.047 ;         //ref_X =95.047   Observer= 2°, Illuminant= D65
    float var_Y = Y / 100.000;          //ref_Y = 100.000
    float var_Z = Z / 108.883;          //ref_Z = 108.883

    if ( var_X &gt; 0.008856 ) var_X = pow(var_X , ( 1./3. ) );
    else                  var_X = ( 7.787 * var_X ) + ( 16. / 116. );
    if ( var_Y &gt; 0.008856 ) var_Y = pow(var_Y , ( 1./3. ));
    else                  var_Y = ( 7.787 * var_Y ) + ( 16. / 116. );
    if ( var_Z &gt; 0.008856 ) var_Z = pow(var_Z , ( 1./3. ));
    else                  var_Z = ( 7.787 * var_Z ) + ( 16. / 116. );

    l_s = ( 116. * var_Y ) - 16.;
    a_s = 500. * ( var_X - var_Y );
    b_s = 200. * ( var_Y - var_Z );


}

//http://www.easyrgb.com/index.php?X=MATH&amp;H=01#text1
void lab2rgb( float l_s, float a_s, float b_s, float&amp; R, float&amp; G, float&amp; B )
{
    float var_Y = ( l_s + 16. ) / 116.;
    float var_X = a_s / 500. + var_Y;
    float var_Z = var_Y - b_s / 200.;

    if ( pow(var_Y,3) &gt; 0.008856 ) var_Y = pow(var_Y,3);
    else                      var_Y = ( var_Y - 16. / 116. ) / 7.787;
    if ( pow(var_X,3) &gt; 0.008856 ) var_X = pow(var_X,3);
    else                      var_X = ( var_X - 16. / 116. ) / 7.787;
    if ( pow(var_Z,3) &gt; 0.008856 ) var_Z = pow(var_Z,3);
    else                      var_Z = ( var_Z - 16. / 116. ) / 7.787;

    float X = 95.047 * var_X ;    //ref_X =95.047   Observer= 2°, Illuminant= D65
    float Y = 100.000 * var_Y;   //ref_Y = 100.000
    float Z = 108.883 * var_Z ;    //ref_Z = 108.883


    var_X = X / 100. ;       //X from 0 to95.047      (Observer = 2°, Illuminant = D65)
    var_Y = Y / 100. ;       //Y from 0 to 100.000
    var_Z = Z / 100. ;      //Z from 0 to 108.883

    float var_R = var_X *3.2406 + var_Y * -1.5372 + var_Z * -0.4986;
    float var_G = var_X * -0.9689 + var_Y *1.8758 + var_Z *0.0415;
    float var_B = var_X *0.0557 + var_Y * -0.2040 + var_Z *1.0570;

    if ( var_R &gt; 0.0031308 ) var_R = 1.055 * pow(var_R , ( 1 / 2.4 ))- 0.055;
    else                     var_R = 12.92 * var_R;
    if ( var_G &gt; 0.0031308 ) var_G = 1.055 * pow(var_G , ( 1 / 2.4 ) )- 0.055;
    else                     var_G = 12.92 * var_G;
    if ( var_B &gt; 0.0031308 ) var_B = 1.055 * pow( var_B , ( 1 / 2.4 ) ) - 0.055;
    else                     var_B = 12.92 * var_B;

    R = var_R * 255.;
    G = var_G * 255.;
    B = var_B * 255.;

}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将 Lab 颜色转换为 RGB,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/7880264/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/7880264/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将 Lab 颜色转换为 RGB