Pillow ImageChops 模块
ImageChops 是 Python PIL (Python Imaging Library) 的一个子模块,专门用于图像通道操作("Channel Operations"的缩写)。
ImageChops 模块提供了一系列方法,可以对图像进行数学和逻辑运算,常用于图像合成、特效处理等场景。
模块特点
- 所有方法都接受两个图像作为参数,并对它们的对应像素进行操作
- 返回一个新的图像对象
- 大多数方法要求输入图像具有相同的大小和模式
- 特别适合用于图像合成、混合和特效处理
ImageChops 常用方法
以下是 ImageChops 模块中最常用的方法及其功能说明:
方法名称 | 功能描述 | 数学表达式 |
---|---|---|
add(image1, image2, scale=1.0, offset=0) | 将两幅图像相加 | out = ((image1 + image2) / scale + offset) |
subtract(image1, image2, scale=1.0, offset=0) | 将两幅图像相减 | out = ((image1 - image2) / scale + offset) |
lighter(image1, image2) | 比较两幅图像,取每个像素的较亮值 | out = max(image1, image2) |
darker(image1, image2) | 比较两幅图像,取每个像素的较暗值 | out = min(image1, image2) |
multiply(image1, image2) | 将两幅图像相乘 | out = image1 * image2 / 255 |
screen(image1, image2) | 将两幅图像进行屏幕叠加 | out = 255 - (255 - image1) * (255 - image2) / 255 |
overlay(image1, image2) | 将两幅图像进行叠加 | 根据像素值选择 multiply 或 screen 操作 |
difference(image1, image2) | 返回两幅图像的绝对差值 | out = abs(image1 - image2) |
invert(image) | 反转图像(负片效果) | out = 255 - image |
logical_and(image1, image2) | 对两幅图像进行逻辑与操作 | out = image1 & image2 |
logical_or(image1, image2) | 对两幅图像进行逻辑或操作 | out = image1 | image2 |
logical_xor(image1, image2) | 对两幅图像进行逻辑异或操作 | out = image1 ^ image2 |
blend(image1, image2, alpha) | 使用固定透明度混合两幅图像 | out = image1 * (1.0 - alpha) + image2 * alpha |
composite(image1, image2, mask) | 使用遮罩图像合成两幅图像 | 根据 mask 选择 image1 或 image2 的像素 |
offset(image, xoffset, yoffset=None) | 偏移图像 | 将图像在 x 和 y 方向上移动指定像素 |
使用示例
基本使用
实例
from PIL import Image, ImageChops
# 打开两幅图像
image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")
# 确保两幅图像大小相同
if image1.size == image2.size:
# 将两幅图像相加
added_image = ImageChops.add(image1, image2)
added_image.save("added.jpg")
# 获取两幅图像的差异
diff_image = ImageChops.difference(image1, image2)
diff_image.save("difference.jpg")
# 打开两幅图像
image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")
# 确保两幅图像大小相同
if image1.size == image2.size:
# 将两幅图像相加
added_image = ImageChops.add(image1, image2)
added_image.save("added.jpg")
# 获取两幅图像的差异
diff_image = ImageChops.difference(image1, image2)
diff_image.save("difference.jpg")
创建图像负片
实例
from PIL import Image, ImageChops
# 打开图像
original = Image.open("photo.jpg")
# 创建负片
inverted = ImageChops.invert(original)
inverted.save("negative.jpg")
# 打开图像
original = Image.open("photo.jpg")
# 创建负片
inverted = ImageChops.invert(original)
inverted.save("negative.jpg")
图像混合
实例
from PIL import Image, ImageChops
# 打开两幅图像
foreground = Image.open("foreground.png")
background = Image.open("background.jpg")
# 确保大小相同
if foreground.size == background.size:
# 混合图像 (alpha=0.5 表示各占50%)
blended = ImageChops.blend(foreground, background, 0.5)
blended.save("blended.jpg")
# 打开两幅图像
foreground = Image.open("foreground.png")
background = Image.open("background.jpg")
# 确保大小相同
if foreground.size == background.size:
# 混合图像 (alpha=0.5 表示各占50%)
blended = ImageChops.blend(foreground, background, 0.5)
blended.save("blended.jpg")
注意事项
- 图像模式:大多数 ImageChops 方法要求输入图像具有相同的模式(如 RGB、L 等)
- 图像大小:操作的两幅图像必须具有相同的尺寸
- 返回值:所有方法都返回新的 Image 对象,不会修改原始图像
- 性能考虑:对于大型图像,这些操作可能会消耗较多内存
- 特殊模式:某些方法(如逻辑操作)通常用于 1 位图像(模式为 "1")
通过合理使用 ImageChops 模块,您可以轻松实现各种图像处理效果,从简单的图像合成到复杂的特效处理。
点我分享笔记