一、PIL库学习笔记:
PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装。(安装::>pip install pillow # 或者 pip3 install pillow)支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。
PIL库的基本操作:
1、图像归档(Image Archives)。图像归档以及图像的批处理任务。可以使用PIL创建缩略图,转换图像格式,打印图像等等。
2、图像展示(Image Display)。
3、图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter)、颜色空间的转换、图像的大小转换、图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,可以展示图像的一些统计特性,可以用来实现图像的自动对比度增强,还有全局的统计分析等。
PIL库Image类解析:
在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法。
方法 |
描述 |
Image.open(filename) |
根据参数加载图像文件 |
Image.new(mode, size, color) |
根据给定参数创建一个新的图像 |
Image.open(StringIO.StringIO(buffer)) |
从字符串中获取图像 |
Image.frombytes(mode, size, data) |
根据像素点data创建图像 |
Image.verify() |
对图像文件完整性进行检查,返回异常 |
Image类还有4个处理图片的常用属性
属性 |
描述 |
Image.format |
标识图像格式或来源,如果图像不是从文件读取,值是None |
Image.mode |
图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、"CMYK"出版图像 |
Image.size |
图像宽度和高度,单位是像素(px),返回值是二元元组(tuple) |
Image.palette |
调色板属性,返回一个ImagePalette类型 |
Image类的图像转换和保存方法如表所示。
方法 |
描述 |
Image.save(filename, format) |
将图像保存为filename文件名,format是图片格式 |
Image.convert(mode) |
使用不同的参数,转换图像为新的模式 |
Image.thumbnail(size) |
创建图像的缩略图,size是缩略图尺寸的二元元组 |
Image类可以缩放和旋转图像,其中,rotate()方法以逆时针旋转的角度值作为参数来旋转图像。
方法 |
描述 |
Image.resize(size) |
按size大小调整图像,生成副本 |
Image.rotate(angle) |
按angle角度旋转图像,生成副本 |
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 |
图像的过滤和增强,PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法,共10种
方法表示 |
描述 |
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 |
图像的锐化效果 |
ImageEnhance类提供了更高级的图像增强需求,它提供调整色彩度、亮度、对比度、锐化等功能。
方法 |
描述 |
ImageEnhance.enhance(factor) |
对选择属性的数值增强factor倍 |
ImageEnhance.Color(im) |
调整图像的颜色平衡 |
ImageEnhance.Contrast(im) |
调整图像的对比度 |
ImageEnhance.Brightness(im) |
调整图像的亮度 |
ImageEnhance.Sharpness(im) |
调整图像的锐度 |
(例)加载一个图片:
>>>from PIL import Image >>>im = Image.open("D:\pycodes\birdnest.jpg")
(例)对一个GIF格式动态文件,提取其中各帧图像,并保存为文件。
from PIL import Image
im = Image.open('pybit.gif') # 读入一个GIF文件
try:
im.save('picframe{:02d}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save('picframe{:02d}.png'.format(im.tell()))
except:
print("处理结束")
(例)生成"birdnest.jpg"图像的缩略图,其中(128,128)是缩略图的尺寸。
>>>im.thumbnail((128, 128))
>>>im.save("birdnestTN","JPEG")
(例)交换图像中的颜色。可以通过分离RGB图片的三个颜色通道实现颜色交换
from PIL import Image
im = Image.open('birdnest.jpg')
r, g, b = im.split()
om = Image.merge("RGB", (b, g, r))
om.save('birdnestBGR.jpg')
(例)操作图像的每个像素点需要通过函数实现,采用lambda函数和point()方法搭配使用
>>>im = Image.open('D:\pycodes\birdnest.jpg') #打开鸟巢文件 >>>r, g, b = im.split() #获得RGB通道数据 >>>newg = g.point(lambda i: i * 0.9) # 将G通道颜色值变为原来的0.9倍 >>>newb = b.point(lambda i: i < 100) # 选择B通道值低于100的像素点 >>>om = Image.merge(im.mode, (r, newg, newb)) # 将3个通道合形成新图像 >>>om.save('D:\pycodes\birdnestMerge.jpg') #输出图片
(例)利用Image类的filter()方法可以使用ImageFilter类,如:Image.filter(ImageFilter.fuction) 图像的轮廓获取。获取图像的轮廓,北京鸟巢变得更加抽象、更具想象空间。
from PIL import Image
from PIL import ImageFilter
im = Image.open('birdnest.jpg')
om = im.filter(ImageFilter.CONTOUR)
om.save('birdnestContour.jpg')
(例)图像的对比度增强。增强图像的对比度为初始的20倍。
from PIL import Image
from PIL import ImageEnhance
im = Image.open('birdnest.jpg')
om = ImageEnhance.Contrast(im)
om.enhance(20).save('birdnestEnContrast.jpg')
二、处理两张图片:
图片一:“me.jpg” 图片二:“touxiang.jpg”
(1)a.生成缩略图(压缩后小于10k):
from PIL import Image im = Image.open("me.jpg") im.thumbnail((50, 50)) im.save('smallme','PNG')
运行结果:
from PIL import Image im = Image.open("touxiang.jpg") im.thumbnail((50, 50)) im.save('smalltouxiang.png','PNG')
运行结果:
b.改变颜色:
from PIL import Image im = Image.open("me.jpg") r, g, b = im.split() om = Image.merge("RGB", (b, g, r)) om.save('colorme.jpg')
运行结果:
from PIL import Image
im = Image.open("touxiang.jpg")
r, g, b = im.split()
om = Image.merge("RGB", (g, r,b))
om.save('colortouxiang.jpg')
运行结果:
c.改变轮廓:
from PIL import Image from PIL import ImageFilter im = Image.open('touxiang.jpg') om = im.filter(ImageFilter.FIND_EDGES) om.save('lunkuotouxiang.jpg')
运行结果:
d.浮雕效果:
from PIL import Image from PIL import ImageFilter im = Image.open('touxiang.jpg') om = im.filter(ImageFilter.EMBOSS) om.save('fudiaotouxiang.jpg')
运行结果:
三、做一张字符画:
from PIL import Image IMG='xin.jpg' WIDTH=60 HEIGHT=45 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ") def get_char(r,g,b,alpha=256): if alpha==0: return ' ' length=len(ascii_char) gray=int(0.2126*r+0.7152*g+0.0722*b) unit=(256.0+1)/length return ascii_char[int(gray/unit)] if __name__=='__main__': im=Image.open(IMG) im=im.resize((WIDTH,HEIGHT),Image.NEAREST) txt="" for i in range(HEIGHT): for j in range(WIDTH): txt+=get_char(*im.getpixel((j,i))) txt+=' ' print (txt) with open("output.txt",'w') as f: f.write(txt)
运行结果: