Вы можете позволить PIL / Pillow сделать это для вас следующим образом:
from PIL import Image
# Open image, convert to CMYK and save as TIF
Image.open('drtrump.jpg').convert('CMYK').save('result.tif')
Если я использую IPython
, я могу загружать, конвертировать и сохранять время в 13мс всего вот так:
%timeit Image.open('drtrump.jpg').convert('CMYK').save('PIL.tif')
13.6 ms ± 627 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Если вы хотите сделать это самостоятельно, внедрив формулу, вам лучше использовать векторизация Numpy, а не for
циклы , Это занимает 35 мс.
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image
bgr = cv2.imread('drtrump.jpg')
# Make float and divide by 255 to give BGRdash
bgrdash = bgr.astype(np.float)/255.
# Calculate K as (1 - whatever is biggest out of Rdash, Gdash, Bdash)
K = 1 - np.max(bgrdash, axis=2)
# Calculate C
C = (1-bgrdash[...,2] - K)/(1-K)
# Calculate M
M = (1-bgrdash[...,1] - K)/(1-K)
# Calculate Y
Y = (1-bgrdash[...,0] - K)/(1-K)
# Combine 4 channels into single image and re-scale back up to uint8
CMYK = (np.dstack((C,M,Y,K)) * 255).astype(np.uint8)
Если вы хотите проверить свои результаты, вам нужно знать о нескольких вещах. Не все форматы изображений могут сохранять CMYK, поэтому я сохранил как TIFF. Во-вторых, ваша формула оставляет все ваши значения в виде значений с плавающей запятой в диапазоне 0..1, так что вы, вероятно, захотите уменьшить масштаб путем умножения на 255 и преобразования в uint8.
Наконец, вы можете быть уверены в том, что правильно В результате просто используйте ImageMagick в Терминале:
magick drtrump.jpg -colorspace CMYK result.tif