是否有任何好的色彩映射使用python的PIL将灰度图像转换为彩色图像?

时间:2017-04-17 18:31:06

标签: python matplotlib colors python-imaging-library

Matplotlib有很多好的彩色地图,但性能不好。我正在编写一些代码来使灰度图像变得鲜艳,其中使用颜色图进行插值是一个好主意。我想知道是否有开源彩色地图或演示代码使用Pillow通过colormap将灰度图像转换为彩色图像?

澄清:

  1. Matplotlib非常适合演示使用,但对于图像的不良影响很差。
  2. Matplotlib colormaps
  3. 您可以将灰度图像映射到色彩图以获得彩色图像。
  4. 演示:

    第一张图片是灰度图像,第二张图片是“' jet' cmap,第三个是热门'。

    Matplotlib demo

    问题在于我对颜色知之甚少,并且我希望在PIL中实现这样的效果以获得更好的性能。

2 个答案:

答案 0 :(得分:6)

我想出了@ImportanceOfBeingErnest(How to convert Numpy array to PIL image applying matplotlib colormap)提到的重复答案

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

import timeit

from PIL import Image

def pil_test():
    cm_hot = mpl.cm.get_cmap('hot')
    img_src = Image.open('test.jpg').convert('L')
    img_src.thumbnail((512,512))
    im = np.array(img_src)
    im = cm_hot(im)
    im = np.uint8(im * 255)
    im = Image.fromarray(im)
    im.save('test_hot.jpg')

def rgb2gray(rgb):
    return np.dot(rgb[:,:,:3], [0.299, 0.587, 0.114])

def plt_test():
    img_src = mpimg.imread('test.jpg')
    im = rgb2gray(img_src)
    f = plt.figure(figsize=(4, 4), dpi=128)
    plt.axis('off')
    plt.imshow(im, cmap='hot')
    plt.savefig('test2_hot.jpg', dpi=f.dpi)
    plt.close()

t = timeit.timeit(pil_test, number=30)
print('PIL: %s' % t)
t = timeit.timeit(plt_test, number=30)
print('PLT: %s' % t)

表现结果是:

PIL: 1.7473899199976586
PLT: 10.632971412000188

他们都给了我与hot色彩图相似的结果。

Test Image with hot CMap

答案 1 :(得分:4)

您可以使用matplotlib中的颜色贴图并将其应用于,而无需使用任何matplotlib数据等。 这会让事情变得更快:

import matplotlib.pyplot as plt

# Get the color map by name:
cm = plt.get_cmap('gist_rainbow')

# Apply the colormap like a function to any array:
colored_image = cm(image)

# Obtain a 4-channel image (R,G,B,A) in float [0, 1]
# But we want to convert to RGB in uint8 and save it:
Image.fromarray((colored_image[:, :, :3] * 255).astype(np.uint8)).save('test.png')

注意:

  • 如果您的输入图像是浮动的,则值应该在[0.0, 1.0]区间内。
  • 如果输入图像是整数,则整数应在[0, N)范围内,其中N是地图中的颜色数。但您可以根据需要将地图重新​​取样为任意数量的值:

    # If you need 8 color steps for an integer image with values from 0 to 7:
    cm = plt.get_cmap('gist_rainbow', lut=8)