PIL的命令行安装
>>>pip install pillow
打开与显示图像
pil_im0=Image.open('00.jpg')#读取一幅图像,返回值是一个PIL图像对象
pil_im1=Image.open('00.jpg').convert('L')#读取一幅图像,转换成灰度图像
pil_im1.show()#显示图像
支持模式与“L”和“RGB”模式之间进行转换。要在其他模式之间进行转换,您可能必须使用中间图像(通常是“RGB”图像)。
print(im.format, im.size, im.mode)
format :标识了图像来源。如果图像不是从文件读取它的值就是None。
size:二元tuple,包含width和height(宽度和高度,单位都是px)。
mode: 定义了图像bands的数量和名称,以及像素类型和深度。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像。
如果文件打开错误,返回 IOError 错误。
读写图像
- 转换图像格式
infile="D:\\001_A_2.jpg"
f, e = os.path.splitext(infile)
outfile = f + ".png"
Image.open(infile).save(outfile)#outfile为D:\\001_A_2.png
- 创建缩略图
infile="D:\\001_A_2.jpg"
im = Image.open(infile)
im.thumbnail((44,44))#(44,44)是尺寸
im.save("D:\\001_A_1.jpg")
剪切,粘贴,合并图像
1.从图像中复制出一个矩形选区
im=Image.open('D:\\001_A_2.jpg')
region = im.crop((100, 100, 400, 400))#四元组坐标左上右下,单位是px
2.粘贴到原图
region = region.transpose(Image.ROTATE_180)#使矩形选区和原图的颜色模式一致
im1.paste(region, (200, 200, 500, 500))
分离和合并颜色通道
对于单波段图像,split()返回图像本身。要使用单独的颜色带,可能需要首先将图像转换为“RGB”。
r, g, b = im.split()#分离
im = Image.merge("RGB", (b, g, r))#合并
几何变换
1.简单的几何变换
out = im.resize((128, 128))#新的大小
out = im.rotate(45) # 逆时针的角度
2.特殊的旋转图像
out0 = im.transpose(Image.FLIP_LEFT_RIGHT)
out1 = im.transpose(Image.FLIP_TOP_BOTTOM)
out2 = im.transpose(Image.ROTATE_90)
out3 = im.transpose(Image.ROTATE_180)
out4 = im.transpose(Image.ROTATE_270)
颜色增强
1.滤波器
from PIL import ImageFilter
#ImageFilter模块包含许多预先定义的增强过滤器
out0 = im.filter(ImageFilter.BLUE)#模糊滤波
out1 = im.filter(ImageFilter.CONTOUR)#轮廓滤波
out2 = im.filter(ImageFilter.DETAIL)#细节滤波
out3 = im.filter(ImageFilter.EDGE_ENHANCE)#细节滤波
out4 = im.filter(ImageFilter.EDGE_ENHANCE_MORE)#边界增强滤波(程度更深)
out5 = im.filter(ImageFilter.SHARPEN)#锐化滤波
out6 = im.filter(ImageFilter.GaussianBlur(radius=2))
# radius指定平滑半径,也就是模糊的程度。
out7 = im.filter(ImageFilter.SMOOTH_MORE)#平滑滤波(程度更深)
out8 = im.filter(ImageFilter.EMBOSS)#浮雕滤波
out9 = im.filter(ImageFilter.ModeFilter(size=5))
# size指定核大小(width, height);
2.点操作
对图像的像素进行点对点操作
out = im.point(lambda i: i * 1.2)#每个像素点乘二
source = im.split()#分离颜色通道
R, G, B = 0, 1, 2
mask = source[R].point(lambda i: i < 100 and 255)#选择红色小于100的区域
out = source[G].point(lambda i: i * 0.7)
#把绿色道的点的色素值调低百分之三十
source[G].paste(out, None, mask)#红色<100的店,绿色降了30%
im = Image.merge(im.mode, source)#合并通道
用于创建掩膜:
imout = im.point(lambda i: expression and 255)
后面的and 255,如果表达式为假,就返回0,只有为真的时候才返回255
3.增强
使用ImageEnhance模块中的类,调整对比度、亮度、色彩平衡和锐度。
en=ImageEnhance.Brightness(image)#图片的亮度增加
en=ImageEnhance.Color(image)#图片的色度增强
en=ImageEnhance.Contrast(image)#图片的对比度增强
en=ImageEnhance.Sharpness(image)#图片的锐度的增强
en_end=en.enhance(100)
en_end.show()
更多地方读取图像
im = Image.open("lena.ppm")
1.从文件读取
fp = open("lena.ppm", "rb")
im = Image.open(fp)
2.从 string 读取
import StringIO
im = Image.open(StringIO.StringIO(buffer))
3.从压缩包读取
from PIL import TarIO
fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
im = Image.open(fp)