The present use case goes something like this:

We are a super color critical shop, with modern digital large format printers of just about every type you can imagine: UV to board or roll. Latex. Fabric dye sub. Aqueous inkjet to photographic paper. You name it, we have it.

Client has a specific color we are trying to match. We print a swatch of that color on a printer using Adobe98 RGB values that come from Photoshop or similar. We then read the LAB value of our swatch. We take the delta between the two readings of each LAB coordinate. We then apply that delta to generate a new LAB value. We take that new LAB value and convert it back to Adobe98, and print another swatch. Rinse and repeat until we are as close as we can get.

Occasionally, we will use LCH instead of LAB, which is useful in that it can maintain the perceptive hue of a color across a range of lightness values. In LAB a color's chroma, as perceived by human vision, can skew as lightness changes.

In all of the above, we log every round in a spreadsheet. Sometimes we are trying to match a color that cannot be achieved in RGB. This is usually deep higher-density blues. For those we need to specify our colors in CMYK because they are out of gamut for Adobe98, but still in gamut of our presses.

My python script is tied into Excel on Mac, using a VBA macro via an AppleScript bridge so they can do these conversions automatically. Just enter the deltas on the LAB coordinates, the starting RGB or CMYK value, and the rest is calculated and filled in.

Colormath works fine for the RGB math, but only because it is using relative colorimetric conversions, with a 2 degree observer. But for CMYK, it is completely wrong. It is not using any standard CMYK profile, but is doing some sort of generic conversion that does 100% GCR, where the CMY grayscale component is completely replaced by the equivalent amount of black.

A proper CMYK conversion requires the use of a ICC profiles that have a specific GCR or UCR curve which specifies how much CMY is used for the grey value at any given percentage of grey. This is necessary because if only black ink is used for the grey component, black ink is not enough to print a pleasing image at lighter grey values. There are several standard CMYK profiles. In the US the two most common are US Web Coated SWOP, and GRACoL.

To do conversions between LAB and one of theses CMYK colorspaces requires the use of an color management engine that utilizes ICC profiles to do the conversion. LittleCMS is one such (open source) engine.

By using lcms, not only can I now do conversions in an CMYK ICC space, but also other RGB spaces that colormath does not support, such as ProPhoto or BetaRBG. In addition, I can specify other rendering intents and white points for the conversion. With LittleCMS you can do anything. Remarkably, it even supports hifi color profiles, meaning CMYK plus additional channels of ink, such as orange, green and violet. It supports up to 12-channel profiles, which is remarkable for a free library. In practice, we don't need those for color matching, because even though we have 7-channel presses (if you count white ink), the conversion, say, from RGB to CMYKOG is done in the press RIP.