Editor's Note: This file was selected as MATLAB Central Pick of the Week
This package converts colors between sRGB, Y'PbPr, Y'CbCr, JPEGY'CbCr, Y'UV, Y'IQ, Y'DbDr, HSV, HSL, HSI, CIE XYZ, CIE L*a*b* (CIELAB), CIE L*u*v* (CIELUV), and CIE L*ch (CIELCH), and CIE CAT02 LMS. It can be used either as part of a C/C++ program or compiled as a MATLAB MEX function.
For use in Matlab, colorspace is compiled as a MEX function by entering
mex colorspace.c
on the Matlab command console. As an alternative to MEX, a pure Mcode version colorspace.m is also included.
For use in C programs, an example command line program colorcalc is included.
B = colorspace(S,A) converts the color representation of image A where S is a string specifying the conversion. S tells the source and destination color spaces, S = 'dest<src', or alternatively, S = 'src>dest'. Supported color spaces are
'RGB' = sRGB IEC 6196621
'YPbPr' = Luma (ITUR BT.601) + Chroma
'YCbCr' = Luma + Chroma
'JPEGYCbCr' = space used in JPEG
'YUV' = NTSC PAL Y'UV Luma + Chroma
'YIQ' = NTSC Y'IQ Luma + Chroma
'YDbDr' = SECAM Luma + Chroma
'HSV' or 'HSB' = Hue Saturation Value/Brightness
'HSL' or 'HLS' = Hue Saturation Luminance
'HSI' = Hue Saturation Intensity
'XYZ' = CIE XYZ
'Lab' = CIE L*a*b* (CIELAB)
'Luv' = CIE L*u*v* (CIELUV)
'LCH' = CIE L*C*H* (CIELCH)
'CAT02 LMS' = CIE CAT02 LMS
All transforms assume 2 degree observer and D65 illuminant. Color space names are case insensitive. When sRGB is the source or destination, it can be omitted. For example 'yuv<' is short for 'yuv<rgb'.
Pascal Getreuer (2020). Colorspace Transformations (https://www.mathworks.com/matlabcentral/fileexchange/28790colorspacetransformations), MATLAB Central File Exchange. Retrieved .
1.4.0.0  added tags, minor update in documentation 

1.3.0.0  * Added missing colorspace.h filethanks to William Cook

Inspired: Image Manipulation Toolbox, hslcolormap, colormapgen, HuSL <> RGB Image Conversion Tools, cbrewer2, HSI <> RGB Image Conversion Tools, Image blending functions, Perceptually improved colormaps, Generate maximally perceptuallydistinct colors, Explore Experimental Data, cmocean perceptuallyuniform colormaps
Create scripts with code, output, and formatted text in a single executable document.
Thanks for publishing this code.
In macOS (Xcode ver.8.3.2), I have an error message "Second argument should be an Mx3 or MxNx3 array".
So, could you change "const int *Size;" to "const mwSize *Size;" ? (in colorspace.c, line 1231).
Best regards.
The Colorspace Transformations by Pascal Getreuer assume D65/2°, which is a two degree observer angle and a D65 illuminant. However, D65/10° with a ten degree observer is the common standard beside C/2° and D50/2°. The use of D65/2° may conflict with international standards.
colorspace_ciedemo is a nice plot of the CIE1931 diagram with pure colors labeled, which is useful.
First of all thanks for this excellent contribution.
Checking up the Luv computation i found, that you use the (pre2004 CIE standard) decimal approximation 0.008856 for some conversions instead of the exact rational 216/24389.
( See here: http://brucelindbloom.com/index.html?LContinuity.html )
Not a big deal, but changing line 484 to
i = (Y <= 216/24389)
should be exact. Similarly line 491, i suppose.
(sorry for the accidental double post)
First of all thanks for this excellent contribution.
Checking up the Luv computation i found, that you use the (pre2004 CIE standard) decimal approximation 0.008856 for some conversions instead of the exact rational 216/24389.
( See here: http://brucelindbloom.com/index.html?LContinuity.html )
Not a big deal, but changing line 484 to
Thanks for the contribution. Awesome!
Excellent. Thanks for sharing.
Hi,
Great submission.
Any chance to add CMYK (One of the profiles, SWOP for instance)?
Thank You.
thanks
Maybe I'm just missing something that would be obvious to someone that knows more about this, but there does not appear to be any implementation of HSI conversion in the Mcode. The colorspace string 'hsi' is mapped directly to 'hsl', and certainly both HSL and HSI conversions appear to return the exact same results.
.
There does appear to be an implementation in the c code, however.
.
I thought about just writing a function myself, but I rather like the convenience of using colorspace().
awesome tool, I luv colorspaces!
eric and x.d, I remember reading something like "the Image Processing Toolbox conversion is based on ICC profiles, and it uses a D65 to D50 Bradford adaptation transformation to the D50 white point." That may explain the differences?
Thanks for your great work!
I have used the function “colorspace( )” which can be found in the page of "http://www.mathworks.com/matlabcentral/fileexchange/28790colorspacetransformations" as follows:
rgb = imread('peppers.png');
C = makecform('srgb2lab');
lab = applycform(rgb,C);
lab_2 = colorspace('lab<rgb', rgb);
lab_3 = lab2uint8(lab_2);
I was surprised that the values in lab and lab_3 were quite different. I want to know the mistake in my code or my logical.
Thanks a lot.
Pascal,
Could you comment on the differences between your function and what comes with the image processing toolbox? Specifically, for the same XYZ values, why do I get different results using colorspace as compared to makecform and applycform? Are there arguments to makecform that would yield results consistent with colorspace? As an example, I have been using Spectral and XYZ Color Functions (http://www.mathworks.com/matlabcentral/fileexchange/7021spectralandxyzcolorfunctions) and in the function spectrumRGB I have replaced the makecform and applycform calls with a call to colorspace and comparing the results.
Thanks,
Eric
For the same images, this is about 2 times as fast as:
cform = makecform('srgb2lab');
lab_Ia = applycform(Ia,cform);
Which is fantastic.
thanks very much for your good job,it has been an obstacle for me for a long time
Works great, appreciate the MEX code. Far more useful and welldone than matlab's conversions. I've been very impressed with all your stuff, Pascal :)
PS
I used Colorspace in conjunction with cline
( www.mathworks.com/matlabcentral/fileexchange/14677cline ) for an example in my Perceptually improved colormaps submission.
I used them this way:
% J=jet(256);
% LJ=colorspace('RGB>Lab',J);
% figure; cline([1:1:256],LJ(:,1),LJ(:,1),[1:1:256],J);
% title ('L* plot for jet colormap','Color','k','FontSize',12);
Also, as I was reading Steve's post on Lab based colormaps (thank you Steve!), I used colorspace to do the transformations as I do not have the Image Processign Toolbox ). This helped me visualize things (notice again I used it togeter with cline):
% radius = 50;
% theta = linspace(0, pi/2, 256).';
% a = radius * cos(theta);
% b = radius * sin(theta);
% L = linspace(0, 100, 256).';
% Lab = [L, a, b];
% RGBhlx=colorspace('RGB<Lab',(Lab));
% figure; cline(a, b, L, L,RGBhlx); view(3);
% VIEW(165,15);
Thanks for your comments Pascal. I used your 2006 implementation many many times, and I recently used this version for the Perceptually improved colormaps. It worked well for me.
Thanks, Matteo!
The difference between this package and my previous 20062008 Color Space Converter is that colorspace is now implemented in C code. There are two advantages to this. First, colorspace now runs in MATLAB as a MEX function, which is noticeably more efficient than the previous Mcode version. Second, colorspace can also be used from normal C and C++ programsMATLAB is not required to use colorspace.
In case MEX is not an option, a pure Mcode version of colorspace is also included (effectively an updated version of the previous colorspace).
Additionally, the sRGB definition of gammacorrected RGB is now used, and two spaces have been added (HSI and CIE CAT02 LMS).
Hi Pascal
Great work!
Could you add in here comments/details on the differences between this and the earlier version (2006 Color Space Converter updated 2008)?
Thank you