Color Management with ICC Profiles on CUDA and OpenGL

It's not enough to create high quality camera for imaging application - one have to design powerfull software to be able to render images from the camera and to be able to reproduce colors in a right way. Here comes a question about color management, ICC profiles and related matters. To take these things into account we incorporate Color Management System for image processing and make it fast. We have done that on GPU with CUDA technology.

Calculations of camera gamut gives opportunity to evaluate ability to reproduce right colors by the camera. This is the problem which happens quite often: if you need to replace color camera with a new one, you can't be sure that colors on a new camera will be the same as it used to be. Right solution for that task is camera calibration with ColorChecker to create its own ICC profile. The software should be able to have color management to reproduce right colors.

Standard workflow according to ICC includes color transform from Input Device Color Space (camera) to PCS (Profile Connection Space) and then transform from PCS to Output Device Color Space (monitor). PCS is the reference colour space in which colors are encoded in order to provide an interface for connecting source and destination transforms. The PCS values constitute an encoding of a CIE colorimetric specification.

Our Color Management software supports ICC v4 profile-based color management, including support for calibrated and profiled displays. Software engine doesn't use Windows Color System (WCS) which is available on Windows Vista and later operating systems.

ICC V4 logoColor Management Workflow

  • Monitor color calibration with i1 Photo (X-Rite) spectrophotometer to create ICM-profile
  • Camera color calibration with ColorChecker to create ICC-profile
  • Parcing of camera and monitor profiles
  • Extraction of all necessary data from icc/icm-profiles
  • Color transform with input profile (PCSLAB camera profile)
    • Transform with Input curves
    • Transform with CLUT (transform from linear RGB to La*b* space)
    • Transform with Output curves
    • Transform from La*b* to XYZ profile connection space
  • Color transform from XYZ to output profile (PCSXYZ monitor profile)
    • Reverse matrix transform from XYZ to RGB
    • Reverse linearization transform with reverse TRC
    • Image output to monitor via OpenGL
  • Color transform from XYZ to sRGB output profile (standard sRGB profile)
    • Reverse matrix transform from XYZ to sRGB
    • Reverse linearization transform with reverse TRC
    • Save image to HDD (optional compression to JPEG)


Output profiles of monitor and sRGB are different and it means that we can't save on HDD and show on the screen the same data. In most cases, when we apply monitor and sRGB profiles to the same input data, we get different results. It's really easy to check whether this is true or not. You can open JPEG image with GIMP or other software with color management support and choose Edit/Parameters/Color Management menu and then apply sRGB or monitor profile. If you have done monitor color calibration and got its profile, you will clearly see the difference.

     Home                   Contacts                 Site Map
GPU Image Processing