Python Pillow(PIL) 图像处理(分离、合并、裁剪、几何变换)

Pillow(PIL)是Python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。PIL 模块全称为 Python Imaging Library,是Python中一个免费的图像处理模块。PIL 仅支持到 Python 2.7。Python3用的是PIL的兼容版本Pillow。本文主要介绍Pillow(PIL) 图像处理(分离、合并、裁剪、几何变换、拷贝和粘贴)。

1、Pillow(PIL)的安装及常用操作

参数文档:Python Pillow(PIL)安装及Image 类的使用

2、图像分离与合并

图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位。图像的分离与合并,指的就是图像颜色的分离和合并。

在PIL 1.1.4及其以后的版本,用户绘制“RGB”图像时,可以使用字符串常量。PIL支持如下字符串格式:

  • 十六进制颜色说明符,定义为#rgb或者#rrggbb。例如,#ff0000表示纯红色。
  • RGB函数,定义为rgb(red, green, blue),变量red、green、blue的取值为[0,255]之间的整数。另外,颜色值也可以为[0%,100%]之间的三个百分比。例如,rgb(255, 0, 0)rgb(100%, 0%, 0%)都表示纯红色。
  • HSL(Hue-Saturation-Lightness)函数,定义为hsl(hue,saturation%, lightness%),变量hue为[0,360]一个角度表示颜色(red=0, green=120, blue=240),变量saturation为[0%,100%]之间的一个值(gray=0%,full color=100%),变量lightness为[0%,100%]之间的一个值(black=0%, normal=50%, white=100%)。例如,hsl(0,100%, 50%)为纯红色。
  • 通用HTML颜色名称,ImageDraw模块提供了140个标准颜色名称,Xwindow系统和大多数web浏览器都支持这些颜色。颜色名称对大小写不敏感。例如,redRed都表示纯红色。

1)split 方法

split() 的使用方法比较简单,用来分离颜色通道。

例如,

from PIL import Image

img = Image.open("C:/cjavapy.jpg")
r, g, b = img.split()  # split 方法使用较简单,分离通道
r.show()
g.show()
b.show()

2)merge 方法

Image 类提供的 merge() 方法可以实现图像的合并操作。图像合并,可以是单个图像合并,也可以合并两个以上的图像。

例如,

"""参数:
mode:指定输出图片的模式
bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r, g, b)
"""
from PIL import Image

img = Image.open("C:/cjavapy.jpg")
#修改图像大小,以适应图像处理
image  =im.gresize((450,400))
image.save("D:/cjavapy.jpg")
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
#重新组合颜色通道,返回先的Image对象
image_merge=Image.merge('RGB',(b,g,r))
image_merge.show()
#保存图像
image_merge.save("F:/cjavapy.jpg")

3)blend 方法

Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式)。

"""
参数:
image1:图片对象1
image2:图片对象2
alpha:透明度 ,取值范围为 0 到 1,当取值为 0 时,输出图像相当于 image1 的拷贝,而取值为 1 时,则是 image2 的拷贝,只有当取值为 0.5 时,才为两个图像的中合。因此改值的大小决定了两个图像的混合程度
"""
from PIL import Image

im1 = Image.open("D:/cjavapy.png")
image = Image.open("D:/cjavapy.png")
im2=image.resize(im1.size)
def blend_im(im1,im2):
#设置 alpha 为 0.5
Image.blend(im1,im2,0.5).save("F:/cjavapy.png")
#调用函数
blend_im(im1,im2)

3、图像裁剪、拷贝和粘贴

Image 类提供的crop()函数允许我们以矩形区域的方式对原图像进行裁剪,拷贝、粘贴操作几乎是成对出现的,Image 类提供了copy()paste() 方法来实现图像的复制和粘贴。

1)裁剪

"""
box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位
"""
from PIL import Image

img = Image.open("D:/cjavapy.png")
box =(0,0,200,100)
im_crop = img.crop(box)
im_crop.show()

2)拷贝和粘贴

"""
参数:
image:指被粘贴的图片
box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x, y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致
mask:可选参数,为图片添加蒙版效果
注意:
粘贴后的图片模式将自动保持一致,不需要进行额外的转换
"""
from PIL import Image

img = Image.open("D:/cjavapy.png")
#复制一张图片副本
im_copy=img.copy()
#对副本进行裁剪
im_crop = im_copy.crop((0,0,200,100))
#创建一个新的图像作为蒙版,L模式,单颜色值
image_new = Image.new('L', (200, 100), 200)
#将裁剪后的副本粘贴至副本图像上,并添加蒙版
im_copy.paste(im_crop,(100,100,300,200),mask=image_new)
#显示粘贴后的图像
im_copy.show()

4、几何变换

图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform()。

1)transpose()图像翻转

"""
method 参数如下:
Image.FLIP_LEFT_RIGHT:左右水平翻转;
Image.FLIP_TOP_BOTTOM:上下垂直翻转;
Image.ROTATE_90:图像旋转 90 度;
Image.ROTATE_180:图像旋转 180 度;
Image.ROTATE_270:图像旋转 270 度;
Image.TRANSPOSE:图像转置;
Image.TRANSVERSE:图像横向翻转。
"""
from PIL import Image

img = Image.open("D:/cjavapy.png")
#返回一个新的Image对象
im_out=im.transpose(Image.FLIP_LEFT_RIGHT)
im_out.show()
im_out.save("F:/cjavapy.png")

2)rotate()任意角度旋转

"""
rotate()参数如下:
angle:表示任意旋转的角度;
resample:重采样滤波器,默认为 PIL.Image.NEAREST 最近邻插值方法;
expand:可选参数,表示是否对图像进行扩展,如果参数值为 True 则扩大输出图像,如果为 False 或者省略,则表示按原图像大小输出;
center:可选参数,指定旋转中心,参数值是长度为 2 的元组,默认以图像中心进行旋转;
translate:参数值为二元组,表示对旋转后的图像进行平移,以左上角为原点;
fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。
"""
from PIL import Image

img = Image.open("D:/cjavapy.png")
#translate的参数值可以为负数,并将旋转图之外的区域填充为绿色
#返回同一个新的Image对象
im_out=img.rotate(45,translate=(0,-25),fillcolor="green")
im_out.show()
im_out.save("F:/cjavapy.png")

3)transform()图像变换

"""
transform()参数如下:
size:指定新图片的大小;
method:指定图片的变化方式,比如 Image.EXTENT 表示矩形变换;
data:该参数用来给变换方式提供所需数据;
resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST。
"""
from PIL import Image

img = Image.open("D:/cjavapy.png")
#设置图像大小250*250,并根据data的数据截取原图像的区域,生成新的图像
im_out=img.transform((250,250),Image.EXTENT,data=[0,0,30 + img.width//4,img.height//3])
im_out.show()
im_out.save("F:/cjavapy.png")

相关文档:

Python Pillow(PIL) ImageFilter和ImageColor的使用

Python Pillow(PIL)安装及Image 类的使用

推荐阅读
cjavapy编程之路首页