package pl.wroc.pwr.image.converter; import pl.wroc.pwr.IOperator1P; import pl.wroc.pwr.image.IHSVImage; import pl.wroc.pwr.image.IRGBImage; import pl.wroc.pwr.image.model.HSVImage; public class RGBtoHSVConverter implements IOperator1P { /** * */ private static final long serialVersionUID = 74546847291827861L; public IHSVImage apply(IRGBImage inputImage) { IHSVImage outputImage = new HSVImage( inputImage.getSize( ) ); for ( int i = 0; i < inputImage.getRedChannel( ).getMaxIndex( ); i++ ) { float saturation; float hue; float brightness; float red = inputImage.getRedChannel( ).getValue( i ); float green = inputImage.getGreenChannel( ).getValue( i ); float blue = inputImage.getBlueChannel( ).getValue( i ); float minVal = Math.min( red, Math.min( green, blue ) ); brightness = Math.max( red, Math.max( green, blue ) ); float delta = brightness - minVal; if ( brightness == 0.0f ) { saturation = 0; } else { saturation = delta / brightness; } if ( saturation == 0.0f ) { hue = 0; } else { if ( red == brightness ) { hue = ( 1.0f / 6.0f ) * ( green - blue ) / delta; } else { if ( green == brightness ) { hue = ( 2.0f / 6.0f ) + ( 1.0f / 6.0f ) * ( blue - red ) / delta; } else { hue = ( 4.0f / 6.0f ) + ( 1.0f / 6.0f ) * ( red - green ) / delta; } } } if ( hue < 0.0f ) { hue = hue + 1.0f; } outputImage.getHueChannel( ).setValue( i, hue ); outputImage.getSaturationChannel( ).setValue( i, saturation ); outputImage.getBrightnessChannel( ).setValue( i, brightness ); } return outputImage; } }