本文索引:
- Pillow图像处理库(概述、主要功能、常用操作)
- 图像处理实战(验证码生成实战)
本文所需文件自提:
链接:https://pan.baidu.com/s/1z2QvrOxphVJT79Rva_kOkg
提取码:eg4g
一、Pillow扩展库
【Pillow扩展库概述】
- PIL(Python Imaging Library)是Python常用的图像处理图像库,功能非常强大,API简单易用。
- 但PIL仅支持到Python2.7,加上年久失修。
- 一群志愿者在PIL的基础上创建了PIL 的兼容版本,名字叫Pillow,支持最新版Python 3.x,并加入许多新特性。
- Pillow提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。
【Pillow扩展库主要功能】
- 图像归档:对图像进行批处理、生成图像预览,图像格式转换等。
- 图像处理:图像基本处理、像素处理、颜色处理。
【Pillow扩展库主要操作】
- 在Pillow中,任何一个图像文件都可以用Image对象表示。
- Image类的图像读取和创建方法。
方法 描述 Image.open(filename) 根据参数加载图像文件 Image.new(mode,size,color) 根据给定参数创建一个新的图像 Image.open(StringIO.StringIO(buffer)) 从给定字符串中获取图像 Image.frombytes(mode,size,data) 根据像素点data创建图像 Image.verfy() 对图像文件完整性进行检查,返回异常
- Image类有四个处理图片的常用属性
属性 描述 Image.format 标识图像格式或来源,如果图像不是从文件读取,值是None Image.mode 图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、"CMYK"出版图像 Image.size 图像宽度和高度,单位是像素(px),返回值是二元元组(tuple) Image.palette 调色板属性,返回一个ImagePalette类型 看示例:
# Pillow扩展库缩略图示例
from PIL import Image
im = Image.open("E:\Python大战机器学习\第三部分 Python编程进阶\code 4、图像处理实战\img0.jpg")
im.thumbnail((128,128))
im.save("img0TN副本.JPEG","JPEG")
原始图像:

注意,这里需要指定文件的绝对路径,特别是打开文件时,保存时如果不指定就保存在jupyter notebook网页主页

转换后的缩略图打开是这样的:

【Pillow扩展库主要操作】
- Image类能够对每个像素点或者一幅RGB图像的每个通道单独进行操作,split()方法能够将RGB图像个颜色通道提取出来,merge()方法能够将各独立通道再合成一幅新的图像。
方法 描述 Image.point(func) 根据函数func功能对每个元素进行运算,返回图像副本 Image.split() 提取RGB图像的每个颜色通道,返回图像副本
Image.merge(mode,bands) 合并通道,采用mode色彩,bands是新色的色彩通道 Image.blend(im1,im2,alpha) 将两幅图片im1和im2按照如下公式插值后生成新的图像:
im1*(1.0-alpha)+im2*alpha
看下面这个颜色变换的例子,
# 颜色变换实例
from PIL import Image
im = Image.open('E:\Python大战机器学习\第三部分 Python编程进阶\code 4、图像处理实战\img1.jpg')
r,g,b = im.split()
om = Image.merge("RGB",(b,g,r))
om.save('img1BGR.JPG')
我们来看下对比:
原始图片:

颜色变换后文件:

原始图片:

from PIL import Image
im = Image.open('E:\Python大战机器学习\第三部分 Python编程进阶\code 4、图像处理实战\img1.jpg')
r,g,b = im.split() # 获取RGB通道数据
newr = g.point(lambda i:i*0.9)
newg = g.point(lambda i:i<200) # 选择g通道值低于200的像素点
newb = b.point(lambda i:i)
om = Image.merge(im.mode,(newr,newg,b)) # 将3个通道合成新图像
om.save('img1Merge.jpg')
通道颜色变换:

