1.使用Python Imaging Library处理图像
Python Imaging Library(PIL)支持常见的图像格式,常用与操作二维像素点,线,文字,以及对现有图片进行缩放,变形,通道处理,可以实现创建缩略图,转换文件格式,打印图像,转换图片编码格式,比较图片差异等操作。
PIL包括若干模块,分别具备图像文件操作,绘图,颜色管理,字体管理等功能,其主要模块级功能如下
| 模块 | 用途 |
|---|---|
| Image | 提供一个与模块同名的类。用来表示一个PIL图像。这个模块同时提供一些工厂函数,包括从文件读取图像的函数及创建新图像的函数 |
| ImageChops | 包含许多算术图像操作,称为通道操作(chops),可用与特殊效果,图像合成,算法绘画等 |
| ImageColor | 包含从CSS3样式颜色说明符到RGB元组的颜色表和转换器,此模块有Image.new和ImageDraw等模块使用 |
| ImageDraw | 为Image对象提供简单的2d图形,可以使用此模块创建新图像,添加注释或润饰现有图像,以及动态生成图形以供Web使用 |
| ImageEnhance | 包含许多可用于图像增强的类 |
| ImageFile | 为图像的打开和保存功能提供支持。他提供了一个Parser类,可以用于逐个解码图像。此类实现与标准sgmllib模块和xmllib模块使用相同的接口 |
| ImageFileIO | 可以用来从套接字或者任何其他流设备读取图像。这个模块已被废弃,可以使用ImageFile模块提供的Parser类来代替 |
| ImageFilter | 包含预定义过滤器集的定义,可以与Image类的过滤器方法结合使用 |
| ImageFont | 定义一个与模块同名的类,此类的实例存储位图字体,并与ImageDraw类的text方法一起使用。PIL使用自己的字体文件格式来存储位图字体,可以使用pilfont程序将BDF和PCF字体描述符(X Window字体格式)转换为此格式 |
| ImageGrab | 可用于将屏幕或剪贴板的内容复制到PIL图像存储器。当前版本仅适用于Window |
| ImageOps | 包含许多开箱即用的图像处理操作。这是一个实验性模块,大多数操作员只能处理L和RGB图像 |
| ImagePath | 用来存储和操作二维向量数据,路劲对象可以被传到ImageDraw模块的方法中 |
| ImagePalette | 定义或转换图像的调色板模式 |
| ImageSequence | 创建一个图像序列的包装类,用于循环遍历一个序列中的所有帧 |
| ImageStat | 计算图像或图像区域的全局统计数据 |
| ImageTK | 包含对创建和修改Tkinter BitmapImage和PhotoImage对象的支持 |
| ImageWin | 包含对在Windows上创建和显示图像的支持,可以与PythonWin及提供对Windows设备上下文访问的其他用户界面工具包一起使用 |
| PSDraw | 位Postscript打印机提供简单的打印支持,可以通过此模块打印文本,图形和图像 |
| ImageCrackCode | 用于检测和测量图像中的要素,该模块仅使用与PIL Plus软件包 |
| ImageMath | 用来计算图像表达式,该模块仅适用于PIL Plus软件包 |
以下代码引入Image模块,打开图像文件,获取其基本信息
from PIL import Image
im=Image.open('Image_text.jpg')
print(im.width)
print(im.height)
print(im.mode)
1200
750
RGB
在此基础上,以下代码调整了示例图片的大小及 提高了20%的图片质量,并重新保存
import os
from PIL import Image
im=Image.open('Image_text.jpg')
im=im.resize((256,256))
im.save(os.getcwd()+'/test1.jpg','JPEG',quality=20)
print(im.width)
print(im.height)
print(im.mode)
#256
#256
#RGB
在保存时还可以改变图像文件格式,以下代码 将原图调整大小后,使用PNG格式进行存储
import os
from PIL import Image
im=Image.open('Image_text.jpg')
im=im.resize((320,240))
im.save(os.getcwd()+'/test2.png','PNG',quality=96)
print(im.width)
print(im.height)
print(im.mode)
加上循环功能,即可实现为当前目录下的所有图片文件生成指定尺寸的缩略图,代码如下
import os,sys
from PIL import Image
size=128,128
for infile in os.listdir(os.getcwd()):
outfile=os.path.splitext(infile)[0]+'_thumbnail.jpg'
if infile != outfile:
try:
im=Image.open(infile)
im.thumbnail(size)
im.save(outfile,'JPEG')
except IOError:
print(infile+'无法创建缩略图')
2. 生成CAPTCHA图像
CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Human Apart,全自动区分计算机和人类的图灵测试) 是区分计算机和人类的一种程序算法,是一种人类极易通过但计算机很难通过的测试。常见的形式有填写表单,识别验证码,语音,或图像识别。
以下代码使用PIL生成英文CAPTCHA验证码
import random
from PIL import Image,ImageDraw,ImageFont,ImageFilter
_letter_cases='abcdefghjkmnpqrstuvwxy' #小写字母 除去可能干扰的i,l,o,z
_upper_cases=_letter_cases.upper() #大写字母
_numbers=''.join(map(str,range(3,10))) #数字
init_chars=''.join((_letter_cases,_upper_cases,_numbers))
def create_captcha_code(size=(120,30),chars=init_chars,img_type='GIF',
mode='RGB',bg_color=(255,255,255),fg_color=(0,0,255),
font_size=18,font_type='Roboto-Bold.ttf',length=4,draw_lines=True,
n_line=(1,2),draw_points=True,point_chance=2):
width,height=size
img=Image.new(mode,size,bg_color)
draw=ImageDraw.Draw(img)
def get_chars():
#生产给定长度的字符串
return random.sample(chars,length)
def create_lines():
#绘制干扰线
line_num=random.randint(*n_line)
for i in range(line_num):
begin=(random.randint(0,size[0]),random.randint(0,size[1]))
end=(random.randint(0,size[0]),random.randint(0,size[1]))
draw.line([begin,end],fill=(0,0,0))
def create_points():
#绘制干扰点
chance=min(100,max(0,int(point_chance)))
for w in range(width):
for h in range(height):
tmp=random.randint(0,100)
if tmp>100-chance:
draw.point((w,h),fill=(0,0,0))
def create_strs():
#绘制验证码字符
c_chars=get_chars()
strs=' %s '%' '.join(c_chars)
font=ImageFont.truetype(font_type,font_size)
font_width,font_height=font.getsize(strs)
draw.text(((width-font_width)/3,(height-font_height)/3),strs,font=font,fill=fg_color)
return ''.join(c_chars)
if draw_lines:
create_lines()
if draw_points:
create_points()
strs=create_strs()
params=[1-float(random.randint(1,2))/100,0,0,0,1-float(random.randint(1,10))/100,
float(random.randint(1,2))/500,0.001,float(random.randint(1,2))/500]
img=img.transform(size,Image.PERSPECTIVE,params)
img=img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img,strs
img,code=create_captcha_code()
img.save('code.png','PNG')
print(code)
以上就是python图像处理的一些知识,如有问题请留言一起讨论