Python编程进阶04-图像处理实战

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

Python编程进阶01--输入输出文件操作

Python编程进阶02--Excel文件操作

Python编程进阶03--自然语言处理实战 

本文索引:

  1. Pillow图像处理库(概述、主要功能、常用操作)
  2. 图像处理实战(验证码生成实战)

本文所需文件自提:

链接: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提供的绘图方法生成的验证码,要求字母随机、填充颜色随机。
  • 思路
  1. 使用库PIL、random
  2. 画布:随机填充色
  3. 字母:指定字体(注意路径)、模糊滤镜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篇已经更新结束,赶快去实践一下吧,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值