详解Python PIL ImageChops.subtract()方法

  • Post category:Python

Python PIL模块中的ImageChops模块提供了一系列图像处理的函数,其中subtract(image1, image2, scale=1.0, offset=0)函数用于对两张图像进行像素级别的减法计算,并返回一个新的Image对象。这个函数可以用于图像的差分或者减法处理,常见的应用场景包括:

  • 前后两张相似图像的差分
  • 移除相邻图片的影响

下面我们来详细讲解一下这个函数的使用。

函数参数说明

subtract函数的参数说明如下:

  • image1: 要减的图像1
  • image2: 要减的图像2
  • scale: 对差值进行缩放的比例
  • offset: 对差值进行缩放后的偏移量

函数返回值说明

subtract函数会返回一个新的Image对象,这个对象的每个像素点的值等于image1和image2相应像素点之间差的绝对值(即abs(image1-image2)),在根据scale和offset参数对差值进行缩放和偏移操作后得到的结果。

示例说明

接下来,我们通过两个简单的例子来说明subtract函数的使用。

  1. 对于两张相似的图像进行差分

假设我们有两张类似的图片A和B(如下图),我们想要得到这两张图像的差分图像C。

A | B | C

我们先使用PIL的Image模块加载这两张图片,然后使用subtract函数计算它们之间的差,并使用show()函数预览得到的差分图像:

from PIL import Image, ImageChops

# 加载图片A和B
img_a = Image.open("image_a.jpg")
img_b = Image.open("image_b.jpg")

# 计算图像A和B之间的差
diff = ImageChops.subtract(img_a, img_b)

# 预览差分图像
diff.show()

运行这段代码后,我们就可以预览到得到的差分图像C。

  1. 对图像进行移除相邻图片的影响处理

假设我们有一批带有相邻图片影响的图像(如下图),为了得到相对清晰的单张图像,我们可以先对这些图像进行差分,然后将得到的差用于当前图像的修正。

A | A-diff | A-corrected

我们可以将差分的代码封装成一个函数,并在循环中调用该函数对每张图像进行处理。

def remove_neighbor(image_path, neighbor_path):
    # 加载图片A和B
    img_a = Image.open(image_path)
    img_b = Image.open(neighbor_path)

    # 计算图像A和B之间的差
    diff = ImageChops.subtract(img_b, img_a)

    # 对差进行缩放和偏移
    corrected = ImageChops.add(img_a, diff, scale=2.0, offset=-50)

    # 返回处理后的图像
    return corrected

# 处理多张图片
for i in range(1, 11):
    # 根据文件名生成图片路径
    current_path = f"image_{i}.jpg"

    # 获取当前图片的相邻图片路径
    if i == 1:
        neighbor_path = "image_2.jpg"
    elif i == 10:
        neighbor_path = "image_9.jpg"
    else:
        neighbor_path = f"image_{i-1}.jpg"

    # 移除相邻图片的影响
    corrected = remove_neighbor(current_path, neighbor_path)

    # 保存处理后的图片
    out_path = f"corrected_image_{i}.jpg"
    corrected.save(out_path)

运行这段代码后,我们就可以得到新的处理后的图像,并保存到当前目录的文件中。