我在PIL库中创建了一个图像,还有第二个图像.

enter image description here

我需要拍摄第二张图像,将这个十字形(例如红色)应用到整体轮廓上. 如何正确替换 colored颜色 ,但不是直接替换(FFF到F00),而是留下阴影和三维效果?

推荐答案

以下是步骤:

  • 加载您的图像
  • 调用ImageOps.colorize(..., white='red')使图像从黑到红,而不是从黑到白
  • Image.new()创建背景图像
  • paste(..., mask=originalImage)粘贴到背景上-面膜确保您仅粘贴到原始图像不透明的背景上,而不是透明的地方

像这样:

from PIL import Image, ImageOps

# Load image
im = Image.open('cross.png')

# Colorize
red = ImageOps.colorize(im.convert('L'), black='black', white='red')
red.save('DEBUG-red.png')

# Make solid white background, same size as cross
bg = Image.new('RGB', size=im.size, color='white')

# Paste
bg.paste(red, mask=im)

DEBUG-red.png

enter image description here

result.png

enter image description here


这是一种利用HSV个色彩空间的略有不同的方法:

  • 制作单通道图像用作Hue,将其设置为HueAngular 为零,即红色
  • 制作一个单通道图像用作饱和度,将其设置为50%,这样就不会太生动了
  • 获取原始十字图像的亮度以用作价值通道
  • 合并SV通道并像以前一样粘贴

from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 0 degrees, i.e. red
Hue = Image.new('L', size=im.size, color=0)
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')

enter image description here

或者制作go 饱和的蓝色-将128更改为255以变得生动和饱和:

from PIL import Image, ImageOps
im = Image.open('cross.png')
brightness = im.convert('L')
# Set Hue angle to 240 degrees scaled to unsigned char range
Hue = Image.new('L', size=im.size, color=int(240*255/360))
# Set Saturation to 50%, not too vivid
Sat = Image.new('L', size=im.size, color=128)
coloured = Image.merge('HSV', (Hue, Sat, brightness)).convert('RGB')
coloured.save('DEBUG-coloured.png')
bg = Image.new('RGB', size=im.size, color='white')
bg.paste(coloured, mask =im)
bg.save('result.png')

enter image description here

Python相关问答推荐

Python-Polars:如何用两个值的平均值填充NA?

流畅的模式,采用Escc方法

如何判断. text文件中的某个字符,然后读取该行

Python中两个矩阵的自定义Hadamard风格产物

在Python中使用一行try

使用LineConnection动画1D数据

比较两个数据帧并并排附加结果(获取性能警告)

如何将ctyles.POINTER(ctyles.c_float)转换为int?

处理(潜在)不断增长的任务队列的并行/并行方法

发生异常:TclMessage命令名称无效.!listbox"

加速Python循环

当我try 在django中更新模型时,模型表单数据不可见

索引到 torch 张量,沿轴具有可变长度索引

CommandeError:模块numba没有属性generated_jit''''

基于行条件计算(pandas)

以逻辑方式获取自己的pyproject.toml依赖项

Flask Jinja2如果语句总是计算为false&

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

在matplotlib中使用不同大小的标记顶部添加批注