11
votes

I need to convert an image from CMYK to RGB in python. I used Pillow in this way:

img = Image.open('in.jpg')
img = img.convert('RGB')
img.save('out.jpg')

The code works, but if I convert the same image with Photoshop I have a different result as shown below:-

a

The only operation done in photoshop is to change method from CMYK to RGB. Why there is this difference between the two RGB images? It can be a color profile problem?

1
Jgeg images always use YCbCr as color format so this conversion is superfluous - it looks like photoshop knows this and doesnt touch the image but pillow naively compresses the image normally on saving (adding compression artifacts) - janbrohl
Also pillow possibly does not take an embedded ICC profile into account changing the colors of the image a bit. - janbrohl

1 Answers

14
votes

SOLVED

The problem is that Pillow does not know the input ICC profile, while photoshop had one set as default.

Photoshop use for

CMYK: U.S. Web Coated (SWOP) v2

RGB: sRGB IEC61966-2.1

So I've solved in this way:

img = Image.open('in.jpg')
img = ImageCms.profileToProfile(img, 'USWebCoatedSWOP.icc', 'sRGB Color Space Profile.icm', renderingIntent=0, outputMode='RGB')
img.save('out.jpg', quality=100)

On Windows the profiles can be found (if installed) in these folders:

C:\Windows\System32\spool\drivers\color\USWebCoatedSWOP.icc
C:\Program Files (x86)\Common Files\Adobe\Color\Profiles\Recommended\USWebCoatedSWOP.icc
C:\Program Files (x86)\Adobe\Acrobat DC\Resource\Color\Profiles\Recommended\USWebCoatedSWOP.icc

C:\Windows\System32\spool\drivers\color\sRGB Color Space Profile.icm
C:\Program Files (x86)\Common Files\Adobe\Color\Profiles\Recommended\sRGB Color Space Profile.icm
C:\Program Files (x86)\Adobe\Acrobat DC\Resource\Color\Profiles\Recommended\sRGB Color Space Profile.icm