のような RGB 10 進数がある場合255, 165, 0
、これを CMYK に変換するにはどうすればよいですか?
例えば:
>>> red, green, blue = 255, 165, 0
>>> rgb_to_cmyk(red, green, blue)
(0, 35, 100, 0)
これはJavascript 実装の Python ポートです。
RGB_SCALE = 255
CMYK_SCALE = 100
def rgb_to_cmyk(r, g, b):
if (r, g, b) == (0, 0, 0):
# black
return 0, 0, 0, CMYK_SCALE
# rgb [0,255] -> cmy [0,1]
c = 1 - r / RGB_SCALE
m = 1 - g / RGB_SCALE
y = 1 - b / RGB_SCALE
# extract out k [0, 1]
min_cmy = min(c, m, y)
c = (c - min_cmy) / (1 - min_cmy)
m = (m - min_cmy) / (1 - min_cmy)
y = (y - min_cmy) / (1 - min_cmy)
k = min_cmy
# rescale to the range [0,CMYK_SCALE]
return c * CMYK_SCALE, m * CMYK_SCALE, y * CMYK_SCALE, k * CMYK_SCALE
しかし、完全なイメージを RGB2CMYK に変換したり、その逆の変換は次のように簡単です。
from PIL import Image
image = Image.open(path_to_image)
if image.mode == 'CMYK':
rgb_image = image.convert('RGB')
if image.mode == 'RGB':
cmyk_image = image.convert('CMYK')
フーズ氏の実装のフォローアップ。
CMYK には 2 つの可能な実装があります。プロポーションが余白 (GIMP などで使用される) に関するものと、Fooz 氏によって実装されたものがありますが、CMYK の別の実装 (LibreOffice などで使用される) もあります。全色空間に対する色の割合。また、CMYK を使用して絵の具やインクの混合をモデル化する場合は、各色の重み (半分半分の混合の場合は 0.5) を使用して色を線形に追加できるため、2 番目の方法よりも優れている可能性があります。
以下は、逆変換を使用した CMYK の 2 番目のバージョンです。
rgb_scale = 255
cmyk_scale = 100
def rgb_to_cmyk(r,g,b):
if (r == 0) and (g == 0) and (b == 0):
# black
return 0, 0, 0, cmyk_scale
# rgb [0,255] -> cmy [0,1]
c = 1 - r / float(rgb_scale)
m = 1 - g / float(rgb_scale)
y = 1 - b / float(rgb_scale)
# extract out k [0,1]
min_cmy = min(c, m, y)
c = (c - min_cmy)
m = (m - min_cmy)
y = (y - min_cmy)
k = min_cmy
# rescale to the range [0,cmyk_scale]
return c*cmyk_scale, m*cmyk_scale, y*cmyk_scale, k*cmyk_scale
def cmyk_to_rgb(c,m,y,k):
"""
"""
r = rgb_scale*(1.0-(c+k)/float(cmyk_scale))
g = rgb_scale*(1.0-(m+k)/float(cmyk_scale))
b = rgb_scale*(1.0-(y+k)/float(cmyk_scale))
return r,g,b
この変換を有効にするには、変換対象の RGB システムと CMYK システムを記述するプロファイルを備えたカラー管理システムが必要です。
http://en.wikipedia.org/wiki/CMYK_color_model#Conversion
ここでは、ICC プロファイルを使用してこの問題を解決する方法について説明します。
一連の任意のピクセル値 (画像データ構造ではなく) に対して ICC プロファイルを使用して色変換を実行するにはどうすればよいですか?
ICC カラー プロファイルを使用して変換を行う pyCMS へのリンクを次に示します。
bisounours_tronconneuse によって提供される逆計算を使用してみましたが、CMYK (96 63 0 12) では失敗しました。結果は次のようになります:
w3schools javascript (コードはこちら) を python に変換すると、以下のコードは正しい結果を返すようになりました。
def cmykToRgb(c, m, y, k) :
c=float(c)/100.0
m=float(m)/100.0
y=float(y)/100.0
k=float(k)/100.0
r = round(255.0 - ((min(1.0, c * (1.0 - k) + k)) * 255.0))
g = round(255.0 - ((min(1.0, m * (1.0 - k) + k)) * 255.0))
b = round(255.0 - ((min(1.0, y * (1.0 - k) + k)) * 255.0))
return (r,g,b)