rename UCS as CMC

This commit is contained in:
John Cupitt 2012-11-01 10:21:55 +00:00
parent 63a06e5f81
commit f5790be152
13 changed files with 147 additions and 195 deletions

View File

@ -8,6 +8,7 @@
as classes as classes
- added vips_colour_convert(), replaces all derived conversions - added vips_colour_convert(), replaces all derived conversions
- faster and more accurate sRGB <-> XYZ conversion - faster and more accurate sRGB <-> XYZ conversion
- rename UCS colourspace as CMC
- dzsave can write zoomify and google maps layout as well - dzsave can write zoomify and google maps layout as well
- tilecache supports threaded access - tilecache supports threaded access
- openslide2vips gets underlying tile size from openslide - openslide2vips gets underlying tile size from openslide

2
TODO
View File

@ -3,8 +3,6 @@
- add mono as a colourspace? also rad? - add mono as a colourspace? also rad?
- rename INTERPRETATION_UCS to _CMC
- something to test if an image is in a supported colourspace? - something to test if an image is in a supported colourspace?
at the moment we only look at interpretation, but for things like labq at the moment we only look at interpretation, but for things like labq

View File

@ -1,4 +1,4 @@
/* im_LCh2UCS /* im_LCh2CMC
* *
* Modified: * Modified:
* 2/11/09 * 2/11/09
@ -45,67 +45,67 @@
#include "colour.h" #include "colour.h"
typedef VipsColourSpace VipsLCh2UCS; typedef VipsColourSpace VipsLCh2CMC;
typedef VipsColourSpaceClass VipsLCh2UCSClass; typedef VipsColourSpaceClass VipsLCh2CMCClass;
G_DEFINE_TYPE( VipsLCh2UCS, vips_LCh2UCS, VIPS_TYPE_COLOUR_SPACE ); G_DEFINE_TYPE( VipsLCh2CMC, vips_LCh2CMC, VIPS_TYPE_COLOUR_SPACE );
/** /**
* vips_col_L2Lucs: * vips_col_L2Lcmc:
* @L: CIE L* * @L: CIE L*
* *
* Calculate Lucs from L. * Calculate Lcmc from L.
* *
* Returns: Lucs * Returns: Lcmc
*/ */
float float
vips_col_L2Lucs( float L ) vips_col_L2Lcmc( float L )
{ {
float Lucs; float Lcmc;
if( L >= 16.0 ) if( L >= 16.0 )
Lucs = (21.75 * log( L ) + 0.3838 * L - 38.54); Lcmc = (21.75 * log( L ) + 0.3838 * L - 38.54);
else else
Lucs = 1.744 * L; Lcmc = 1.744 * L;
return( Lucs ); return( Lcmc );
} }
/** /**
* vips_col_C2Cucs: * vips_col_C2Ccmc:
* @C: Chroma * @C: Chroma
* *
* Calculate Cucs from C. * Calculate Ccmc from C.
* *
* Returns: Cucs. * Returns: Ccmc.
*/ */
float float
vips_col_C2Cucs( float C ) vips_col_C2Ccmc( float C )
{ {
float Cucs; float Ccmc;
Cucs = 0.162 * C + 10.92 * log( 0.638 + 0.07216 * C ) + 4.907; Ccmc = 0.162 * C + 10.92 * log( 0.638 + 0.07216 * C ) + 4.907;
if( Cucs < 0 ) if( Ccmc < 0 )
Cucs = 0; Ccmc = 0;
return( Cucs ); return( Ccmc );
} }
/** /**
* vips_col_Ch2hucs: * vips_col_Ch2hcmc:
* @C: Chroma * @C: Chroma
* @h: Hue (degrees) * @h: Hue (degrees)
* *
* Calculate hucs from C and h. * Calculate hcmc from C and h.
* *
* Returns: hucs. * Returns: hcmc.
*/ */
float float
vips_col_Ch2hucs( float C, float h ) vips_col_Ch2hcmc( float C, float h )
{ {
float P, D, f, g; float P, D, f, g;
float k4, k5, k6, k7, k8; float k4, k5, k6, k7, k8;
float hucs; float hcmc;
if( h < 49.1 ) { if( h < 49.1 ) {
k4 = 133.87; k4 = 133.87;
@ -140,13 +140,13 @@ vips_col_Ch2hucs( float C, float h )
D = k4 + k5 * P * pow( fabs( P ), k6 ); D = k4 + k5 * P * pow( fabs( P ), k6 );
g = C * C * C * C; g = C * C * C * C;
f = sqrt( g / (g + 1900.0) ); f = sqrt( g / (g + 1900.0) );
hucs = h + D * f; hcmc = h + D * f;
return( hucs ); return( hcmc );
} }
static void static void
vips_LCh2UCS_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width ) vips_LCh2CMC_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
{ {
float *p = (float *) in[0]; float *p = (float *) in[0];
float *q = (float *) out; float *q = (float *) out;
@ -160,51 +160,51 @@ vips_LCh2UCS_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
p += 3; p += 3;
q[0] = vips_col_L2Lucs( L ); q[0] = vips_col_L2Lcmc( L );
q[1] = vips_col_C2Cucs( C ); q[1] = vips_col_C2Ccmc( C );
q[2] = vips_col_Ch2hucs( C, h ); q[2] = vips_col_Ch2hcmc( C, h );
q += 3; q += 3;
} }
} }
static void static void
vips_LCh2UCS_class_init( VipsLCh2UCSClass *class ) vips_LCh2CMC_class_init( VipsLCh2CMCClass *class )
{ {
VipsObjectClass *object_class = (VipsObjectClass *) class; VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class ); VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
object_class->nickname = "LCh2UCS"; object_class->nickname = "LCh2CMC";
object_class->description = _( "transform LCh to UCS" ); object_class->description = _( "transform LCh to CMC" );
colour_class->process_line = vips_LCh2UCS_line; colour_class->process_line = vips_LCh2CMC_line;
} }
static void static void
vips_LCh2UCS_init( VipsLCh2UCS *LCh2UCS ) vips_LCh2CMC_init( VipsLCh2CMC *LCh2CMC )
{ {
VipsColour *colour = VIPS_COLOUR( LCh2UCS ); VipsColour *colour = VIPS_COLOUR( LCh2CMC );
colour->interpretation = VIPS_INTERPRETATION_UCS; colour->interpretation = VIPS_INTERPRETATION_CMC;
} }
/** /**
* vips_LCh2UCS: * vips_LCh2CMC:
* @in: input image * @in: input image
* @out: output image * @out: output image
* *
* Turn LCh to UCS. * Turn LCh to CMC.
* *
* Returns: 0 on success, -1 on error * Returns: 0 on success, -1 on error
*/ */
int int
vips_LCh2UCS( VipsImage *in, VipsImage **out, ... ) vips_LCh2CMC( VipsImage *in, VipsImage **out, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, out ); va_start( ap, out );
result = vips_call_split( "LCh2UCS", ap, in, out ); result = vips_call_split( "LCh2CMC", ap, in, out );
va_end( ap ); va_end( ap );
return( result ); return( result );

