Python Pillow 库 Image 模块 构建图像 、 图像处理 与 Image对象方法
一、构建图像
PIL.Image.new(mode, size, color=0) 构建一个新图像
参数:
- mode – 模式,RGB, RGBA, L 等
- size – 图片大小,(width,height)
- color – 颜色,默认黑色。单波段图像传入integer或floating值;多波动图像可以时一个元组,创建RGB图像时可以使用 ImageColor 中的颜色字符串。如果color=None,则不初始化图像。
示例:创建红色 RGB 图像
from PIL import Image,ImageColor
im = Image.new('RGB', (200, 200), color="red")
im.show()
PIL.Image.fromarray(obj,mode=None) 将序列转换为图像
参数:
- obj – 数组接口对象
- mode – 图片的模式,不给出自动判断
示例1:根据二维数组创建灰度图像
from PIL import Image
import numpy as np
arr = (np.eye(300)*255) # 二维数组
im = Image.fromarray(arr) # 转换为图像
im.show()
输出结果:
示例2:使用 fromarray 将图像灰度化
from PIL import Image
import numpy as np
image = Image.open("test.jpg")
image1 = image.resize((60, 60)) # 重置图片大小
data = image1.getdata() # 将图像转换为数组序列
print(list(data)) # 查看具体数据需要使用 list() 转换
obj = []
for t in data:
obj.append([sum(t) / 3]) # 灰度方法:RGB三个分量的均值
# 变成,60 * 60 的二维数组
obj = np.array(obj).reshape((60, 60))
print(obj)
im = Image.fromarray(obj)
im.show()
PIL.Image.frombytes(mode,size,data,decoder_name='raw',*args) 根据二进制数据创建图像
注意:data 数据格式为字符串,使用 StringIO 对其进行包装并用 open 函数载入它。
参数:
- mode – 模式
- size – 图片大小,(width,height)
- data – 二进制数据
- decoder_name – 解码器
- args – 解码器的附加参数
示例:
from PIL import Image
image_width, image_height = 30, 30
# 填充占位数据
image_bytes = bytearray([0x70, 0x70, 0x70]) * image_width * image_height
i = 0
# 设置颜色渐变
for y in range(image_height):
for x in range(image_width):
image_bytes[i] = int(255.0 * (x / image_width)) # R
image_bytes[i + 1] = int(255.0 * (y / image_height)) # G
image_bytes[i + 2] = 0 # B
i += 3
image = Image.frombytes('RGB', (image_width, image_height), bytes(image_bytes))
image.show()
PIL.Image.frombuffer(mode,size,data,decoder_name='raw',*args) 根据 data 数据创建图像,与 frombytes 类似。不支持所有模式,支持的模式,“L”,“RGBX”,“RGBA”和“CMYK”
注意:如果是整张字符串格式的图片,使用 StringIO 对其进行包装并用 open 函数载入它。
参数:
- mode – 模式
- size – 图片大小,(width,height)
- data – 数据
- decoder_name – 解码器
- args – 解码器的附加参数。使用默认解码器 'raw',需提供完整的参数集:
frombuffer(mode, size, data, "raw", mode, 0, 1)
示例:
from PIL import Image
image_width, image_height = 30, 30
# 填充占位数据
image_bytes = bytearray([0x70, 0x70, 0x70]) * image_width * image_height
i = 0
# 设置颜色渐变
for y in range(image_height):
for x in range(image_width):
image_bytes[i] = int(255.0 * (x / image_width)) # R
image_bytes[i + 1] = int(255.0 * (y / image_height)) # G
image_bytes[i + 2] = 0 # B
i += 3
# 注意这里与 frombytes 的不同,无后面四个参数会出现警告信息
image = Image.frombuffer('RGB', (image_width, image_height), bytes(image_bytes), 'raw', 'RGB', 0, 1)
image.show()
二. 图像处理
PIL.Image.alpha_composite(im1,im2) 降m2融合到m1上,都必须是 RGBA 模式。
原理:im1 为底,im2 遮住 im1,在im2 透明的部位显示出 im1 的图像。
注意: im1,im2 大小必须一样,mode 必须都为 RGBA 。
示例:
from PIL import Image
im1 = Image.open('Python-logo.png') # python 官网的logo
im2 = Image.new("RGBA", im1.size, "#000000")
im3 = Image.alpha_composite(im2, im1) # 能看到 im2 的黑色背景
im3.show()
PIL.Image.blend(im1,im2,alpha) 根据 alpha 值融合,公式如下:
out = image1 * (1.0 - alpha) + image2 * alpha
参数:
- im1 与 im2 – 大小和 mode 必须相同,mode 可以不是 RGBA 。
- alpha – alpha= 0.0 返回 im1 图像,alpha= 1.0 返回 im2 图像。alpha 没严格要求,最好将他的值设置在合理范围。
示例:
from PIL import Image
im1 = Image.open('Python-logo.png') # python 官网的logo
im2 = Image.new(im1.mode, im1.size, "#000000")
im3 = Image.blend(im1, im2, 0.3)
im3.show()
输出结果:
示例素材图片:
PIL.Image.composite(image1,image2,mask) 使用透明遮罩混合头像,创建复合图像。
原理:
mack 做为蒙版,将 image1 粘贴到 image2 上。
mack 为255时,按 image1 原样 粘贴到 image2 上。
mack 为 0 时,保留 image2 原图像。
中间值将两个图像混合在一起,包括它们的alpha通道。
参数:
- im1 与 im2 – 大小和 mode 必须相同,mode 可以不是 RGBA 。
- mask – 也是图像. mode 必须为 “1”, “L”, 或 “RGBA”。并且与 im1 大小相同。
示例:
from PIL import Image
im1 = Image.open('Python-logo.png') # python 官网的logo
im2 = Image.new(im1.mode, im1.size, "#000000") # 黑色
im3 = Image.new(im1.mode, im1.size, "#FFFFFF") # 白色
im4 = Image.composite(im3, im2, im1) # 以 im1 为蒙版,将 im3 粘贴到 im2 上
im4.show()
得到结果:
PIL.Image.eval(image,*args) 根据传入的函数对图像每个像素进行处理
参数:
- image – 需处理的图像对象
- function – 函数对象,有一个整数作为参数
示例:
from PIL import Image
im = Image.new('RGB', (100, 100), '#3399EE')
box = (0, 0, 50, 100)
region = im.crop(box) # 复制部分图片
region = Image.eval(region, lambda x: x * 2) # 对像素进行处理
im.paste(region, box) # 将修改后的图片粘贴回原来位置
im.show()
输出:
PIL.Image.merge(mode,bands) 将一组单通道图像合并成多通道图像
参数:
- mode – 输出图像的 mode
- bands – 输出图像中每个通道的序列
示例:将图像的通道值更换
from PIL import Image
im = Image.new('RGB', (100, 100), '#3399EE')
box = (0, 0, 50, 100)
crop_im = im.crop(box) # 复制部分图像
r, g, b = crop_im.split() # 分离图像通道
merge_im = Image.merge('RGB', (b, r, g)) # 合并图像通道