Python PILを使用して、特定の画像の色相を調整しようとしています。
グラフィックの専門用語にあまり慣れていないので、「色相の調整」とは、「色相/彩度」と呼ばれるPhotoshopの操作を行うことです</a>。これは、以下に示すように画像の色を均一に変更することです。 :
- オリジナル:
- 色相を+180(赤)に調整した場合:
- 色相を-78(緑)に調整した場合:
参考までに、Photoshopはこの色相設定に-180〜 + 180のスケール(-180は+180に等しい)を使用します。これは、HSL色相スケール(0〜360度で表される)を表す場合があります。
私が探しているのは、PIL画像と[0、1]内のfloat色相(または[0、360]内のint、それは問題ではありません)が与えられた場合、色相がシフトされた画像を返す関数です。上記の例のような色相。
私がこれまでに行ったことはばかげており、明らかに望ましい結果が得られません。元の画像を色で塗りつぶしたレイヤーと半分だけブレンドします。
import Image
im = Image.open('tweeter.png')
layer = Image.new('RGB', im.size, 'red') # "hue" selection is done by choosing a color...
output = Image.blend(im, layer, 0.5)
output.save('output.png', 'PNG')
(笑わないでください)結果:
前もって感謝します!
解決策:これが更新されたunutbuコードであり、私が説明したものに正確に適合します。
import Image
import numpy as np
import colorsys
rgb_to_hsv = np.vectorize(colorsys.rgb_to_hsv)
hsv_to_rgb = np.vectorize(colorsys.hsv_to_rgb)
def shift_hue(arr, hout):
r, g, b, a = np.rollaxis(arr, axis=-1)
h, s, v = rgb_to_hsv(r, g, b)
h = hout
r, g, b = hsv_to_rgb(h, s, v)
arr = np.dstack((r, g, b, a))
return arr
def colorize(image, hue):
"""
Colorize PIL image `original` with the given
`hue` (hue within 0-360); returns another PIL image.
"""
img = image.convert('RGBA')
arr = np.array(np.asarray(img).astype('float'))
new_img = Image.fromarray(shift_hue(arr, hue/360.).astype('uint8'), 'RGBA')
return new_img