一.PIL:Python图像处理库
PIL(Python Imaging Library,图像处理库),提供通用的图像处理功能,有大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。下面将具体举例一些PIL基本图像操作。
1.读取一副图像并显示
from PIL import Image
im = Image.open('image/car.png') #打开原图
im.show() #显示原图
2.图像颜色转换convert()方法
convert中可设置转换模式,介绍比较常用的三种模式:RGB模式:有红(R)、绿(G)、蓝(B)三个颜色通道的变化;1模式:转化为为二值图像,非黑即白,每个像素用8个bit表示,0表示黑,255表示白;L模式:转化为为灰色图像,每个像素用8个bit表示,0表示黑,255表示白,0~255代表不同的灰度。需要注意的是,在PIL中,RGB是通过以下公式转化为L的:L = R * 299/1000 + G * 587/1000 + B * 114/1000
im_gray = im.convert('L') #转化为灰度图像,其他模式:im.convert('1') im.convert('RGB')
im_gray.show() #显示灰度图像
3.调整图像尺寸和旋转
im_small = im.resize((200,200)) #调整图像尺寸大小 该方法的参数是元组
im_small.show()
im_rotate = im.rotate(45) #以逆时针方式旋转图片45度
im_rotate.show()
4.创建缩略图
im_tn=im.thumbnail((200,200)) #thumbnail()方法接受一个元组参数(该参数指定生成缩略图的大小),然后将图像转换成符合元组参数指定大小的缩略图。
5.复制和粘贴图像区域
使用crop()方法可以从一幅图像中剪切出指定区域
box = (50,50,100,100)
region = im.crop(box)
region.show()
剪切区域用四元组指定,四元组的坐标依次是(左,上,右,下),接下来我们旋转上面的区域并用paste()放回
region = region.transpose(Image.ROTATE_180)
im.paste(region,box)
im.show()
6.读入一张图像并用save()方法保存图片
im = Image.open("image/car.png")
im.save("image/sun.jpg")
二.Matplotlib: 是Python中类似 MATLAB 的绘图工具
Matplotlib具有比PIL更强大的绘画功能,能绘制出高质量的图表,其中的PyLab接口包含很多方便用户创建图形的函数,常在计算机视觉中应用。下面绘制一个简单的图表例子。
from PIL import Image
import numpy as np
from pylab import *
#读取图像到数组中
im =array(Image.open("image/car.png"))
#绘制图像
imshow(im)
#绘制的点
x =[50,50,200,200]
y =[100,200,300,200]
#使用红色星状标记绘制的点
plot(x,y,'r*') #'go-'带圆圈标记的绿线 'ks:' 带正方形标记的黑点线
#连接所有点
plot(x[:4],y[:4])
#坐标轴不显示
#axis('off')
#添加标题,显示绘制的图像
title('sun.png')
show()
1.绘制图像轮廓和直方图
因为图像的轮廓需要对每一个坐标[x,y]的像素值施加同一个阈值,所以首先需要将图像灰度化
from PIL import Image
import numpy as np
from pylab import *
#读取图像到数组中
im =array(Image.open("image/car.png").convert('L'))
#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
show()
图像的直方图用来表征该图像像素值的分布情况,可以用hist()函数绘制,需要注意的是hist()函数只接受一维数组作为输入,所以必须对输入灰度图像进行压平处理,这里使用flatten()方法进行压平处理,flatten()方法能将任意数组按照行优先准则转换成一维数组。
from PIL import Image
import numpy as np
from pylab import *
im =array(Image.open("image/car.png").convert('L'))
figure()
hist(im.flatten(),128)
show()
2.直方图的均衡化
直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。
from PIL import Image
import numpy as np
from pylab import *
#显示原图
im1=Image.open("image/car.png").convert('L')
im1.show()
im =array(Image.open("image/car.png").convert('L'))
#计算图像直方图
figure(1)
hist(im.flatten(),128)
#show()
imhist,bins=histogram(im.flatten(),256)
cdf=imhist.cumsum() #累积分布函数
cdf=255*cdf/cdf[-1] #归一化
#使用累积分布函数的线性插值,计算新的像素值
im2=interp(im.flatten(),bins[:-1],cdf)
figure(2)
hist(im2,128)
img = im2.reshape(im.shape)
img = Image.fromarray(img)
img.show()
figure(3)
plot(cdf, color = 'b')
title("transfer function")
show()
原图像直方图 均衡化直方图
原图像 均衡化图像 变换函数
3.PIL的滤波_ImageFilter
当前的PIL版本中ImageFilter模块支持十种滤波器:
1. BLUR模糊滤波
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.BLUR)
img.show()
原图
模糊滤波之后的图像
2.CONTOUR轮廓滤波,将图像中的轮廓信息全部提取出来
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.CONTOUR)
img.show()
3.DETAIL为细节增强滤波,会使得图像中细节更加明显。
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
im.show()
img= im.filter(ImageFilter.DETAIL)
img.show()
4.EDGE_ENHANCE为边缘增强滤波
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.EDGE_ENHANCE)
img.show()
5.EDGE_ENHANCE_MORE为深度边缘增强滤波,会使得图像中边缘部分更加明显
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.EDGE_ENHANCE_MORE)
img.show()
6.EMBOSS为浮雕滤波,会使图像呈现出浮雕效果
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png").convert('L')
img= im.filter(ImageFilter.EMBOSS)
img.show()
7.FIND_EDGES为寻找边缘信息的滤波,会找出图像中的边缘信息
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png").convert('L')
img= im.filter(ImageFilter.FIND_EDGES)
img.show()
8.SMOOTH为平滑滤波,突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SMOOTH)
img.show()
9.SMOOTH_MORE为深度平滑滤波,会使得图像变得更加平滑
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SMOOTH_MORE)
img.show()
10.SHARPEN为锐化滤波,补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。
from PIL import Image
from PIL import ImageFilter
im=Image.open("image/car.png")
img= im.filter(ImageFilter.SHARPEN)
img.show()
总结
PIL库可以完成图像归档和图像处理两方面功能需求:
图像归档:对图像进行批处理、生成图像预览、图像格式转换等;
图像处理:图像基本处理、像素处理、颜色处理等。
在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法。