View File

@ -1,4 +1,4 @@
/* Turn UCS to LCh /* Turn CMC to LCh
* *
* 15/11/94 JC * 15/11/94 JC
* - error messages added * - error messages added
@ -8,7 +8,7 @@
* 2/11/09 * 2/11/09
* - gtkdoc * - gtkdoc
* 30/11/09 * 30/11/09
* - argh, im_col_make_tables_UCS(); missing, thanks Peter * - argh, im_col_make_tables_CMC(); missing, thanks Peter
* 19/9/12 * 19/9/12
* - redone as a class * - redone as a class
*/ */
@ -57,10 +57,10 @@ static float LI[1001];
static float CI[3001]; static float CI[3001];
static float hI[101][361]; static float hI[101][361];
typedef VipsColourSpace VipsUCS2LCh; typedef VipsColourSpace VipsCMC2LCh;
typedef VipsColourSpaceClass VipsUCS2LChClass; typedef VipsColourSpaceClass VipsCMC2LChClass;
G_DEFINE_TYPE( VipsUCS2LCh, vips_UCS2LCh, VIPS_TYPE_COLOUR_SPACE ); G_DEFINE_TYPE( VipsCMC2LCh, vips_CMC2LCh, VIPS_TYPE_COLOUR_SPACE );
/* Generate LI (inverse) tables. /* Generate LI (inverse) tables.
*/ */
@ -71,7 +71,7 @@ make_LI( void )
float Ll[1001]; float Ll[1001];
for( i = 0; i < 1001; i++ ) for( i = 0; i < 1001; i++ )
Ll[i] = vips_col_L2Lucs( i / 10.0 ); Ll[i] = vips_col_L2Lcmc( i / 10.0 );
for( i = 0; i < 1001; i++ ) { for( i = 0; i < 1001; i++ ) {
int j; int j;
@ -84,7 +84,7 @@ make_LI( void )
} }
} }
/* Generate Cucs table. /* Generate Ccmc table.
*/ */
static void static void
make_CI( void ) make_CI( void )
@ -93,7 +93,7 @@ make_CI( void )
float Cl[3001]; float Cl[3001];
for( i = 0; i < 3001; i++ ) for( i = 0; i < 3001; i++ )
Cl[i] = vips_col_C2Cucs( i / 10.0 ); Cl[i] = vips_col_C2Ccmc( i / 10.0 );
for( i = 0; i < 3001; i++ ) { for( i = 0; i < 3001; i++ ) {
int j; int j;
@ -105,7 +105,7 @@ make_CI( void )
} }
} }
/* The difficult one: hucs. /* The difficult one: hcmc.
*/ */
static void static void
make_hI( void ) make_hI( void )
@ -115,7 +115,7 @@ make_hI( void )
for( i = 0; i < 361; i++ ) for( i = 0; i < 361; i++ )
for( j = 0; j < 101; j++ ) for( j = 0; j < 101; j++ )
hl[j][i] = vips_col_Ch2hucs( j * 2.0, i ); hl[j][i] = vips_col_Ch2hcmc( j * 2.0, i );
for( j = 0; j < 101; j++ ) { for( j = 0; j < 101; j++ ) {
for( i = 0; i < 361; i++ ) { for( i = 0; i < 361; i++ ) {
@ -130,61 +130,61 @@ make_hI( void )
} }
/** /**
* vips_col_Lucs2L: * vips_col_Lcmc2L:
* @Lucs: L ucs * @Lcmc: L cmc
* *
* Calculate L from Lucs using a table. Call vips_col_make_tables_UCS() at * Calculate L from Lcmc using a table. Call vips_col_make_tables_CMC() at
* least once before using this function. * least once before using this function.
* *
* Returns: L* * Returns: L*
*/ */
float float
vips_col_Lucs2L( float Lucs ) vips_col_Lcmc2L( float Lcmc )
{ {
int known; int known;
known = floor( Lucs * 10.0 ); known = floor( Lcmc * 10.0 );
known = VIPS_CLIP( 0, known, 1000 ); known = VIPS_CLIP( 0, known, 1000 );
return( LI[known] + return( LI[known] +
(LI[known + 1] - LI[known]) * (Lucs * 10.0 - known) ); (LI[known + 1] - LI[known]) * (Lcmc * 10.0 - known) );
} }
/** /**
* vips_col_Cucs2C: * vips_col_Ccmc2C:
* @Cucs: Cucs * @Ccmc: Ccmc
* *
* Calculate C from Cucs using a table. * Calculate C from Ccmc using a table.
* Call vips_col_make_tables_UCS() at * Call vips_col_make_tables_CMC() at
* least once before using this function. * least once before using this function.
* *
* Returns: C. * Returns: C.
*/ */
float float
vips_col_Cucs2C( float Cucs ) vips_col_Ccmc2C( float Ccmc )
{ {
int known; int known;
known = floor( Cucs * 10.0 ); known = floor( Ccmc * 10.0 );
known = VIPS_CLIP( 0, known, 3000 ); known = VIPS_CLIP( 0, known, 3000 );
return( CI[known] + return( CI[known] +
(CI[known + 1] - CI[known]) * (Cucs * 10.0 - known) ); (CI[known + 1] - CI[known]) * (Ccmc * 10.0 - known) );
} }
/** /**
* vips_col_Chucs2h: * vips_col_Chcmc2h:
* @C: Chroma * @C: Chroma
* @hucs: Hue ucs (degrees) * @hcmc: Hue cmc (degrees)
* *
* Calculate h from C and hucs, using a table. * Calculate h from C and hcmc, using a table.
* Call vips_col_make_tables_UCS() at * Call vips_col_make_tables_CMC() at
* least once before using this function. * least once before using this function.
* *
* Returns: h. * Returns: h.
*/ */
float float
vips_col_Chucs2h( float C, float hucs ) vips_col_Chcmc2h( float C, float hcmc )
{ {
int r; int r;
int known; int known;
@ -194,11 +194,11 @@ vips_col_Chucs2h( float C, float hucs )
r = (int) ((C + 1.0) / 2.0); r = (int) ((C + 1.0) / 2.0);
r = VIPS_CLIP( 0, r, 100 ); r = VIPS_CLIP( 0, r, 100 );
known = floor( hucs ); known = floor( hcmc );
known = VIPS_CLIP( 0, known, 360 ); known = VIPS_CLIP( 0, known, 360 );
return( hI[r][known] + return( hI[r][known] +
(hI[r][(known + 1) % 360] - hI[r][known]) * (hucs - known) ); (hI[r][(known + 1) % 360] - hI[r][known]) * (hcmc - known) );
} }
static void * static void *
@ -212,12 +212,12 @@ tables_init( void *client )
} }
/** /**
* vips_col_make_tables_UCS: * vips_col_make_tables_CMC:
* *
* Make the lookup tables for ucs. * Make the lookup tables for cmc.
*/ */
void void
vips_col_make_tables_UCS( void ) vips_col_make_tables_CMC( void )
{ {
static GOnce once = G_ONCE_INIT; static GOnce once = G_ONCE_INIT;
@ -227,7 +227,7 @@ vips_col_make_tables_UCS( void )
/* Process a buffer of data. /* Process a buffer of data.
*/ */
void void
vips_UCS2LCh_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width ) vips_CMC2LCh_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
{ {
float *p = (float *) in[0]; float *p = (float *) in[0];
float *q = (float *) out; float *q = (float *) out;
@ -235,15 +235,15 @@ vips_UCS2LCh_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
int x; int x;
for( x = 0; x < width; x++ ) { for( x = 0; x < width; x++ ) {
float Lucs = p[0]; float Lcmc = p[0];
float Cucs = p[1]; float Ccmc = p[1];
float hucs = p[2]; float hcmc = p[2];
/* Turn from UCS. /* Turn from CMC.
*/ */
float C = vips_col_Cucs2C( Cucs ); float C = vips_col_Ccmc2C( Ccmc );
float h = vips_col_Chucs2h( C, hucs ); float h = vips_col_Chcmc2h( C, hcmc );
float L = vips_col_Lucs2L( Lucs ); float L = vips_col_Lcmc2L( Lcmc );
p += 3; p += 3;
@ -256,43 +256,43 @@ vips_UCS2LCh_line( VipsColour *colour, VipsPel *out, VipsPel **in, int width )
} }
static void static void
vips_UCS2LCh_class_init( VipsUCS2LChClass *class ) vips_CMC2LCh_class_init( VipsCMC2LChClass *class )
{ {
VipsObjectClass *object_class = (VipsObjectClass *) class; VipsObjectClass *object_class = (VipsObjectClass *) class;
VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class ); VipsColourClass *colour_class = VIPS_COLOUR_CLASS( class );
object_class->nickname = "UCS2LCh"; object_class->nickname = "CMC2LCh";
object_class->description = _( "transform LCh to UCS" ); object_class->description = _( "transform LCh to CMC" );
colour_class->process_line = vips_UCS2LCh_line; colour_class->process_line = vips_CMC2LCh_line;
} }
static void static void
vips_UCS2LCh_init( VipsUCS2LCh *UCS2LCh ) vips_CMC2LCh_init( VipsCMC2LCh *CMC2LCh )
{ {
VipsColour *colour = VIPS_COLOUR( UCS2LCh ); VipsColour *colour = VIPS_COLOUR( CMC2LCh );
vips_col_make_tables_UCS(); vips_col_make_tables_CMC();
colour->interpretation = VIPS_INTERPRETATION_LCH; colour->interpretation = VIPS_INTERPRETATION_LCH;
} }
/** /**
* vips_UCS2LCh: * vips_CMC2LCh:
* @in: input image * @in: input image
* @out: output image * @out: output image
* *
* Turn LCh to UCS. * Turn LCh to CMC.
* *
* Returns: 0 on success, -1 on error * Returns: 0 on success, -1 on error
*/ */
int int
vips_UCS2LCh( VipsImage *in, VipsImage **out, ... ) vips_CMC2LCh( VipsImage *in, VipsImage **out, ... )
{ {
va_list ap; va_list ap;
int result; int result;
va_start( ap, out ); va_start( ap, out );
result = vips_call_split( "UCS2LCh", ap, in, out ); result = vips_call_split( "CMC2LCh", ap, in, out );
va_end( ap ); va_end( ap );
return( result ); return( result );

View File

@ -611,7 +611,7 @@ typedef struct _VipsColourRoute {
#define LAB VIPS_INTERPRETATION_LAB #define LAB VIPS_INTERPRETATION_LAB
#define LABQ VIPS_INTERPRETATION_LABQ #define LABQ VIPS_INTERPRETATION_LABQ
#define LCH VIPS_INTERPRETATION_LCH #define LCH VIPS_INTERPRETATION_LCH
#define UCS VIPS_INTERPRETATION_UCS #define CMC VIPS_INTERPRETATION_CMC
#define LABS VIPS_INTERPRETATION_LABS #define LABS VIPS_INTERPRETATION_LABS
#define sRGB VIPS_INTERPRETATION_sRGB #define sRGB VIPS_INTERPRETATION_sRGB
#define YXY VIPS_INTERPRETATION_YXY #define YXY VIPS_INTERPRETATION_YXY
@ -622,7 +622,7 @@ static VipsColourRoute vips_colour_routes[] = {
{ XYZ, LAB, { vips_XYZ2Lab, NULL } }, { XYZ, LAB, { vips_XYZ2Lab, NULL } },
{ XYZ, LABQ, { vips_XYZ2Lab, vips_Lab2LabQ, NULL } }, { XYZ, LABQ, { vips_XYZ2Lab, vips_Lab2LabQ, NULL } },
{ XYZ, LCH, { vips_XYZ2Lab, vips_Lab2LCh, NULL } }, { XYZ, LCH, { vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ XYZ, UCS, { vips_XYZ2Lab, vips_Lab2LCh, vips_LCh2UCS, NULL } }, { XYZ, CMC, { vips_XYZ2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ XYZ, LABS, { vips_XYZ2Lab, vips_Lab2LabS, NULL } }, { XYZ, LABS, { vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ XYZ, sRGB, { vips_XYZ2sRGB, NULL } }, { XYZ, sRGB, { vips_XYZ2sRGB, NULL } },
{ XYZ, YXY, { vips_XYZ2Yxy, NULL } }, { XYZ, YXY, { vips_XYZ2Yxy, NULL } },
@ -630,7 +630,7 @@ static VipsColourRoute vips_colour_routes[] = {
{ LAB, XYZ, { vips_Lab2XYZ, NULL } }, { LAB, XYZ, { vips_Lab2XYZ, NULL } },
{ LAB, LABQ, { vips_Lab2LabQ, NULL } }, { LAB, LABQ, { vips_Lab2LabQ, NULL } },
{ LAB, LCH, { vips_Lab2LCh, NULL } }, { LAB, LCH, { vips_Lab2LCh, NULL } },
{ LAB, UCS, { vips_Lab2LCh, vips_LCh2UCS, NULL } }, { LAB, CMC, { vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LAB, LABS, { vips_Lab2LabS, NULL } }, { LAB, LABS, { vips_Lab2LabS, NULL } },
{ LAB, sRGB, { vips_Lab2XYZ, vips_XYZ2sRGB, NULL } }, { LAB, sRGB, { vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LAB, YXY, { vips_Lab2XYZ, vips_XYZ2Yxy, NULL } }, { LAB, YXY, { vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
@ -638,7 +638,7 @@ static VipsColourRoute vips_colour_routes[] = {
{ LABQ, XYZ, { vips_LabQ2Lab, vips_Lab2XYZ, NULL } }, { LABQ, XYZ, { vips_LabQ2Lab, vips_Lab2XYZ, NULL } },
{ LABQ, LAB, { vips_LabQ2Lab, NULL } }, { LABQ, LAB, { vips_LabQ2Lab, NULL } },
{ LABQ, LCH, { vips_LabQ2Lab, vips_Lab2LCh, NULL } }, { LABQ, LCH, { vips_LabQ2Lab, vips_Lab2LCh, NULL } },
{ LABQ, UCS, { vips_LabQ2Lab, vips_Lab2LCh, vips_LCh2UCS, NULL } }, { LABQ, CMC, { vips_LabQ2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LABQ, LABS, { vips_LabQ2LabS, NULL } }, { LABQ, LABS, { vips_LabQ2LabS, NULL } },
{ LABQ, sRGB, { vips_LabQ2sRGB, NULL } }, { LABQ, sRGB, { vips_LabQ2sRGB, NULL } },
{ LABQ, YXY, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } }, { LABQ, YXY, { vips_LabQ2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
@ -646,26 +646,26 @@ static VipsColourRoute vips_colour_routes[] = {
{ LCH, XYZ, { vips_LCh2Lab, vips_Lab2XYZ, NULL } }, { LCH, XYZ, { vips_LCh2Lab, vips_Lab2XYZ, NULL } },
{ LCH, LAB, { vips_LCh2Lab, NULL } }, { LCH, LAB, { vips_LCh2Lab, NULL } },
{ LCH, LABQ, { vips_LCh2Lab, vips_Lab2LabQ, NULL } }, { LCH, LABQ, { vips_LCh2Lab, vips_Lab2LabQ, NULL } },
{ LCH, UCS, { vips_LCh2UCS, NULL } }, { LCH, CMC, { vips_LCh2CMC, NULL } },
{ LCH, LABS, { vips_LCh2Lab, vips_Lab2LabS, NULL } }, { LCH, LABS, { vips_LCh2Lab, vips_Lab2LabS, NULL } },
{ LCH, sRGB, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } }, { LCH, sRGB, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LCH, YXY, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } }, { LCH, YXY, { vips_LCh2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
{ UCS, XYZ, { vips_UCS2LCh, vips_LCh2Lab, vips_Lab2XYZ, NULL } }, { CMC, XYZ, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ, NULL } },
{ UCS, LAB, { vips_UCS2LCh, vips_LCh2Lab, NULL } }, { CMC, LAB, { vips_CMC2LCh, vips_LCh2Lab, NULL } },
{ UCS, LABQ, { vips_UCS2LCh, vips_LCh2Lab, vips_Lab2LabQ, NULL } }, { CMC, LABQ, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2LabQ, NULL } },
{ UCS, LCH, { vips_UCS2LCh, NULL } }, { CMC, LCH, { vips_CMC2LCh, NULL } },
{ UCS, LABS, { vips_UCS2LCh, vips_LCh2Lab, vips_Lab2LabS, NULL } }, { CMC, LABS, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2LabS, NULL } },
{ UCS, sRGB, { vips_UCS2LCh, vips_LCh2Lab, vips_Lab2XYZ, { CMC, sRGB, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2sRGB, NULL } }, vips_XYZ2sRGB, NULL } },
{ UCS, YXY, { vips_UCS2LCh, vips_LCh2Lab, vips_Lab2XYZ, { CMC, YXY, { vips_CMC2LCh, vips_LCh2Lab, vips_Lab2XYZ,
vips_XYZ2Yxy, NULL } }, vips_XYZ2Yxy, NULL } },
{ LABS, XYZ, { vips_LabS2Lab, vips_Lab2XYZ, NULL } }, { LABS, XYZ, { vips_LabS2Lab, vips_Lab2XYZ, NULL } },
{ LABS, LAB, { vips_LabS2Lab, NULL } }, { LABS, LAB, { vips_LabS2Lab, NULL } },
{ LABS, LABQ, { vips_LabS2LabQ, NULL } }, { LABS, LABQ, { vips_LabS2LabQ, NULL } },
{ LABS, LCH, { vips_LabS2Lab, vips_Lab2LCh, NULL } }, { LABS, LCH, { vips_LabS2Lab, vips_Lab2LCh, NULL } },
{ LABS, UCS, { vips_LabS2Lab, vips_Lab2LCh, vips_LCh2UCS, NULL } }, { LABS, CMC, { vips_LabS2Lab, vips_Lab2LCh, vips_LCh2CMC, NULL } },
{ LABS, sRGB, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } }, { LABS, sRGB, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2sRGB, NULL } },
{ LABS, YXY, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } }, { LABS, YXY, { vips_LabS2Lab, vips_Lab2XYZ, vips_XYZ2Yxy, NULL } },
@ -673,8 +673,8 @@ static VipsColourRoute vips_colour_routes[] = {
{ sRGB, LAB, { vips_sRGB2XYZ, vips_XYZ2Lab, NULL } }, { sRGB, LAB, { vips_sRGB2XYZ, vips_XYZ2Lab, NULL } },
{ sRGB, LABQ, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } }, { sRGB, LABQ, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } },
{ sRGB, LCH, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } }, { sRGB, LCH, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ sRGB, UCS, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh, { sRGB, CMC, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LCh,
vips_LCh2UCS, NULL } }, vips_LCh2CMC, NULL } },
{ sRGB, LABS, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } }, { sRGB, LABS, { vips_sRGB2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ sRGB, YXY, { vips_sRGB2XYZ, vips_XYZ2Yxy, NULL } }, { sRGB, YXY, { vips_sRGB2XYZ, vips_XYZ2Yxy, NULL } },
@ -682,8 +682,8 @@ static VipsColourRoute vips_colour_routes[] = {
{ YXY, LAB, { vips_Yxy2XYZ, vips_XYZ2Lab, NULL } }, { YXY, LAB, { vips_Yxy2XYZ, vips_XYZ2Lab, NULL } },
{ YXY, LABQ, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } }, { YXY, LABQ, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LabQ, NULL } },
{ YXY, LCH, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } }, { YXY, LCH, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LCh, NULL } },
{ YXY, UCS, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LCh, { YXY, CMC, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LCh,
vips_LCh2UCS, NULL } }, vips_LCh2CMC, NULL } },
{ YXY, LABS, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } }, { YXY, LABS, { vips_Yxy2XYZ, vips_XYZ2Lab, vips_Lab2LabS, NULL } },
{ YXY, sRGB, { vips_Yxy2XYZ, vips_XYZ2sRGB, NULL } }, { YXY, sRGB, { vips_Yxy2XYZ, vips_XYZ2sRGB, NULL } },
}; };
@ -828,8 +828,8 @@ vips_colour_operation_init( void )
extern GType vips_XYZ2Lab_get_type( void ); extern GType vips_XYZ2Lab_get_type( void );
extern GType vips_Lab2LCh_get_type( void ); extern GType vips_Lab2LCh_get_type( void );
extern GType vips_LCh2Lab_get_type( void ); extern GType vips_LCh2Lab_get_type( void );
extern GType vips_LCh2UCS_get_type( void ); extern GType vips_LCh2CMC_get_type( void );
extern GType vips_UCS2LCh_get_type( void ); extern GType vips_CMC2LCh_get_type( void );
extern GType vips_Yxy2XYZ_get_type( void ); extern GType vips_Yxy2XYZ_get_type( void );
extern GType vips_XYZ2Yxy_get_type( void ); extern GType vips_XYZ2Yxy_get_type( void );
extern GType vips_LabQ2Lab_get_type( void ); extern GType vips_LabQ2Lab_get_type( void );
@ -857,8 +857,8 @@ vips_colour_operation_init( void )
vips_XYZ2Lab_get_type(); vips_XYZ2Lab_get_type();
vips_Lab2LCh_get_type(); vips_Lab2LCh_get_type();
vips_LCh2Lab_get_type(); vips_LCh2Lab_get_type();
vips_LCh2UCS_get_type(); vips_LCh2CMC_get_type();
vips_UCS2LCh_get_type(); vips_CMC2LCh_get_type();
vips_XYZ2Yxy_get_type(); vips_XYZ2Yxy_get_type();
vips_Yxy2XYZ_get_type(); vips_Yxy2XYZ_get_type();
vips_LabQ2Lab_get_type(); vips_LabQ2Lab_get_type();

