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 位有符号整数。这意味着如果您反转普通灰度图像,您将获得负值。您可以使用与 (&) 运算符来屏蔽掉不需要的位。
位运算符不适用于浮点图像。
逻辑运算符¶
像 and
、 or
和 not
这样的逻辑运算符作用于整个图像,而不是单个像素。
空图像(所有像素为零)被视为假。所有其他图像被视为真。
请注意, and
和 or
返回最后一个评估的操作数,而 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)
最小值。