Python基础之PIL框架
Posted 岩枭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础之PIL框架相关的知识,希望对你有一定的参考价值。
一、PIL(Python Imaging Library)的基本概念:PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。
1、 通道
每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。
以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。
如下图:
2、 模式
图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
L:8位像素,表示黑和白。
P:8位像素,使用调色板映射到其他模式。
RGB:3x8位像素,为真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,颜色分离。
YCbCr:3x8位像素,彩色视频格式。
I:32位整型像素。
F:32位浮点型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
3、 尺寸
通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。
4、 坐标系统
PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。
5、 调色板
调色板模式 ("P")使用一个颜色调色板为每个像素定义具体的颜色值
6、 信息
使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。
7、 滤波器
对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:
NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。
二、程序案例演示
图片的缩放:
from PIL import Image
img=Image.open('2.jpg')
img.show()
#缩放
w,h=img.size
img.thumbnail((w//2,h//2))
img.show()
执行程序结果:
图片的旋转:
from PIL import Image
img=Image.open('2.jpg')
img.show()
#旋转
img=img.rotate(45)
img.show()
程序执行结果:
滤波器:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
img.show()
#滤波器
#EMBOSS浮雕
#img=img.filter(ImageFilter.EMBOSS)
#CONTOUR轮廓处理
# img=img.filter(ImageFilter.CONTOUR)
#BLUR模糊处理
#img=img.filter(ImageFilter.BLUR)
#DETAIL增强
img=img.filter(ImageFilter.DETAIL)
img.show()
程序依次的执行效果:
浮雕:
轮廓处理:
模糊处理:
增强:
查看通道数和图像灰度化:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
img.show()
#查看图像通道数
bands=img.getbands()
print(bands)
#图像灰度化:RGB->L
img=img.convert('L')
img.show()
bands=img.getbands()
print(bands)
程序执行效果:
取某一个像素点的颜色的值:
from PIL import Image,ImageFilter
img=Image.open('2.jpg')
#取某一个像素点的颜色的值
#三通道像素点的值
pixels=img.getpixel((87,180))
print(pixels)
#单通道像素点的值
img=img.convert('L')
pixels=img.getpixel((87,180))
print(pixels)
程序执行结果:
返回图片的像素直方图和当前使用的颜色:
from PIL import Image
#返回图片的像素直方图
img=Image.open('2.jpg')
pr=img.histogram()
print(pr)
#返回图片当前正在被使用的颜色
colors=img.getcolors()
print(colors)
colors=img.getcolors()
print(colors)
运行结果:
图像的粘贴:
from PIL import Image
#图像的粘贴
img1=Image.open('1.jpg')
img2=Image.open('2.jpg')
#把img1粘贴到img2上
img2.paste(img1,(120,100))
#保存粘贴后的img2
img2.save('test.jpg','jpeg')
img2.show()
程序执行结果:
使用PIL生成验证码:
from PIL import Image,ImageDraw,ImageFont
import random
#生成随机字母
def rndChar():
return chr(random.randint(65,90))
#随机颜色1
def rndColor1():
return (random.randint(64,255)
,random.randint(64,255)
, random.randint(64, 255)
)
#随机颜色2
def rndColor2():
return (random.randint(32,127)
,random.randint(32,127)
, random.randint(32, 127)
)
#生成一个画布,240*60
width=240
height=60
image=Image.new('RGB',(width,height),(255,255,255))
#创建Font对象,生成字体
font=ImageFont.truetype('arial.ttf',36)
#创建Draw对象
draw=ImageDraw.Draw(image)
#填充像素,背景干扰项
for x in range(width):
for y in range(height):
draw.point((x,y),fill=rndColor1())
#背景上输出文字
for i in range(4):
draw.text((60*i+10,10),rndChar(),font=font,fill=rndColor2())
image.show()
执行程序结果:
以上是关于Python基础之PIL框架的主要内容,如果未能解决你的问题,请参考以下文章