使用 Python 将颜色图/渐变图应用到图像

axe*_*axe 2 python image colors image-processing colormap

大多数图像编辑软件都具有渐变图功能。渐变贴图采用给定像素的亮度并根据亮度应用颜色渐变。Photoshop 和其他软件有办法自动执行此操作,但它们不能完全满足我的要求,所以我认为 Python 可能可以解决这个问题。不幸的是,当我使用 Python 搜索渐变图或颜色图时,我很难理解或应用出现的任何结果。

渐变图

我发现的所有潜在解决方案线程都使用了 numpy 或 matplotlib,其中有很多数学线超出了我的想象......我希望得到一些帮助。最初我对处理有一些了解,但我发现使用处理导出大量图像的任务很奇怪而且很棘手。另外,我喜欢 Python,并且想学习如何用它编辑和生成艺术作品。

这就是我现在正在做的事情。

from PIL import Image

myPalette = ['#1A1423', '#684756', '#AB8476']

def colorMap(pixel, palette): 
    # Calculate the brightness of pixel 
    R, G, B = pixel 
    brightness = sum([R, G, B])/3
 
    # Map gradient of colors to brightness
    # ???...
    
    return mappedColor

 
img = Image.open('image_input.png') 
pixels = img.load()
 
for x in range(img.size[0]): 
    for y in range(img.size[1]): 
        pixel = img.getpixel((x, y)) 
        pixels[x, y] = colorMap(pixel, myPalette)
 
img.save('image_output.png')
Run Code Online (Sandbox Code Playgroud)

加载、计算亮度和保存都很容易。我只是不知道如何将调色板的渐变应用于像素。

Mar*_*ell 5

您可以使用ImageMagick或 PIL/Numpy/OpenCV轻松完成此操作。

第一件事是获取颜色图 - 图像右侧下方的垂直条。我没有也不知道Clip Studio,所以也许它可以让您导出颜色图,或者创建灰度渐变并将颜色图应用到它,然后将结果保存为 PNG。就我而言,我将图像加载到 Photoshop 中,剪出渐变并旋转它,以生成256像素宽 x 1 像素高的图像。放大后,看起来像这样:

色彩图.png

在此输入图像描述

我还从图像的左侧裁剪了你的漩涡状物体 - 请将来单独发布图像。

漩涡.png

在此输入图像描述


现在应用它。首先,只需在终端中使用ImageMagick。我加载了您的漩涡图像并将其分成其组成的 RGB 通道,然后对通道进行平均并应用颜色图,也称为CLUT“颜色查找表”

magick swirl.png -channel RGB -separate -evaluate-sequence mean colourmap.png -clut result.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


接下来,PIL/Numpy 也是如此:

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Load image, make into Numpy array and average RGB channels
im = Image.open('swirl.png').convert('RGB')
na = np.array(im)
grey = np.mean(na, axis=2).astype(np.uint8)
Image.fromarray(grey).save('DEBUG-grey.png')   # DEBUG only

# Load colourmap
cmap = Image.open('colourmap.png').convert('RGB')

# Make output image, same height and width as grey image, but 3-channel RGB
result = np.zeros((*grey.shape,3), dtype=np.uint8)

# Take entries from RGB colourmap according to greyscale values in image
np.take(cmap.getdata(), grey, axis=0, out=result)

# Save result
Image.fromarray(result).save('result.png')
Run Code Online (Sandbox Code Playgroud)

您还可以生成分段线性颜色图,如下所示:

 magick -size 160x1 gradient:navy-"rgb(220,110,110)"   \
        -size  60x1 gradient:"rgb(220,110,110)"-yellow \
        -size  35x1 gradient:yellow-white              \
        +append colourmap.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这使得三个段各具有线性渐变:

  • 160x1 海军蓝到鲑鱼色,
  • 60x1 橙红色至黄色
  • 35x1 黄色至白色

然后将它们附加在一起。


如果将颜色图的所有段设置为相同的长度,您将得到不同的解释:

magick -size 85x1 \
   gradient:navy-"rgb(220,110,110)"   \
   gradient:"rgb(220,110,110)"-yellow \
   gradient:yellow-white +append -resize 256x1\! colourmap.png
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这导致了这样的情况:

在此输入图像描述