Epson ICM colour management hack.
2011,I no longer have an epson printer and there are no plans to continue this project at the moment.
October 2008,After repairing my 2100P and switching to a new ink set I'm having some minor colour balance problems with my prints.
Eons ago I used an inkset called "generations G4" which was sold by "media street". This had a much colder yellow than the ultra-chrome the printer was intended to use.
The simple 3-colour slider controls can't fix this. Instead of paying big bucks for a commercial colour management system I wrote a program I called LABwarp.
LABwarp uses the novel idea of warping the colour space so you can swing (say) the yellow towards the red to warm it up. Although the colour tables are RGB the processing is done using LAB colour space.
LABwarp worked just fine for my needs until one day my highlights began to print with a pink tint. I didn't know it at the time but the problem was the light magenta ink pigment was settling out and becoming more concentrated at the bottom of the bottle where the ink pickup was.
Anyway to fix the problem I modified LABwarp to independently trim the neutrals in the highlights and shadows. This worked but it is a bit too crude.
My plan is the re-visit this code and add a lot more control points (probably ten instead of two) - done.
The code was written is delphi and ideally I'd like to convert it to c#. I ran "turnsharp" over it and once again it made a terrible mess. I don't have time to clean it up so this hack will be in delphi again.
After having two printer heads (black) written off while running G4 ink I don't trust it any more. I am now running an inkset from "MIS" AKA "ink supply". This is meant to match the original ultra-chrome but something is wrong with mine. It is possible the MIS light magenta is also settling out - I don't know what the problem is.
One reason I have had so many problems is I don't print enough. You really don't want pigment based CIS sitting around unused.
About LABwarp and ICMAt the heart of ICM files are colour lookup tables. LABwarp's main function is to create the main 3D table. The size of the table varies from profile to profile but the one shown here is 30*30*30. This table has 27,000 cells and some are much bigger than that. Clearly it is not possible to manually adjust 27,000 RGB values one by one so we need a compromise between the basic two or three controls and 27K*3 controls.
Automated system which prints patches and read them back (usually using a scanner) could correct each cell but that isn't what I'm doing.
Above is my current form for changing the CLUT generation parameters. The eleven pairs of neutral trims is new. I started with one pair, then two and now eleven.
Not that Labwarp is a CLUT generator not a CLUT editor. There is no way to convert an existing profile into warp parameters - previous CLUT values are overwritten.
Ideally there would be more controls for the warp values as well because sometimes (like now) I'd like to apply a different correction for different luminences. Obviously this would take a lot more time to adjust but maybe not as long as you may think because most controls would stay at their default values. It would take another week of work to add this and I have no plan to do so at the moment.
Shown above are five of the thirty slices through the table. We work in LAB colour space. This is a vector based system where A and B defines the direction and magnitude of the vector (ie the colour) and L is the luminence (lightness). To make the table I convert the LAB values to RGB and create these coloured layers for different luminance values. By warping and offsetting the table is various ways some common printer problems can be solved.
LABwarp provides a crude preview function so you can see what to expect. Here is an image from my office before and after it has been passed through the lookup table. Table is fairly neutral but there is still some change due to the change in image gamma. Also I do not interpolate the values so we have some banding.
To demostrate what LABwarp can do I've changed some table creation paramenters to show the results. One the right is the table generated by default values. In the middle is one where I've boosted the green saturation and right I've boosted that overall saturation. The changes are extreme to make to point, in practice the adjustments are much more subtle.
The left image shows the boosted green. The green roofs are much brighter without changing the other colours. This can't be done with simple colour controls.
On the right all the colors are boosted.
Above I've boosted the green luminence and the lighter green quadrant is obvious in the CLUT slice. The results is the greens are lighter but not more saturated.
The above shows the effect of warping the colour space. Here I've warped the red color toward the yellow. In the right image you can see the reds have been translated into orange with little affect on the other colour or the neutral tones. This was what I orginally wrote LABwarp for except I needed to warp yellow toward red.
An overall colour cast can be corrected by pushing the colour table in a particular direction in the colour space. Normally the centre of the slice will be neutral (white,grey or black) but if the printer isn't printing nuetral properly we need to push the neutral point off centre. In this example the table has been shoved to the right.
The ICM works on individual pixels. If an image uses dithering to mix colours ICM will not work as expected. For example if an image has yellow and blue pixels giving the illusion of a green patch you won't be able to used the green values in the ICM colour tables to adjust this green patch because there aren't any actual green pixels there.
Profiling ink-sets is for those dedicated to high quality printing. It takes time and many test prints to get it right, in practice I keep tweaking the profile from time to time as I do new prints that don't turn out quite how I'd like them.
The binary and source will be online in the near future.