From: <mar...@li...> - 2023-06-15 07:56:39
|
Hello, When doing this kind of things, it is important to keep in mind the real goals of the process because sometimes is very easy to get lost in details. “Linearization” is a term that I’ve seen used to a multitude of scenarios. A valid approach when profiling a printer is to do it on two steps. The first step would be to bring the particular printer to a generic well-known state. For example, by using C, M Y and K tone curves, one per output channel. Then profile this generic printer. The first step is known as “linearization”. The obvious advantage of this approach is you have not to reprofile your printer often but just recompute the curves, which is by far cheaper and faster. Another situation when the term linearization is used is when you want a profile to “match” the characteristics of a given metric. Examples of this are to create an RGB device space that behaves linearly on Luma. Some of the linearization goal metrics are intuitive, others are not. For example, when linearizing CMYK, you can use L* on all channels but on Yellow. Reason is yellow contributes poorly to L*, and is better to use b* in this case. Other metrics can be optical density or its derivatives. So, assuming you want a tone curve to make a gray device space to behave linearly with L*, you could print a scale of 10-20 patches and then measure it. With the obtained values perform reverse interpolation. For each L* you will obtain which device gray value to print. With those values build a tone curve and you got the linearization. As a test, your tone curve should match the printed values. When doing multidimensional, things go more complex though. Hope that helps Regards Marti Maria The LittleCMS Project https://www.littlecms.com From: Tamas Littmann <lit...@gm...> Sent: Wednesday, June 14, 2023 1:39 PM To: lcm...@li... Subject: [Lcms-user] Linearization Hello, I have used LCMS for image color space transforms for lots of years, but I am relatively new in creating my own profiles. Using C# and .NET, I can do most of the creating process successfully. However, it seems that I cannot move on from some of the easiest steps (I think I understand the process, but the results are not satisfactory). Here, I try to minimize the problem, and use 1D transforms (linearization curve) and Grayscale space (only 1 color). In this case, how can I linearize a black&white grayscale image/printer? Here is what I tried to do: 1. Print an equal step grayscale ramp (in grayscale mode, using 8-bit 0 - 255 values. E.g: for six steps it's 0/51/102/153/204/255). 52 steps seems to be a good starting point (steps are 0 - 5 - 10 - 15 - 20 - etc..) 2. I have an X-Rite i1 / Datacolor Spyder, so I can read the values in LAB format (saved CGATS files). 3. White Point LAB L* is usually around 94, black point LAB L* is usually from 3 - 15, depends the type of media, so i need to slice this range to equal steps to find the linear values (if i want something else, not like a linear line, but a special curve, i need to slice this range according to that curves). 4. Normalize both LAB L* data arrays to a 0.0 - 100.0 range. 5. Find the difference between the measured ones and the linear ones. 6. Used those differences to calculate LAB L* -> Grayscale values. (This is the point where I think I misunderstand something). Normally I added these difference values to the original source Gray -> LAB L* values. I can use the corrected LAB L* values to create normal output profiles, or can use the Grayscale values to create a simple DeviceLink profile. The easiest method is to use the cmsBuildTabulatedToneCurve16 with the resulting values converted to the 0 - 65535 range. (But also got advice to use an 1D LUT table, but the ToneCurves are needs to be enough) Everything seems right and works flawlessly, except the results are not (very) linear and the classic 'bullseye' images are wrong.... >From anyone who tried to do similar linearizations in the past or any hint or help would be very helpful for me. Many thanks, Tamas |