1

ここで利用可能な式を使用して、XYZ値をLAB*に変換しようとしています。

問題は、数式を実行すると、3つの変数var_X、var_Y、var_Zの出力が常に1.00になることです。

を使用して値をwolframalphaに入れると、実際に(おそらく)正しい出力が得られます(リンクの例は、この質問の下部にあるログに示されているvar_Zの入力です)。

どこが間違っているのかを見つけるのを手伝ってくれませんか。

これが私のコードです:

-(NSArray*)convertXYZtoLABSpaceWithLABArray:(NSArray*)labArray{
    double var_X = [[labArray objectAtIndex:0] doubleValue] /  95.047;
    double var_Y = [[labArray objectAtIndex:1] doubleValue] /  100.000;
    double var_Z = [[labArray objectAtIndex:2] doubleValue] /  108.883;

    NSLog(@"convertXYZtoLAB... var_X: %f var_Y: %f var_Z: %f", var_X, var_Y, var_Z);

    if ( var_X > 0.008856 ){
        var_X = pow(var_X, ( 1/3 ));   
    }else{                    
        var_X = ( 7.787 * var_X ) + ( 16 / 116 );
    }

    if ( var_Y > 0.008856 ){
        var_Y = pow(var_Y, ( 1/3 ));   
    }else{
        var_Y = ( 7.787 * var_Y ) + ( 16 / 116 );   
    }

    if ( var_Z > 0.008856 ){
        var_Z = pow(var_Z, ( 1/3 ));   
    }else{
        var_Z = ( 7.787 * var_Z ) + ( 16 / 116 );   
    }

    NSLog(@"convertXYZtoLAB... var_X: %f var_Y: %f var_Z: %f", var_X, var_Y, var_Z);

    NSNumber *l,*a,*b;

    l = [NSNumber numberWithDouble:( 116 * var_Y ) - 16];
    a = [NSNumber numberWithDouble:500 * ( var_X - var_Y )];
    b = [NSNumber numberWithDouble:200 * ( var_Y - var_Z )];

    return([NSArray arrayWithObjects:l,a,b, nil]);

}

そして、これがメソッドの2つのログポイントでの数式の入力/出力です。

convertXYZtoLAB... var_X: 0.345393 var_Y: 0.502066 var_Z: 0.308145
convertXYZtoLAB... var_X: 1.000000 var_Y: 1.000000 var_Z: 1.000000
4

1 に答える 1

3

浮動小数点除算ではなく整数除算を取得している可能性があります。1.0/3の代わりに1/3試し てください1/3。整数演算ではゼロに切り捨てられます。

于 2012-04-19T00:49:22.057 に答える