PIL:Python图像处理类库
PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能, 以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。
基本操作
1、读取图片及灰度转换
from PIL import Image
#读取照片
img=Image.open('1.jpg')
#灰度转换
img2=Image.open('1.jpg').convert('L')
2、转换图像格式
from PIL import Image
import os
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert", infile)
Tip:os库主要和路径操作有关
3、创建缩略图
img.thumbnail((128,128))#无返回值,直接在原图进行操作
4、剪切图像
from PIL import Image
from pylab import *
img=Image.open('7.jpg')
#PIL 中指定坐标系的左上角坐标为(0,0)
#裁剪图片
box=(200,200,500,500)
#以(200,200)为左上角,(500,500)为右下角
img2=img.crop(box)
figure()
subplot(1,2,1)
imshow(img)
subplot(1,2,2)
imshow(img2)
axis('off')
show()
5、粘贴图像
from PIL import Image
from pylab import *
img=Image.open('7.jpg')
box=(200,200,500,500)
img2=img.crop(box)
#旋转图像
img3=img2.transpose(Image.ROTATE_180)
#粘贴到原图像
img.paste(img3,box)
figure()
subplot(1,3,1)
imshow(img2)
subplot(1,3,2)
imshow(img3)
subplot(1,3,3)
imshow(img)
axis('off')
show()
6、调整尺寸和旋转
out = img.resize((128,128))
out = img.rotate(45)#逆时针旋转
个人对thumbnail与resize区别的理解:
1、thumbnail不改变图片的长宽比,resize改变
2、thumbnail无返回值,resize返回jpg图像
Matplotlab
我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时,Matplotlib 是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出高质量的 图表,就像本书中的许多插图一样。Matplotlib 中的 PyLab 接口包含很多方便用户 创建图像的函数。
1、绘制图像、点、线
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('empire.jpg'))
# 绘制图像
imshow(im)
# 一些点
x = [100,100,400,400]
y = [200,500,200,500]
# 使用红色星状标记绘制点
plot(x,y,'r*')
# 绘制连接前两个点的线
plot(x[:2],y[:2])
# 添加标题,显示绘制的图像
title('Plotting: "empire.jpg"')
show()
在绘图时,有很多选项可以控制图像的颜色和样式。使用如下:
也可以自己去查询更多使用方法。
2、图像轮廓和直方图
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('7.jpg').convert('L'))
figure()
#不使用颜色信息
gray()
#绘制轮廓图像
contour(im,origin='image')
#设置图像坐标轴刻度比例相等
axis('equal')
axis('off')
figure()
#绘制直方图
hist(im.flatten(),128)
show()
hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一 维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。 flatten() 方法将任意数组按照行优先准则转换成一维数组。
3、交互式标注
有时用户需要和某些应用交互,例如在一幅图像中标记一些点,或者标注一些训练数据。
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('7.jpg'))
figure()
imshow(im)
print('Please click 3 points')
#返回一个包含这三个点的坐标列表
x = ginput(3)
print('you clicked:',x)
show()