python 有一个很方便的图像处理包,导入如下
from PIL import Image
(1)图片读取
# 打开图片
from PIL import Image
im = Image.open("xxx.ppm")
'''
im.format : 识别图像的源
im.size : 图像的像素
im.mode : L 为灰度图 RGB 为彩图 CMYK 为预压图像
'''
print im.format,im.size,im.mode
# 从tar 压缩文件中读取
from PIL import Image,TarIO
fp = TarIO.TarIO("xxx.tar","xxx.jpg")
im = Image.open(fp)
# 显示图片
im.show()
# 获得所有像素元素
pixels = im.load()
# x,y 像素点像素
r = pixels[x,y][0]
g = pixels[x,y][1]
b = pixels[x,y][2]
(2)读写图片
# 转换成其他格式并保存
Image.open("xxx.ppm").save("xxx.jpg")
# 创建 JPEG 略缩图
im = Image.open(infile)
size = (128,128)
im.thumbnail(size) # 压缩成指定大小
im.save(outfile,"JPEG") # 设置保存格式
(3)图像的剪裁和合并
''' 表示一个区域,由 4 元组定义,其中坐标为(左上,右下)
python 映像库使用左上角的(0,0) 坐标系统,坐标就是像素之间的位置
'''
box = (100,100,400,400) # 300 * 300 的一个区域
region = im.crop(box)
# 处理一个子矩阵,并黏贴回去
region = region.transpose(Image.ROTATE_180)
im.paste(region,box)
# 分裂 & 合并图像
r,g,b = im.split() ''' 对于灰度图,返回的是它本身 '''
# 合并
im = Image.merge("RGB",(r,g,b))
(4)几何变换
# 调整图片尺寸
out = im.resize((128,128))
# 旋转角度
out = im.rotate(45)
# 上下翻转
out = im.transpose(Image.FLIP_TOP_BOTTOM)
# 左右翻转
out = im.transpose(Image.FLIP_LEFT_RIGHT)
# 旋转 90,180,270 度
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
(5)模式转换
"""
转换成灰度图
"""
im = Image.open("xxx.ppm").convert("L")
(6)图像增强
# 过滤
''' ImageFilter 包含很多方法和模块 '''
from PIL import ImageFilter
out = im.filter(ImageFilter.DETAIL)
# 点运算,对每个像素作同样的处理
out = im.point(lambda i:i * 1.2)
(7)读取图像序列
# 使用 seek 和 tell 方法在不同的帧之间移动
im = Image.open("xxx.gif")
im.seek(1) # 跳转到第一个帧
try:
while True:
im.seek(im.tell() + 1)
im.show()
except EOFError:
pass
# 或者使用 for 循环
from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
im.seek(frame)
im.show()