View File

@ -61,7 +61,7 @@
* <emphasis>XYZ</emphasis>, <emphasis>Yxy</emphasis>, * <emphasis>XYZ</emphasis>, <emphasis>Yxy</emphasis>,
* <emphasis>Lab</emphasis>, <emphasis>LabQ</emphasis>, * <emphasis>Lab</emphasis>, <emphasis>LabQ</emphasis>,
* <emphasis>LabS</emphasis>, <emphasis>LCh</emphasis> and * <emphasis>LabS</emphasis>, <emphasis>LCh</emphasis> and
* <emphasis>UCS</emphasis>). Secondly, there are a set of operations for * <emphasis>CMC</emphasis>). Secondly, there are a set of operations for
* calculating colour difference metrics. Finally, VIPS wraps LittleCMS and * calculating colour difference metrics. Finally, VIPS wraps LittleCMS and
* uses it to provide a set of operations for reading and writing images with * uses it to provide a set of operations for reading and writing images with
* ICC profiles. * ICC profiles.
@ -150,12 +150,12 @@
* </listitem> * </listitem>
* <listitem> * <listitem>
* <para> * <para>
* <emphasis><code>UCS</code></emphasis> * <emphasis><code>CMC</code></emphasis>
* *
* A colour space based on the CMC(1:1) colour difference measurement. * A colour space based on the CMC(1:1) colour difference measurement.
* This is a highly uniform colour space, much better than CIELAB for * This is a highly uniform colour space, much better than CIELAB for
* expressing small differences. Conversions to and from * expressing small differences. Conversions to and from
* <code>UCS</code> are extremely slow. * <code>CMC</code> are extremely slow.
* </para> * </para>
* </listitem> * </listitem>
* </itemizedlist> * </itemizedlist>

