Grayscale to Red-Green-Blue (MATLAB Jet) color scale

后端 未结 7 1865
囚心锁ツ
囚心锁ツ 2020-12-12 15:21

I was given a data set that is essentially an image, however each pixel in the image is represented as a value from -1 to 1 inclusive. I am writing an application that need

7条回答
  •  忘掉有多难
    2020-12-12 15:58

    I hope this is what you're looking for:

    double interpolate( double val, double y0, double x0, double y1, double x1 ) {
      return (val-x0)*(y1-y0)/(x1-x0) + y0;
    }
    double blue( double grayscale ) {
      if ( grayscale < -0.33 ) return 1.0;
      else if ( grayscale < 0.33 ) return interpolate( grayscale, 1.0, -0.33, 0.0, 0.33 );
      else return 0.0;
    }
    double green( double grayscale ) {
      if ( grayscale < -1.0 ) return 0.0; // unexpected grayscale value
      if  ( grayscale < -0.33 ) return interpolate( grayscale, 0.0, -1.0, 1.0, -0.33 );
      else if ( grayscale < 0.33 ) return 1.0;
      else if ( grayscale <= 1.0 ) return interpolate( grayscale, 1.0, 0.33, 0.0, 1.0 );
      else return 1.0; // unexpected grayscale value
    }
    double red( double grayscale ) {
      if ( grayscale < -0.33 ) return 0.0;
      else if ( grayscale < 0.33 ) return interpolate( grayscale, 0.0, -0.33, 1.0, 0.33 );
      else return 1.0;
    }
    

    I'm not sure if this scale is 100% identical to the image you linked but it should look very similar.

    UPDATE I've rewritten the code according to the description of MatLab's Jet palette found here

    double interpolate( double val, double y0, double x0, double y1, double x1 ) {
        return (val-x0)*(y1-y0)/(x1-x0) + y0;
    }
    
    double base( double val ) {
        if ( val <= -0.75 ) return 0;
        else if ( val <= -0.25 ) return interpolate( val, 0.0, -0.75, 1.0, -0.25 );
        else if ( val <= 0.25 ) return 1.0;
        else if ( val <= 0.75 ) return interpolate( val, 1.0, 0.25, 0.0, 0.75 );
        else return 0.0;
    }
    
    double red( double gray ) {
        return base( gray - 0.5 );
    }
    double green( double gray ) {
        return base( gray );
    }
    double blue( double gray ) {
        return base( gray + 0.5 );
    }
    

提交回复
热议问题