python的PIL库

一:PIL功能介绍与安装

PIL,全称Python Image Library,主要作用是图像处理,可用于图片剪切、粘贴、缩放、镜像、水印、颜色块、滤镜、图像格式转换、色场空间转换、验证码、旋转图像、图像增强、直方图处理、插值和滤波等功能。不过只支持到Python 2.7。Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库。我们需要安装的就是Pillow。

PIL具体用途:

  • 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
  • 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
  • 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。

pip install Pillow

貌似Pillow是默认安装好了的,可以通过pip list查看是否已经安装

二:PIL的基本操作

以下是打开图片保存图片的基本操作。

1

2

3

4

5

6

7

8

from PIL import Image

# 1.打开图片

img = Image.open("image/10.jpg")

# 2.显示图片(执行显示图片后线程会中断,关闭图像后恢复)

img.show()

# 3.保存图片

img.save("image/xiaomai.jpg")

python的PIL库_第1张图片

我在尝试的过程中发现,jpg格式的图片保存为jpg格式时会报错:OSError: cannot write mode RGBA as JPEG,经过查阅资料发现错误原因主要是因为jpg格式和JPG格式图片的通道数不同。

  • jpg是四通道:RGBA意思是红色,绿色,蓝色,Alpha的色彩空间,Alpha指透明度
  • JPG是三通道:RGB意思是红色,绿色,蓝色

所以,jpg格式图片要保存成JPG格式就要丢弃A通道:

1

2

3

4

5

6

7

8

9

from PIL import Image

# 1.打开图片

img = Image.open("image/10.jpg")

# 2.显示图片(执行显示图片后线程会中断,关闭图像后恢复)

img.show()

# 3.保存图片

img = img.convert("RGB")

img.save("image/xiaomai.jpg")

python的PIL库_第2张图片

下面是图片旋转的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from PIL import Image

# 1.打开图片

img = Image.open("pli/7.jpg")

# 2.水平翻转

img1 = img.transpose(Image.FLIP_LEFT_RIGHT)

# 3.保存图片

img1.save("pli/1.jpg")

# 4.垂直翻转

img2 = img.rotate(180)

# 5.保存照片

img2.save("pli/2.jpg")

# 6.水平+垂直翻转

img3 = img.transpose(Image.FLIP_LEFT_RIGHT).rotate(180)

# 7.保存图片

img3.save("pli/3.jpg")

python的PIL库_第3张图片

三:给图片增加文字

要在图像上绘制文本要用到 PIL 的两个模块:ImageDraw和ImageFont。 ImageDraw 用于创建绘图对象,ImageFont用于加载字体。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from PIL import Image, ImageDraw, ImageFont

# 1.打开图片

img = Image.open("image/10.jpg")

# 2.调用画图模块

draw = ImageDraw.Draw(img)

# 3.设置字体

tfont = ImageFont.truetype("萌神手写体.ttf", 24)

# 4.添加文字

"""

    参数一:文字在图片的位置:(x, y)

    参数二:文字内容

    参数三:字体颜色,当然颜色也可以用RGB值指定

    参数四:字体类型

"""

draw.text((50, 30), "eyes++", fill="green", font=tfont)

# 5.保存图片

img.save("image/addWord.jpg")

# 6.显示图片

img.show()

python的PIL库_第4张图片

四:PIL滤镜功能

1

2

3

4

5

from PIL import Image, ImageFilter

img = Image.open("image/10.jpg")

img = img.filter(ImageFilter.CONTOUR)

img.save("image/Filter.jpg")

img.show()

python的PIL库_第5张图片

滤镜类型如下:

python的PIL库_第6张图片

五:PIL镜像功能

1

2

3

4

from PIL import Image

img = Image.open("image/10.jpg")

img = img.transpose(Image.FLIP_LEFT_RIGHT)

img.save("image/mirror.jpg")

python的PIL库_第7张图片

transpose

有这么几种模式

  • FLIP_LEFT_RIGHT:左右镜像
  • FLIP_TOP_BOTTOM:上下镜像
  • ROTATE_90:逆时针转90度
  • ROTATE_180:逆时针转180度
  • ROTATE_270:逆时针转270度
  • TRANSPOSE:像素矩阵转置
  • TRANSVERSE

最后一种模式我也不知道什么意思,也没查到,但效果是下面这样的,盲猜是对角线对转。。。。。

python的PIL库_第8张图片

除了使用transpose制造镜像,使用rotate也可以的,不过rotate只能旋转:

python的PIL库_第9张图片

发现这样旋转会有棱角,然后经过某位不愿透露姓名的大佬指点,发现是rotate旋转只是像素旋转,画布不动,于是我写下了以下测试代码:

1

2

3

4

5

6

7

from PIL import Image

img = Image.open("image/12.jpg")

img1 = img.transpose(Image.ROTATE_90)

img1.save("image/test.jpg")

img2 = img.rotate(90)

img2.save("image/test2.jpg")

python的PIL库_第10张图片

可以发现小埋的rotate旋转不会自动填充空白像素,而血小板的会自动黑色填充。是因为jpg格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性。而jpg格式没有阿尔法通道,因此jpg格式图片不能为透明,jpg格式可以。

六:图片拼接功能

虽说是拼接,但更像是将两幅图粘贴到一个新的画布上

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from PIL import Image, ImageDraw

# 打开图片

img1 = Image.open("image/10.jpg")

img2 = Image.open("image/addWord.jpg")

# 查看图片尺寸,便于拼接图片

print(img1.size)

print(img1.size)

# 新建空白图片,三个参数分别是模式(RGB/RGBA)、大小、颜色

newimg = Image.new(mode="RGB", size=(1174, 614), color=(255, 100, 50))

# 拼接图片,第一个参数是图片,第二个是起始位置

newimg.paste(img1, (0, 0))

newimg.paste(img2, (587, 0))

newimg.show()

python的PIL库_第11张图片

七:PIL裁剪功能

图片裁剪用到的方法是image.crop(),这个方法能从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。

1

2

3

4

5

from PIL import Image

img = Image.open("image/10.jpg")

print(img.size)

imgCut = img.crop((100, 200, 500, 600))

imgCut.show()

在这里插入代码片

python的PIL库_第12张图片

八:图片缩放

可能这么看不是二分之一,但这是显示问题,可以看数据:

1

2

3

4

5

6

7

8

9

10

from PIL import Image

# :

img = Image.open('image/10.jpg')

# 获得图像尺寸:

w, h = img.size

# 缩放到50%:

img.thumbnail((w//2, h//2))

# 把缩放后的图像用jpeg格式保存:

img.save('image/zoom.jpg')

python的PIL库_第13张图片

文章转自:  ​​​​​​​https://www.jb51.net/article/225452.htm

你可能感兴趣的:(Pyhon,计算机视觉,python,图像处理)