package pl.wroc.pwr.image.converter; import pl.wroc.pwr.IOperator; import pl.wroc.pwr.image.IRGBImage; import pl.wroc.pwr.image.IXYZImage; import pl.wroc.pwr.image.model.XYZImage; public class RGBtoXYZConverter implements IOperator< IXYZImage > { /** * */ private static final long serialVersionUID = 5957943180638886532L; private IRGBImage inputImage; private IXYZImage outputImage; public RGBtoXYZConverter( IRGBImage image ) { this.inputImage = image; } public void setImage( IRGBImage image ) { this.inputImage = image; } public IXYZImage getResult( ) { return this.outputImage; } public IXYZImage apply( ) { this.outputImage = new XYZImage( this.inputImage.getSize( ) ); for ( int i = 0; i < this.inputImage.getRedChannel( ).getMaxIndex( ); i++ ) { float var_R = this.inputImage.getRedChannel( ).getValue( i ); float var_G = this.inputImage.getGreenChannel( ).getValue( i ); float var_B = this.inputImage.getBlueChannel( ).getValue( i ); if ( var_R > 0.04045f ) { var_R = (float)Math.pow( ( ( var_R + 0.055f ) / 1.055f ), 2.4f ); } else { var_R = var_R / 12.92f; } if ( var_G > 0.04045f ) { var_G = (float)Math.pow( ( ( var_G + 0.055f ) / 1.055f ), 2.4f ); } else { var_G = var_G / 12.92f; } if ( var_B > 0.04045f ) { var_B = (float)Math.pow( ( ( var_B + 0.055f ) / 1.055f ), 2.4f ); } else { var_B = var_B / 12.92f; } var_R = var_R * 100; var_G = var_G * 100; var_B = var_B * 100; // Observer. = 2°, Illuminant = D65 float X = var_R * 0.4124f + var_G * 0.3576f + var_B * 0.1805f; float Y = var_R * 0.2126f + var_G * 0.7152f + var_B * 0.0722f; float Z = var_R * 0.0193f + var_G * 0.1192f + var_B * 0.9505f; this.outputImage.getXChannel( ).setValue( i, X ); this.outputImage.getYChannel( ).setValue( i, Y ); this.outputImage.getZChannel( ).setValue( i, Z ); } return this.getResult( ); } }