Python图像处理之PIL


前言

PIL(Python Imaging Library)是Python图像处理库,目前PIL项目已经停止开发,最后一次更新是在2011年
强调一下:PIL不支持Python3.x

Pillow也是Python的图像处理库,与PIL区别:Pillow 是PIL特定版本Fork代码,Pillow 兼容PIL绝大多数用法,开发活跃,更主要是Pillow库支持Python3.x,所以推荐使用Pillow

  • 安装

pip install pillow

在这里插入图片描述

基本图像处理:PIL
高级图像处理:Opencv


一、pillow使用

1.1 图像创建测试

Pillow也可以新建空白图像,第一个参数是 mode即颜色空间模式,第二个参数指定了图像的分辨率(宽x高),第三个参数是颜色。

  • 可以直接填入常用颜色的名称。如’red’
  • 也可以填入十六进制表示的颜色,如#FF00O表示红色。
  • 还能传入元组,比如(255,0,0,255)或者(255,0,0)表示红色。

1.2 颜色与RGBA

RGB:Red Green Blue Alpha(透明度)
计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值。在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R、G、I B、A。整数的范围0~255。RGB全0就可以表示黑色,全255代表黑色。可以猜测
(255,0,0,255)代表红色,因为R分量最大,G、B分量为0,所以呈现出来是红色。
但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、使用步骤

2.1 Image读取测试

代码如下(示例):

frim PIL import Image

image = Image.open("dog.png")
print(img.format)
print(img.mode)
print(img.size)
img.show() #show方法显示图片
  • 输出

PNG
RGB
(600,375)

一张图片三种颜色,RGB(Red红,Green绿,Blue蓝),牛顿三元色构成,**split()**函数可以将一张图片按照颜色分解为三张图片,单个色的图片显示,默认为灰度显示图

r,g,b = img.spilt()
#单通道显示图像
b.show()

在这里插入图片描述
将原来拆分的三个颜色,打乱顺序重新组合,图片的颜色发生了改变,原来绿色图变成了红色图

# 打乱顺序,重新合并
img = Image.merge("RGB",(g,b,r))
img.show()

在这里插入图片描述

2.2 裁剪图像

Image有个crop()方法接收一个矩形区域元组(顺序是()。返回一个新的Image对象,是裁剪后的图像,对原图没有影响。
代码如下(示例):

cropimg = img.crop((100,100,400,400)) 
cropimg.show() 

在这里插入图片描述

2.3 复制与粘贴

Image的copy函数如其名会产生一个原图像的副本,在这个副本上的任何操作不会影响到原图像。paste()方法用于将一 个图像粘贴(覆盖)在另一个图像上面。谁调用它,他就在该Image对象上.直接作修改。
在这里插入图片描述
这如果之后还会用到原图的信息,由于信息被改变就很麻烦。所以paste前最好使用copy()复制一个副本,在此副本操作,不会影响到原图信息。虽然在程序里原图信息已改变,但由于保存文件时用的其他文件名,相当于改变没有生效,所以查看的时候原图还是没有改变的。

2.4 给狗拍证件照

以裁剪后的图像宽度和高度为间隔,在循环内不断粘贴在副本中,这有点像是在拍证件照。

代码如下(示例):

# 截取狗狗图片区域
cropimg = img.crop((200,120,300,220))

crop_width, crop_height = cropimg.size
width,height = img.size

copyimg = img.copy() # 副本 copyimg = img
for left in range(0,width,crop_width):
	for top in range(0,height,crop_height):
		copyimg.past(cropimg,(left,top)) # 粘贴到copyimg
		
copyimg.show()

在这里插入图片描述

2.5 调整图像大小

resize方法返回指定宽高度的新Image对象,接受一个含有宽高的元组作为参数。宽高的值得是整数。
将宽高设成一样,就成了方形图,图像被拉伸了

代码如下(示例):

width,height = img.size
resizeimg = img.resize((width,width))
resizeimg.show()

在这里插入图片描述

2.6 旋转和翻转图像

rotate返回旋转后的新 Image对象,保持原图像不变。逆时针旋转。
save可以直接保存图片

代码如下(示例):

img.rotate(90).save("rotate90.png")
img.rotate(270).save("rotate270.png")
img.rotate(20).save("rotate20.png")
img.rotate(180).save("rotate180.png")
  • 图像的镜面翻转
img.transport(Image.FLIP_LEFT_RIGHT).show()
img.transport(Image.FLIP_TOP_BOTTOM).show()

2.7 图像过滤

Pillow使用ImageFilter可以简单做到图像的模糊、边缘增强、锐利、平滑等常见操作。

代码如下(示例):

from PIL import ImageFilte

# 高斯模糊
image.filte(ImageFilter.GaussianBlur).show()
# 普通模糊
image.filte(ImageFilter.BlUR).show()
# 边缘增强
image.filte(ImageFilter.EDGE_ENHANCE).show()
# 找到边缘
image.filte(ImageFilter.FIND_EDGES).show()
# 浮雕
image.filte(ImageFilter.EMBOSS).show()
# 轮廓
image.filte(ImageFilter.CONTOUR).show()
# 锐化
image.filte(ImageFilter.SHARPER).show()
# 平滑
image.filte(ImageFilter.SMOOTH).show()
# 细节
image.filte(ImageFilter.DETAIL).show()

2.8 ImageDraw模块

ImageDraw模块提供了Draw类,它能在Image实例上进行简单的2D绘画

  • Draw类绘画函数
  • chord画弦
  • arc画弧
  • pieslice画扇形
  • ellipse画椭圆
  • line画线段/多段线
  • point点
  • polygon 画多边形
  • rectangle 画矩形
  • text 文字

三、中文验证码

3.1 随机色背景图

  • 引用库

from PIL import Image,ImageDraw
import random

代码如下(示例):

from PIL import Image,ImageDraw
import random

# 生成一张背景图,随机颜色

# 定义一个函数生成随机颜色
def randcolor():
    return (random.randint(0,255),random.randint(0,255),random.randint(0,255))

size = width,height = 240,60
img = Image.new('RGB',size,randcolor())#随机生成颜色

# 每个像素填充随机色
draw = ImageDraw.Draw(img) # 画笔
for x in range(width):
    for y in range(height):
        draw.point((x,y),fill=randcolor())

img.show()

在这里插入图片描述

3.2 随机字库

代码如下(示例):

# 定义随机字库
chars = "百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点"

def randChar():
    return chars[random.randint(0,len(chars)-1)]

3.3 模糊处理

代码如下(示例):

......
font = ImageFont.truetype(r'C:\Windows\Fonts\SIMYOU.TTF',36,)
......

# 写字 (width/4 * i + 10 ,10)这是位置不断运行 不断调整
for i in range(4):
    draw.text((width/4 * i + 10 ,10),randChar(),font=font,fill=randcolor1())

# 普通模糊处理
img = img.filter(ImageFilter.BLUR)
  • Windows字体库

在这里插入图片描述

  • 运行结果
    在这里插入图片描述

源码

猜你喜欢

转载自blog.csdn.net/HG0724/article/details/113186934
今日推荐