文章目录
前言
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字体库
- 运行结果