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")

创建图像负片

实例

from PIL import Image, ImageChops

# 打开图像
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")

注意事项

  1. 图像模式:大多数 ImageChops 方法要求输入图像具有相同的模式(如 RGB、L 等)
  2. 图像大小:操作的两幅图像必须具有相同的尺寸
  3. 返回值:所有方法都返回新的 Image 对象,不会修改原始图像
  4. 性能考虑:对于大型图像,这些操作可能会消耗较多内存
  5. 特殊模式:某些方法(如逻辑操作)通常用于 1 位图像(模式为 "1")

通过合理使用 ImageChops 模块,您可以轻松实现各种图像处理效果,从简单的图像合成到复杂的特效处理。