ImageMath 模块

ImageMath 模块可用于评估“图像表达式”,这些表达式可以接受多个图像并生成结果。

ImageMath 只支持单层图像。要处理多波段图像,请使用 split() 方法或 merge() 函数。

示例:使用 ImageMath 模块

from PIL import Image, ImageMath

with Image.open("image1.jpg") as im1:
    with Image.open("image2.jpg") as im2:
        out = ImageMath.lambda_eval(
          lambda args: args["convert"](args["min"](args["a"], args["b"]), 'L'),
          a=im1,
          b=im2
        )
        out = ImageMath.unsafe_eval(
          "convert(min(a, b), 'L')",
          a=im1,
          b=im2
        )
PIL.ImageMath.lambda_eval(expression, options, **kw)[source]

返回图像函数的结果。

参数:
  • expression – 接收字典的函数。

  • options – 要添加到函数字典的值。注意,名称必须是有效的 Python 标识符。已弃用。您可以改为使用一个或多个关键字参数,如上面的示例所示。

  • **kw – 要添加到评估上下文的值,将图像名称映射到 Image 实例。

返回:

一个图像,一个整数值,一个浮点值或一个像素元组,具体取决于表达式。

PIL.ImageMath.unsafe_eval(expression, options, **kw)[source]

评估图像表达式。

危险

这使用 Python 的 eval() 函数处理表达式字符串,并带有这样做的安全风险。不建议在不考虑这一点的情况下处理表达式。 lambda_eval() 是一个更安全的替代方案。

ImageMath 只支持单层图像。要处理多波段图像,请使用 split() 方法或 merge() 函数。

参数:
  • expression – 使用标准 Python 表达式语法的字符串。除了标准运算符外,您还可以使用下面描述的函数。

  • options – 要添加到评估上下文的值。注意,名称必须是有效的 Python 标识符。已弃用。您可以改为使用一个或多个关键字参数,如上面的示例所示。

  • **kw – 要添加到评估上下文的值,将图像名称映射到 Image 实例。

返回:

一个图像,一个整数值,一个浮点值或一个像素元组,具体取决于表达式。

表达式语法

  • lambda_eval() 表达式是接收包含图像和运算符的字典的函数。

  • unsafe_eval() 表达式是标准 Python 表达式,但它们在非标准环境中进行评估。

危险

unsafe_eval() 使用 Python 的 eval() 函数处理表达式字符串,并带有这样做的安全风险。不建议在不考虑这一点的情况下处理表达式。 lambda_eval() 是一个更安全的替代方案。

标准运算符

您可以使用标准算术运算符进行加法 (+) 、减法 (-) 、乘法 (*) 和除法 (/)。

该模块还支持一元减 (-) 、模 (%) 和幂 (**) 运算符。

请注意,所有操作都在需要时使用 32 位整数或 32 位浮点值完成。例如,如果您添加两个 8 位图像,则结果将是一个 32 位整数图像。如果您将浮点常数添加到 8 位图像,则结果将是一个 32 位浮点图像。

您可以使用下面描述的 convert()float()int() 函数强制转换。

位运算符

该模块还提供对单个位进行操作的运算。这包括与 (&) 、或 (|) 和异或 (^)。您还可以反转 (~) 所有像素位。

请注意,操作数在应用位运算之前被转换为 32 位有符号整数。这意味着如果您反转普通灰度图像,您将获得负值。您可以使用与 (&) 运算符来屏蔽掉不需要的位。

位运算符不适用于浮点图像。

逻辑运算符

andornot 这样的逻辑运算符作用于整个图像,而不是单个像素。

空图像(所有像素为零)被视为假。所有其他图像被视为真。

请注意, andor 返回最后一个评估的操作数,而 not 始终返回一个布尔值。

内置函数

这些函数应用于每个单独的像素。

abs(image)

绝对值。

convert(image, mode)

将图像转换为给定的模式。模式必须作为字符串常量给出。

float(image)

将图像转换为 32 位浮点数。这等同于 convert(image, "F")。

int(image)

将图像转换为 32 位整数。这等同于 convert(image, "I")。

请注意,如果需要获得正确的结果,1 位和 8 位图像会自动转换为 32 位整数。

max(image1, image2)

最大值。

min(image1, image2)

最小值。