改变图像的颜色

时间:2015-03-29 17:33:12

标签: image python-3.x colors pillow wand

使用RGB值更改整个图像颜色的最简单方法是什么?我尝试了wand,但documentation对我没有多大意义,我只能在Pillow文档中找到更改颜色的强度。

我在线尝试了多种解决方案,但要么他们没有做我想要的,要么已经过时而且没有用。

我想要它以便整个图像变得有色并且我可以通过改变RGB颜色来控制色调,如下所示:

http://cdn.makeuseof.com/wp-content/uploads/2012/11/Folder-Colorizer-Color-Manager.jpg?69fac7

我可以自己实现这个轮子,但实际变化的颜色部分让我感到困惑。希望这将是一个简单的解决方案。 :)

2 个答案:

答案 0 :(得分:2)

这是我other answer中代码的Python 3版本。它几乎完全相同,除了为了使用PIL的{​​{3}}分支而必须更改的导入(因为它只支持Python 3)。我做的其他更改是将print语句更改为函数调用,并使用map()函数创建luts查找表变量。

from PIL import Image
from PIL.ImageColor import getcolor, getrgb
from PIL.ImageOps import grayscale

def image_tint(src, tint='#ffffff'):
    if Image.isStringType(src):  # file path?
        src = Image.open(src)
    if src.mode not in ['RGB', 'RGBA']:
        raise TypeError('Unsupported source image mode: {}'.format(src.mode))
    src.load()

    tr, tg, tb = getrgb(tint)
    tl = getcolor(tint, "L")  # tint color's overall luminosity
    if not tl: tl = 1  # avoid division by zero
    tl = float(tl)  # compute luminosity preserving tint factors
    sr, sg, sb = map(lambda tv: tv/tl, (tr, tg, tb))  # per component
                                                      # adjustments
    # create look-up tables to map luminosity to adjusted tint
    # (using floating-point math only to compute table)
    luts = (tuple(map(lambda lr: int(lr*sr + 0.5), range(256))) +
            tuple(map(lambda lg: int(lg*sg + 0.5), range(256))) +
            tuple(map(lambda lb: int(lb*sb + 0.5), range(256))))
    l = grayscale(src)  # 8-bit luminosity version of whole image
    if Image.getmodebands(src.mode) < 4:
        merge_args = (src.mode, (l, l, l))  # for RGB verion of grayscale
    else:  # include copy of src image's alpha layer
        a = Image.new("L", src.size)
        a.putdata(src.getdata(3))
        merge_args = (src.mode, (l, l, l, a))  # for RGBA verion of grayscale
        luts += tuple(range(256))  # for 1:1 mapping of copied alpha values

    return Image.merge(*merge_args).point(luts)

if __name__ == '__main__':
    import os
    import sys

    input_image_path = 'Dn3CeZB.png'
    print('tinting "{}"'.format(input_image_path))

    root, ext = os.path.splitext(input_image_path)
    suffix = '_result_py{}'.format(sys.version_info[0])
    result_image_path = root+suffix+ext

    print('creating "{}"'.format(result_image_path))
    result = image_tint(input_image_path, '#383D2D')
    if os.path.exists(result_image_path):  # delete any previous result file
        os.remove(result_image_path)
    result.save(result_image_path)  # file name's extension determines format

    print('done')

图片之前和之后。 pillow和色调颜色与您在遇到问题时所说的相同。结果看起来非常类似于Py2版本,对你而言,对我来说还可以......我错过了什么?

screenshot of before and after images

答案 1 :(得分:0)

import Image
import numpy as nump

img = Image.open('snapshot.jpg')

# In this case, it's a 3-band (red, green, blue) image
# so we'll unpack the bands into 3 separate 2D arrays.
 r, g, b = nump.array(img).T

  # Let's make an alpha (transparency) band based on where blue is < 100
  a = nump.zeros_like(b)
  a[b < 100] = 255

 # Random math... This isn't meant to look good...
 # Keep in mind that these are unsigned 8-bit integers, and will overflow.
   # You may want to convert to floats for some calculations.
  r = (b + g) * 5

    # Put things back together and save the result...
  img = Image.fromarray(nump.dstack([item.T for item in (r,g,b,a)]))

   img.save('out.png')

像这样。,你可以使用numpy。

OR

你可以使用枕头。 [lnk](https://pillow.readthedocs.org/