如何在Python的PIL库中为图像应用颜色蒙版并保留光影效果?
用Pillow修改图像十字形颜色并保留立体效果
要实现保留阴影和立体效果的颜色替换,核心是基于原区域的明暗信息(亮度)来叠加目标颜色,而非直接替换单一RGB值。以下是具体实现步骤和代码:
步骤说明
- 提取十字形的亮度蒙版:利用十字区域的亮度差异生成渐变蒙版,完整保留原有的阴影、高光细节
- 融合目标颜色:基于蒙版将红色与原图像的明暗信息结合,维持立体层次感
- 输出最终图像:合并通道后导出修改后的图像
代码实现
from PIL import Image import numpy as np # 加载目标图像 img = Image.open("o6JU94A4.png").convert("RGBA") img_np = np.array(img) # 1. 生成十字区域的亮度渐变蒙版 # 计算像素亮度(RGB转灰度标准公式) gray = 0.299 * img_np[...,0] + 0.587 * img_np[...,1] + 0.114 * img_np[...,2] # 筛选十字区域并生成渐变蒙版(值越高,对应区域越接近十字核心) mask = np.where(gray > 200, gray / 255, 0) # 可根据实际图像调整阈值 # 2. 按蒙版权重混合原图像与红色,保留明暗细节 target_red = np.array([255, 0, 0], dtype=np.uint8) img_np[...,:3] = (1 - mask[...,np.newaxis]) * img_np[...,:3] + mask[...,np.newaxis] * target_red # 3. 转换回PIL图像并保存 result_img = Image.fromarray(img_np) result_img.save("red_cross.png")
关键细节
- 亮度蒙版:通过
gray > 200筛选十字区域,gray/255保留渐变过渡,让阴影部分红色更淡、高光部分更鲜艳,完全维持原有立体效果 - 加权混合:用
(1-蒙版)*原图 + 蒙版*红色的方式混合,避免直接替换颜色导致的扁平感 - 适配调整:如果十字不是纯白色,可修改亮度阈值(如
gray > 180)或调整蒙版生成逻辑(比如基于特定颜色范围)
内容的提问来源于stack exchange,提问作者Kucherov Egor
相关产品推荐
相关产品推荐