【Pillow扩展库主要操作】
- PIL库的ImageFilter提供的过滤图像方法
方法表示 描述 ImageFilter.BLUR 图像的模糊效果 ImageFilter.CONTOUR 图像的轮廓效果 ImageFilter.DETAIL 图像的细节效果 ImageFilter.EDGE_ENHANCE 图像的边界加强效果 ImageFilter.EDGE_ENHANCE_MORE 图像的阈值边界加强效果 ImageFilter.EMBOSS 图像的浮雕效果 ImageFilter.FIND_EDGES 图像的边界效果 ImageFilter.SMOOTH 图像的平滑效果 ImageFilter.SMOOTH_MORE 图像的阈值平滑效果 ImageFilter.SHARPEN 图像的锐化效果 下面看一个Pillow库生成模糊图片:
- 生成图像模糊效果:套用滤镜
from PIL import Image
from PIL import ImageFilter
im = Image.open("E:\Python大战机器学习\第三部分 Python编程进阶\code 4、图像处理实战\img1.jpg")
om = im.filter(ImageFilter.BLUR) # 为图片使用模糊滤镜
om.save('img1_blur.jpg')
原始图片:

模糊滤镜后:

【Pillow扩展库主要操作】
- PIL库的ImageEnhance类提供了更高级的图像增强需求,提供调整色彩、亮度、对比度、锐化等功能。
方法 描述 ImageEnhance.enhance(factor) 对选择属性的数值增强factor倍 ImageEnhance.Color(im) 调整图像的颜色平衡 ImageEnhance.Contras(im) 调整图像的对比度 ImageEnhance.Brightness(im) 调整图像的亮度 ImageEnhance.Sharpness(im) 调整图像的锐度 下面看一个图像增强实例:
- 高级图像增强实例
# 高级图像增强实例
from PIL import Image
from PIL import ImageEnhance
im = Image.open("E:\Python大战机器学习\第三部分 Python编程进阶\code 4、图像处理实战\img1.jpg")
# 调整图像对比度
om = ImageEnhance.Contrast(im)
# 图像对比度增强3倍
om.enhance(3).save("img1_EnContrast.jpg")
原始图像:

对比度增强后:

二、图像处理实战
- 验证码生成实战
【验证码生成实战】
- 题目要求:利用PIL的ImageDraw提供的绘图方法生成的验证码,要求字母随机、填充颜色随机。
- 思路
- 使用库PIL、random
- 画布:随机填充色
- 字母:指定字体(注意路径)、模糊滤镜BLUR
from PIL import Image,ImageDraw,ImageFont,ImageFilter # ImageFont字体类,ImageFilter滤镜
import random # 导入随机类
# 随机字母(65-90表示26个大写英文字母)
def rndChar():
return chr(random.randint(65,90)) # 返回65-95(ASCLL码)之间的数并转换为字母
# 随机颜色1(验证码背景颜色)
def rndColor():
return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
# 随机颜色2(文字颜色)
def rndColor2():
return (random.randint(32,127),random.randint(32,127),random.randint(32,127))
# 验证码背景240×60:
width = 60 * 4
height = 60
image = Image.new('RGB',(width,height),(255,255,255)) # 创建一个重色的背景
# 创建Draw对象,36为字体大小:
font = ImageFont.truetype('C:\Windows\Fonts\ARIALN.TTF',36) # 需指定Windows系统字体路径
# 创建Draw对象:
draw = ImageDraw.Draw(image)
# 填充每个像素:
for x in range(width):
for y in range(height):
draw.point((x,y),fill=rndColor())
# 输出4个文字:
for t in range(4):
draw.text((60*t+10,10),rndChar(),font=font,fill=rndColor2()) # 位置,随机字母,字体,颜色填充
# 模糊:
image = image.filter(ImageFilter.BLUR) # 套用模糊滤镜
image.save('code.jpg','jpeg') # 可添加绝对生成路径,默认为jupyter notebook文件夹下
运行结果:我们发现在jupyter notebook已经生成了一个code.jpg文件,打开如下:

因为图片为随机生成,我们再次运行后发现,原来的被替换掉,文件已经不一样了

到此,Python编程进阶实战4篇已经更新结束,赶快去实践一下吧,加油。

本文深入探讨Pillow库,详解图像处理操作,包括图像增强、滤镜应用及颜色变换,辅以验证码生成实战案例。
2082

被折叠的 条评论
为什么被折叠?



