Source code for moten.colorspace

'''Code to convert RGB to other color spaces
'''
#
# Color transformations from
# /auto/k1/shinji/matlab/colorspace/colorspace2.m
# /auto/k1/shinji/matlab/strflab_adds/preprocColorSpace.m
#
# Code originally by Pascal Getreuer (https://getreuer.info/) 2005-2006:
# https://www.mathworks.com/matlabcentral/fileexchange/28790-colorspace-transformations
#
# Only a few transformations were converted to python.
#
# Anwar O. Nunez-Elizalde (2016).
#
# Updates:
#
#
import numpy as np


[docs]def rgb2lab(image): '''Convert RGB to CIE LAB color space **in-place** Parameters ---------- image : 3D numpy float array Array must be in [0,1] range. Last dimension corresponds to RGB channels. Returns ------- LAB : 3D numpy float array The CIE LAB representation in the image. ''' WhitePoint = np.asarray([0.95047,1.0,1.08883]) # Convert image to XYZ image = rgb2xyz(image) # % Convert XYZ to CIE L*a*b* X = image[:,:,0]/WhitePoint[0] Y = image[:,:,1]/WhitePoint[1] Z = image[:,:,2]/WhitePoint[2] fX = _ff(X) fY = _ff(Y) fZ = _ff(Z) image[:,:,0] = 116.0*fY - 16 # L* image[:,:,1] = 500.0*(fX - fY) # a* image[:,:,2] = 200.0*(fY - fZ) # b* return image
[docs]def rgb2lch(image): '''Convert RGB to CIE LCH color space **in-place** Parameters ---------- image : 3D numpy float array Array must be in [0,1] range. Last dimension corresponds to RGB channels. Returns ------- LCH : 3D numpy float array The CIE LCH representation in the image. ''' image = rgb2lab(image) H = np.arctan2(image[:,:,2],image[:,:,1]) H = H*180/np.pi + 360*(H < 0.0) image[:,:,1] = np.sqrt(image[:,:,1]**2 + image[:,:,2]**2) # C image[:,:,2] = H # H return image
[docs]def rgb2xyz(image): '''Convert RGB to CIE XYZ color space **in-place** Parameters ---------- image : 3D numpy float array Array must be in [0,1] range. Last dimension corresponds to RGB channels. Returns ------- LAB : 3D numpy float array The CIE XYZ representation in the image. ''' # % Undo gamma correction R = _invgammacorrection(image[:,:,0]) G = _invgammacorrection(image[:,:,1]) B = _invgammacorrection(image[:,:,2]) # % Convert RGB to XYZ xyz_from_rgb = np.array([[0.412453, 0.357580, 0.180423], [0.212671, 0.715160, 0.072169], [0.019334, 0.119193, 0.950227]]) T = xyz_from_rgb.T.ravel() image[:,:,0] = T[0]*R + T[3]*G + T[6]*B # X image[:,:,1] = T[1]*R + T[4]*G + T[7]*B # Y image[:,:,2] = T[2]*R + T[5]*G + T[8]*B # Z return image
def _ff(Y): '''Obscure helper function ''' fY = np.real(Y**(1./3.)) idx = Y < 0.008856 fY[idx] = Y[idx]*(7.787) + (4./29.) return fY def _invgammacorrection(Rp): ''' ''' R = np.real(((Rp + 0.055)/1.055)**(2.4)) idx = Rp < 0.04045 R[idx] = Rp[idx] / 12.92 return R def _gamma_correct(image, gamma=1.0): """Do not use unless you know what you're doing """ if gamma != 1.0: if not (0 <= image.min() and 1 >= image.max()): image /= 255. image = image**gamma return image if __name__ == '__main__': pass