目录
一、图像文件的读写
操作步骤:
显示图像文件的三个常用属性:
例:
二、图像文件的处理
常用的图像处理方法
1、图像的显示
2、图像的保存
3、图像的拷贝与粘贴
4、图像的缩放与旋转
5、图像的颜色变换
6、图像的过滤与增强
7、序列图像处理
在Python中,处理图像、网页等二进制文件时主要借助一些第三方库来解析:
- PIL:最常用的图像处理第三方库
- request:通过网络连接下载网页的第三方库
- beautifulsoup4:解析网页格式、获取数据的第三方库
一、图像文件的读写
PIL库包括21个类,其中Image类是PIL库中一个非常重要的类,Image类提供了多种方法可以进行图像文件的读写和处理,要想使用这些方法,需要从PIL库导入Image模块。
from PIL import Image
操作步骤:
首先打开文件,创建图像文件对象,然后进行处理,处理完毕后关闭文件。
使用image类的open方法载入图像文件,载入失败提示IOError,载入成功返回Image对象。
Image.open()
显示图像文件的三个常用属性:
- format:识别图像格式或来源,如果图像不是从文件中读取的,返回None
- size:图像的宽度和高度(单位为像素),返回二元组(宽度,高度)
- mode:图像的颜色模式,L代表灰度图像、RGB代表真彩色图像,CMYK代表印刷图像
例:
from PIL import image
im=Image.open('d:\\Python\\1.jpg')
print(im.format,im.size,im.mode)
二、图像文件的处理
打开图像文件后,可调用Image类的各种方法或其他模块进行处理。
常用的图像处理方法
图像显示 | show() |
图像保存 | sava() |
图像的拷贝与粘贴 | crop(box)、paste(region,box) |
图像的缩放与旋转 | rotate(angle)、transpose() |
图像的颜色变换 | split()、merge()、convert() |
图像的过滤与增强 | PIL库中的ImageFilter模块、ImageEnhance模块 |
序列图像处理 | seek()、tell() |
1、图像的显示
show()用于显示图像。
例:
from PIL import Image
# 图像的显示
im=Image.open('csdn.webp')
im.show()
2、图像的保存
sava()用于保存图像,有两个参数:文件名filename和图像格式format;
如果调用时不指定保存格式,将自动根据图像文件的扩展名保存图像;
如果指定格式,则按照格式存储;
sava()可以实现图像格式的转换,例如:将csdn.jpg保存为png格式文件
例:
"""图像的保存"""
from PIL import Image
im=Image.open('csdn.webp')
im.save('csdn.jpg')
3、图像的拷贝与粘贴
crop(box)从图像中拷贝一个矩形图像。参数box是一个四元元组,四元素分别代表矩形左上角和右下角顶点的横纵坐标。坐标系统原点(0, 0)为图片左上角。paste(region, box)将一个图像粘贴到另一个图像上。region指被粘贴图像对象,变量box指定粘贴区域,如果是二元元组,代表粘贴区域左上角的横纵坐标;如果是四元元组,则代表左上和右下角的横纵坐标。如果为空,则默认为(0, 0)。如果给定四元元组,被粘贴图像的尺寸必须与粘贴区域尺寸一样。如果尺寸不匹配,被粘贴的图像将被转换为当前图像的模式。
例:
"""图像的拷贝与粘贴"""
from PIL import Image
im=Image.open('csdn.jpg')
#定义拷贝区域
box=(100,20,281,202)
#拷贝图像,返回新的图像对象
region=im.crop(box)
region.show()
#将图像region粘贴到图像im左上角
im.paste(region,(0,0))
#将剪裁下来的图像粘贴到原始图像上
im.save('new.jpg')
im1=Image.open('new.jpg')
im1.show()
剪裁的图片:
将剪裁的图片放到原图的左上角:
4、图像的缩放与旋转
resize(size)根据参数size指定的尺寸调整图像,生成一个副本文件。rotate(angle)按照参数angle指定的角度逆时针旋转图像,生成一个副本文件。transpose()方法预定义了一些旋转方式,如左右反转,上下翻转,逆时针旋转(90、180、270度)等。
例:
"""图像的缩放与旋转"""
from PIL import Image
im=Image.open('csdn.jpg')
#缩小尺寸
im.resize((200,100))
#逆时针旋转45°
out=im.rotate(45)
out.show()
# 左右反转
out=im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
out.show()
#上下反转
out=im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
out.show()
# 逆时针旋转90°
out=im.transpose(Image.Transpose.ROTATE_90)
out.show()
5、图像的颜色变换
图像有不同颜色模式。在RGB模式下,每张图片由三个颜色通道R、G、B叠加而成。可以使用split()分离三个颜色通道,对每种颜色分别处理,再用merge()把几个通道合并形成新的图像。还可以使用convert()将图像转换为不同的颜色模式参数。
例:
"""图像的颜色变换"""
from PIL import Image
im=Image.open('csdn.jpg')
#分离三个颜色通道
r,g,b=im.split()
# 更换r、g、b颜色后合成新图像
im=Image.merge('RGB',(b,r,g))
im.show()
6、图像的过滤与增强
PIL中的ImageFilter模块和ImageEnhance模块提供了过滤图像和增强图像的方法。ImageFilter模块预定义了10种图像过滤方法,可以提取图像轮廓、图像锐化、图像平滑等,主要使用 filter()方法实现。ImageEnhance模块专门用于图像的增强处理,可以增强(或减弱)图像的亮度、对比度、色度等
例:
"""图像的过滤与增强"""
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
im=Image.open('csdn.jpg')
detfilter=im.filter(ImageFilter.DETAIL)#图像细节增强
detfilter.show()
confilter=im.filter(ImageFilter.CONTOUR)#图像轮廓效果
confilter.show()
smtfilter=im.filter(ImageFilter.SMOOTH)#图像平滑
smtfilter.show()
sharpfilter=im.filter(ImageFilter.SHARPEN)#图像锐化
sharpfilter.show()
enhbrightim=ImageEnhance.Brightness(im)
brightness=5
eng_bri=enhbrightim.enhance(brightness)#图像亮度增强为原来的1.5倍
eng_bri.show()
enhbrightim=ImageEnhance.Contrast(im)
contrast=5
enh_con=enhbrightim.enhance(contrast)#图像对比度增强为原1.5倍
enh_con.show()
分别为细节增强、轮廓效果、平滑、锐化、亮度增强、对比度增强
PIL还支持对像素点的直接操作。例如将ai.jpg分离成三个颜色通道,对其中一个通道进行加强或减弱操作,再使用Merge将通道合并,从而改变图片的色调(冷暖色调的互换)等。如其中b层每个像素点的亮度增大20%
im=Image.open('csdn.jpg')
r,g,b=im.split()
out=b.point(lambda i:i*1.2)
im=Image.merge('RGB',(r,g,b))
im.show()
7、序列图像处理
序列图像是将多帧图像保存在一个图像文件中,按照一定时间间隔播放形成动画效果。gif图片就是序列图像。PIL对这种动态图片也提供了基本的处理方法。当用open()打开这类图像文件时,会自动载入第一帧图像,使用 seek()和tell()方法可以在各帧之间移动。seek(frame)表示跳转到指定的图像帧,tell()返回当前帧的序号
例:
代码采用了try-except结构,首先执行try中的语句,当图像已经跳转到最后一副图像帧时,再次跳转(im.tell()+1)会出现异常,此时执行except后面的语句,程序结束。
"""图像的序列操作"""
from PIL import Image
# 读入gif文件
im=Image.open('pai.gif')
try:
im.save('frame{:02d}.png'.format(im.tell()))
# 保存图像帧为png文件
while True:
# 跳转到下一帧图像
im.seek(im.tell()+1)
im.save('frame{:02d}.png'.format(im.tell()))
except:
print('处理结束')