PIL库支持图像存储、显示和处理,它能够处理几乎所有的图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。
1. 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
2. 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
3. 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括3.对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。
一、安装PIL库
我使用的是pip3.9,其目录为F:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64\Scripts,在DOS命令下,先转入安装目录下执行pip,安装PIL(pillow)
二、图像处理
原图(tiger.jpg)
1.图像轮廓获取
from PIL import Image
from PIL import ImageFilter
im = Image.open("a.jpg")
im1 = Image.open("tiger.jpg")
om = im1.filter(ImageFilter.EDGE_ENHANCE)
om = im1.filter(ImageFilter.SMOOTH)
om = im1.filter(ImageFilter.CONTOUR)
om.save("tigerContur.jpg")
2.颜色交换
r——>g,g——>b,b——>r
from PIL import Image
im = Image.open("tiger.jpg")
r,g,b = im.split()
om = Image.merge("RGB",(g,b,r))
om.save("tigerBGR.jpg")
3.缩略图
from PIL import Image
im = Image.open("tiger.jpg")
im.thumbnail((128,128))
im.save("tigerTN","JPEG")
4.对每个像素点进行操作
Image.point(func)根据函数func的功能对每个元素进行运算,返回图像副本
Image.split()提取RGB图像的每个颜色通道,返回图像副本
将R通道颜色值改为原来的0.9倍,选择B通道值低于100的像素点,合并3个通道的值
im = Image.open("tiger.jpg")
r,g,b = im.split()
newr = r.point(lambda i: i*0.9)
newb = b.point(lambda i: i<100)
om = Image.merge(im.mode,(newr,g,newb))
om.save("tigermerge.jpg")
三、图像的字符画绘制
十二星座(astro.jpg)
定义彩色向灰值的转换公式如下,其中R、G、B分别为像素点的RGB颜色值
gray = int(0.2126*r +0.7152*g +0.0722*b)
灰度值0——255,黑色为0,白色为255
# 图像的字符画绘制
from turtle import width
from PIL import Image
ascii_char = list("****#ofkgjdifrfifrkabcdefghiklkjqigrudvwijvjk;*#(^*&#$^@(@:~")
def get_char(r,b,g,alpha = 256):
if alpha == 0:
return ' '
gray = int(0.2126*r +0.7152*g +0.0722*b)
unit = 256//len(ascii_char)
return ascii_char[gray//unit]
def main():
im =Image.open('astro.jpg')
WIDTH,HEIGHT = 600,100
im = im.resize((WIDTH,HEIGHT))
txt = ''
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i)))
txt +='\n'
fo = open("pic_char.txt","w")
fo.write(txt)
fo.close()
main()
执行后,打开其所在文件,如下图