Python学习记录(一)PIL库对于图像操作方法的简单整理
首先对PIL库进行一个简单的介绍:Python图像库PIL(Python Image Library)是python的第三方图像处理库,由于其强大的功能和众多的使用人数而广为人知,主要用于对图像进行处理。本文主要从以下几个方面对PIL库的使用进行整理:
目录
一.图像读取、创建方法
二.图像处理方法
三.图像增强、过滤方法
一.图像读取、创建方法
PIl库中的image 类是核心类,也是我们最常使用,功能最多的模块。我们首先通过几个函数来了解使用image类进行图像读取和创建的方法。
1.open
我们可以通过这一函数来进行图片的读取。
代码如下
from PIL import Image #调用库
img=Image.open("dog.jpg") #打开在当前目录下的一张图片
img.show()
运行结果
2.save、copy
我们可以用这一函数来进行图片的保存或格式的转换
img.save("dog.png") #将图片保存为png格式
img1 = Image.open("dog.png") #新的图片
此外,我们还可以使用copy对图片进行拷贝。
img_copy = img.copy()
图像img_copy和img完全一样。
3.读取图片信息
print(img.format) #打印图片的格式
print(img.size) #打印图片的大小
print(img.mode) #打印图片的模式属性
运行结果
需要提到的是,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。
4.new
我们还可以利用new方法来创建一个图片,代码如下。
new_img= Image.new("RGB", (128, 128), "red") #创建一个图片,变量分别为mode,size,color
new_img.show() #展示图片
结果如下
可以看到,使用给定的模式和大小以及颜色,我们生成了一个红色的方块。值得一提的是,对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。我们也可以给变量color赋值为“red”、“green”等。如果没有对变量color赋值,图像内容将会被全部赋值为0(为黑色)。
new_img= Image.new("RGB", (128, 128)) #没有给color变量赋值
new_img.show() #展示图片
如此展示出的是一个黑色的方块。
二.图像处理方法
下面主要讲讲如何调整图片的各类属性来达到图像处理的目的。
1.convert
将当前图像转换为其他模式,并且返回新的图像。
img2=img.convert(mode) #转换模式
img2.show() #展示转换后的图像
我们可以尝试将mode进行调整。可以发现:
当模式为“1”时,转化为为二值图像,非黑即白,每个像素用8个bit表示,0表示黑,255表示白。
当模式为“RGB”时,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,每个通道的值在0~255之间。
当模式为“L”时,转化为为灰色图像,每个像素用8个bit表示,0表示黑,255表示白,0~255代表不同的灰度。需要注意的是,在PIL中,RGB是通过以下公式转化为L的:
L = R * 299/1000 + G * 587/1000 + B * 114/1000
运行结果分别如下
2.resize、rotate
图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。
img3=img.resize((300,200)) #调整图像大小
img3.show() #展示调整大小后的图像
print(img3.size) #打印图像尺寸
我们还可以对图像进行旋转
img4=img.rotate(angle) #调整图像旋转角度
img4.show() #展示调整旋转角度后的图像
3.crop
我们可以使用crop对图片进行截取拷贝,代码如下。
box = (20, 30, 300, 200) #确定拷贝区域大小
img5 = img.crop(box) #拷贝截取区域
img5.show() #展示拷贝图像
变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(x1,y1,x2,y2)就表示在原始图像中以左上角(x1,y1)为坐标原点,截取一个(x2-x1)*(y2-y1)(像素为单位)的图像。
运行结果如下
4.paste
我们可以使用paste将一张图粘贴到另一张图像上,我们使用刚刚截取的图像来进行以下操作。
img.paste(img5, (100,100)) #将截取的图片黏贴到原图像上(100,100)坐标处
img.show() #展示黏贴后的图像
结果如下
我们也可以使用定义了左,上,右和下像素坐标的4元组,代码如下
img.paste(img5, (50, 50, 330, 220))
img.show()
但要注意的是使用4元组时,被粘贴的图像的尺寸必须与区域尺寸一样。
5.split
split可以返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝),具体我们可以看一下下列代码
bands=img.split()
print(bands)
显示出如下数据:(<PIL.Image.Image image mode=L size=619x539 at 0x1E3CA46C888>, <PIL.Image.Image image mode=L size=619x539 at 0x1E3CA46CBC8>, <PIL.Image.Image image mode=L size=619x539 at 0x1E3CA4F43C8>)
分别对应我们分离出来的三个通道。
当然我们可以直接进行如下操作
r, g, b = img.split() #分离颜色通道
img6=Image.merge("RGB", (b, g, r)) #交换颜色
img6.show() #展示图片
需要提到的是merge函数,主要用于合并通道,表示为Image.merge(mode, bands),其中mode表示色彩,bands表示新的色彩通道。
结果如下:
我们还可以对分离出来的色彩通道进行调节,改变图片颜色,代码如下
r, g, b = im.split()
newg = g.point(lambda i: i * 1.3)#将G通道颜色值变为原来1.3倍
newb = b.point(lambda i: i > 100)#选择B通道值大于100的像素点
img7 = Image.merge("RGB",(r, newg, newb))
img7.show()
结果如下
关于图像处理还有许多操作,但限于篇幅在此不多加讲述,有机会再补充。
三.图像增强、过滤方法
1.Imagefilter
下面简单讲一下滤波操作,在这里我们要用到ImageFilter模块,在该模块中,预先定义了很多增强滤波器,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。
from PIL import ImageFilter # 调取ImageFilter
img8 = img.filter(ImageFilter.BLUR) #均值滤波
img9 = img.filter(ImageFilter.CONTOUR) #找轮廓
img10 = img.filter(ImageFilter.FIND_EDGES) #边缘检测
img8.show()
img9.show()
img10.show()
具体效果如下(还挺有趣)
其他效果可以逐一尝试,在此不多加展示。
2.ImageEnhance
ImageEnhance类提供5种高级图像增强功能,分别为enhance、Color、Contrast、Brightness、Sharpness,分别用于增强图像属性,调整颜色平衡,调整图像对比度,调整图像亮度,调整图像锐度。示例代码如下
from PIL import ImageEnhance #导入ImageEnhance模块
img11 = ImageEnhance.Contrast(img) #对原图像进行对比度调整
img11.enhance(10).show() #调整图像对比度为原来的10倍并展示
img12 = ImageEnhance.Sharpness(img) #对原图像进行锐度调整
img12.enhance(30).show() #调整图像锐度为原来的30倍并展示
结果如下
可以根据自己需求进行尝试。
至此,对PIL库的使用方法介绍就告一段落了(狗子都被我玩坏了),PIL库的确是一个强大的图像处理库,还有很多方法和更高级的操作暂时还在学习,今天主要对其进行了简单的介绍,更多还要在实际使用中进行学习。如果有什么错误或者讲的不对的地方欢迎大家指正。