View File

@ -66,7 +66,7 @@ G_DEFINE_TYPE( VipsdE76, vips_dE76, VIPS_TYPE_COLOUR_DIFFERENCE );
* @a2: Input coordinate 2 * @a2: Input coordinate 2
* @b2: Input coordinate 2 * @b2: Input coordinate 2
* *
* Pythagorean distance between two points in colour space. Lab/XYZ/UCS etc. * Pythagorean distance between two points in colour space. Lab/XYZ/CMC etc.
*/ */
float float
vips_pythagoras( float L1, float a1, float b1, float L2, float a2, float b2 ) vips_pythagoras( float L1, float a1, float b1, float L2, float a2, float b2 )

View File

@ -67,7 +67,7 @@ vips_dECMC_init( VipsdECMC *dECMC )
{ {
VipsColourDifference *difference = VIPS_COLOUR_DIFFERENCE( dECMC ); VipsColourDifference *difference = VIPS_COLOUR_DIFFERENCE( dECMC );
difference->interpretation = VIPS_INTERPRETATION_UCS; difference->interpretation = VIPS_INTERPRETATION_CMC;
} }
/** /**
@ -76,11 +76,11 @@ vips_dECMC_init( VipsdECMC *dECMC )
* @right: second input image * @right: second input image
* @out: output image * @out: output image
* *
* Calculate dE CMC. The input images are transformed to UCS colour space and * Calculate dE CMC. The input images are transformed to CMC colour space and
* the euclidean distance between corresponding pixels calculated. * the euclidean distance between corresponding pixels calculated.
* *
* To calculate a colour difference with values for (l:c) other than (1:1), * To calculate a colour difference with values for (l:c) other than (1:1),
* transform the two source images to UCS yourself, scale the channels * transform the two source images to CMC yourself, scale the channels
* appropriately, and call this function. * appropriately, and call this function.
* *
* See also: vips_colour_convert() * See also: vips_colour_convert()

View File

@ -2265,7 +2265,7 @@ im_LCh2UCS( IMAGE *in, IMAGE *out )
{ {
VipsImage *x; VipsImage *x;
if( vips_LCh2UCS( in, &x, NULL ) ) if( vips_LCh2CMC( in, &x, NULL ) )
return( -1 ); return( -1 );
if( im_copy( x, out ) ) { if( im_copy( x, out ) ) {
g_object_unref( x ); g_object_unref( x );
@ -2281,7 +2281,7 @@ im_UCS2LCh( IMAGE *in, IMAGE *out )
{ {
VipsImage *x; VipsImage *x;
if( vips_UCS2LCh( in, &x, NULL ) ) if( vips_CMC2LCh( in, &x, NULL ) )
return( -1 ); return( -1 );
if( im_copy( x, out ) ) { if( im_copy( x, out ) ) {
g_object_unref( x ); g_object_unref( x );
@ -2661,15 +2661,6 @@ im_LabQ2XYZ( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
/**
* im_Lab2UCS:
* @in: input image
* @out: output image
*
* Convert an image from Lab to UCS.
*
* Returns: 0 on success, -1 on error.
*/
int int
im_Lab2UCS( IMAGE *in, IMAGE *out ) im_Lab2UCS( IMAGE *in, IMAGE *out )
{ {
@ -2683,15 +2674,6 @@ im_Lab2UCS( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
/**
* im_UCS2Lab:
* @in: input image
* @out: output image
*
* Convert an image from UCS to Lab.
*
* Returns: 0 on success, -1 on error.
*/
int int
im_UCS2Lab( IMAGE *in, IMAGE *out ) im_UCS2Lab( IMAGE *in, IMAGE *out )
{ {
@ -2705,15 +2687,6 @@ im_UCS2Lab( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
/**
* im_UCS2XYZ:
* @in: input image
* @out: output image
*
* Convert an image from UCS to XYZ.
*
* Returns: 0 on success, -1 on error.
*/
int int
im_UCS2XYZ( IMAGE *in, IMAGE *out ) im_UCS2XYZ( IMAGE *in, IMAGE *out )
{ {
@ -2727,16 +2700,6 @@ im_UCS2XYZ( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
/**
* im_XY2UCS:
* @in: input image
* @out: output image
*
* Convert an image from XYZ to UCS.
*
* Returns: 0 on success, -1 on error.
*/
int int
im_XYZ2UCS( IMAGE *in, IMAGE *out ) im_XYZ2UCS( IMAGE *in, IMAGE *out )
{ {
@ -2750,16 +2713,6 @@ im_XYZ2UCS( IMAGE *in, IMAGE *out )
return( 0 ); return( 0 );
} }
/**
* im_dE_fromXYZ:
* @in1: first input image
* @in2: second input image
* @out: output image
*
* Calculate CIELAB dE 1976 from a pair of XYZ images.
*
* Returns: 0 on success, -1 on error.
*/
int int
im_dE_fromXYZ( IMAGE *in1, IMAGE *in2, IMAGE *out ) im_dE_fromXYZ( IMAGE *in1, IMAGE *in2, IMAGE *out )
{ {

View File

@ -134,7 +134,7 @@ int vips_Lab2LCh( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_Yxy2Lab( VipsImage *in, VipsImage **out, ... ) int vips_Yxy2Lab( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_UCS2XYZ( VipsImage *in, VipsImage **out, ... ) int vips_CMC2XYZ( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_Lab2XYZ( VipsImage *in, VipsImage **out, ... ) int vips_Lab2XYZ( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -144,9 +144,9 @@ int vips_XYZ2sRGB( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_sRGB2XYZ( VipsImage *in, VipsImage **out, ... ) int vips_sRGB2XYZ( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_LCh2UCS( VipsImage *in, VipsImage **out, ... ) int vips_LCh2CMC( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_UCS2LCh( VipsImage *in, VipsImage **out, ... ) int vips_CMC2LCh( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
int vips_XYZ2Yxy( VipsImage *in, VipsImage **out, ... ) int vips_XYZ2Yxy( VipsImage *in, VipsImage **out, ... )
__attribute__((sentinel)); __attribute__((sentinel));
@ -183,14 +183,14 @@ double vips_col_ab2h( double a, double b );
void vips_col_ab2Ch( float a, float b, float *C, float *h ); void vips_col_ab2Ch( float a, float b, float *C, float *h );
void vips_col_Ch2ab( float C, float h, float *a, float *b ); void vips_col_Ch2ab( float C, float h, float *a, float *b );
float vips_col_L2Lucs( float L ); float vips_col_L2Lcmc( float L );
float vips_col_C2Cucs( float C ); float vips_col_C2Ccmc( float C );
float vips_col_Ch2hucs( float C, float h ); float vips_col_Ch2hcmc( float C, float h );
void vips_col_make_tables_UCS( void ); void vips_col_make_tables_CMC( void );
float vips_col_Lucs2L( float Lucs ); float vips_col_Lcmc2L( float Lcmc );
float vips_col_Cucs2C( float Cucs ); float vips_col_Ccmc2C( float Ccmc );
float vips_col_Chucs2h( float C, float hucs ); float vips_col_Chcmc2h( float C, float hcmc );
int vips_col_XYZ2sRGB( float X, float Y, float Z, int vips_col_XYZ2sRGB( float X, float Y, float Z,
int *r_ret, int *g_ret, int *b_ret, int *r_ret, int *g_ret, int *b_ret,

View File

@ -118,7 +118,7 @@ typedef enum {
* @VIPS_INTERPRETATION_CMYK: the first four bands are in CMYK space * @VIPS_INTERPRETATION_CMYK: the first four bands are in CMYK space
* @VIPS_INTERPRETATION_LABQ: implies #VIPS_CODING_LABQ * @VIPS_INTERPRETATION_LABQ: implies #VIPS_CODING_LABQ
* @VIPS_INTERPRETATION_RGB: generic RGB space * @VIPS_INTERPRETATION_RGB: generic RGB space
* @VIPS_INTERPRETATION_UCS: a uniform colourspace based on CMC * @VIPS_INTERPRETATION_CMC: a uniform colourspace based on CMC(1:1)
* @VIPS_INTERPRETATION_LCH: pixels are in CIE LCh space * @VIPS_INTERPRETATION_LCH: pixels are in CIE LCh space
* @VIPS_INTERPRETATION_LABS: CIE LAB coded as three signed 16-bit values * @VIPS_INTERPRETATION_LABS: CIE LAB coded as three signed 16-bit values
* @VIPS_INTERPRETATION_sRGB: pixels are sRGB * @VIPS_INTERPRETATION_sRGB: pixels are sRGB
@ -148,7 +148,7 @@ typedef enum {
VIPS_INTERPRETATION_CMYK = 15, VIPS_INTERPRETATION_CMYK = 15,
VIPS_INTERPRETATION_LABQ = 16, VIPS_INTERPRETATION_LABQ = 16,
VIPS_INTERPRETATION_RGB = 17, VIPS_INTERPRETATION_RGB = 17,
VIPS_INTERPRETATION_UCS = 18, VIPS_INTERPRETATION_CMC = 18,
VIPS_INTERPRETATION_LCH = 19, VIPS_INTERPRETATION_LCH = 19,
VIPS_INTERPRETATION_LABS = 21, VIPS_INTERPRETATION_LABS = 21,
VIPS_INTERPRETATION_sRGB = 22, VIPS_INTERPRETATION_sRGB = 22,

View File

@ -86,15 +86,15 @@ extern "C" {
#define im_col_ab2Ch vips_col_ab2Ch #define im_col_ab2Ch vips_col_ab2Ch
#define im_col_Ch2ab vips_col_Ch2ab #define im_col_Ch2ab vips_col_Ch2ab
#define im_col_L2Lucs vips_col_L2Lucs #define im_col_L2Lucs vips_col_L2Lcmc
#define im_col_C2Cucs vips_col_C2Cucs #define im_col_C2Cucs vips_col_C2Ccmc
#define im_col_Ch2hucs vips_col_Ch2hucs #define im_col_Ch2hucs vips_col_Ch2hcmc
#define im_col_pythagoras vips_pythagoras #define im_col_pythagoras vips_pythagoras
#define im_col_make_tables_UCS vips_col_make_tables_UCS #define im_col_make_tables_UCS vips_col_make_tables_CMC
#define im_col_Lucs2L vips_col_Lucs2L #define im_col_Lucs2L vips_col_Lcmc2L
#define im_col_Cucs2C vips_col_Cucs2C #define im_col_Cucs2C vips_col_Ccmc2C
#define im_col_Chucs2h vips_col_Chucs2h #define im_col_Chucs2h vips_col_Chcmc2h
#define PEL VipsPel #define PEL VipsPel
@ -130,7 +130,7 @@ extern "C" {
#define IM_TYPE_CMYK VIPS_INTERPRETATION_CMYK #define IM_TYPE_CMYK VIPS_INTERPRETATION_CMYK
#define IM_TYPE_LABQ VIPS_INTERPRETATION_LABQ #define IM_TYPE_LABQ VIPS_INTERPRETATION_LABQ
#define IM_TYPE_RGB VIPS_INTERPRETATION_RGB #define IM_TYPE_RGB VIPS_INTERPRETATION_RGB
#define IM_TYPE_UCS VIPS_INTERPRETATION_UCS #define IM_TYPE_UCS VIPS_INTERPRETATION_CMC
#define IM_TYPE_LCH VIPS_INTERPRETATION_LCH #define IM_TYPE_LCH VIPS_INTERPRETATION_LCH
#define IM_TYPE_LABS VIPS_INTERPRETATION_LABS #define IM_TYPE_LABS VIPS_INTERPRETATION_LABS
#define IM_TYPE_sRGB VIPS_INTERPRETATION_sRGB #define IM_TYPE_sRGB VIPS_INTERPRETATION_sRGB

View File

@ -448,7 +448,7 @@ vips_interpretation_get_type( void )
{VIPS_INTERPRETATION_CMYK, "VIPS_INTERPRETATION_CMYK", "cmyk"}, {VIPS_INTERPRETATION_CMYK, "VIPS_INTERPRETATION_CMYK", "cmyk"},
{VIPS_INTERPRETATION_LABQ, "VIPS_INTERPRETATION_LABQ", "labq"}, {VIPS_INTERPRETATION_LABQ, "VIPS_INTERPRETATION_LABQ", "labq"},
{VIPS_INTERPRETATION_RGB, "VIPS_INTERPRETATION_RGB", "rgb"}, {VIPS_INTERPRETATION_RGB, "VIPS_INTERPRETATION_RGB", "rgb"},
{VIPS_INTERPRETATION_UCS, "VIPS_INTERPRETATION_UCS", "ucs"}, {VIPS_INTERPRETATION_CMC, "VIPS_INTERPRETATION_CMC", "cmc"},
{VIPS_INTERPRETATION_LCH, "VIPS_INTERPRETATION_LCH", "lch"}, {VIPS_INTERPRETATION_LCH, "VIPS_INTERPRETATION_LCH", "lch"},
{VIPS_INTERPRETATION_LABS, "VIPS_INTERPRETATION_LABS", "labs"}, {VIPS_INTERPRETATION_LABS, "VIPS_INTERPRETATION_LABS", "labs"},
{VIPS_INTERPRETATION_sRGB, "VIPS_INTERPRETATION_sRGB", "srgb"}, {VIPS_INTERPRETATION_sRGB, "VIPS_INTERPRETATION_sRGB", "srgb"},