Python图像PIL库的使用学习 您所在的位置:网站首页 Python编辑图片库 Python图像PIL库的使用学习

Python图像PIL库的使用学习

2024-05-24 06:54| 来源: 网络整理| 查看: 265

背景:深度学习数据扩充,遍历文件夹中的图片进行重命名,经过对图片一系列处理后保存到另一个文件夹。在此处我们主要使用PIL库进行图像的处理。将代码整合封装成类,参考一些博客在后文说明。

数据增强包括:旋转,镜像,对比度,亮度,平移,锐度,模糊,裁剪,缩放等等。

此处我们使用的方法包括180°旋转,水平镜像,对比度增强20倍,高斯模糊,裁剪共6种方法。大家可以根据自己需要添加删除。

PIL(Python Image Library)是python的第三方图像处理库,可以通过pip进行安装使用,PIL库支持图像存储,显示和处理,能够处理几乎所有的图片格式,包括21个与图片相关的类。此处重点使用Image类、ImageEnhance类、ImageFilter类。

先贴代码再说明

from PIL import Image, ImageFilter, ImageEnhance import os class Batchpicture(): def __init__(self, file_path, save_path): #file_path是图片所在路径,save_path为图片另存为路径 self.file_path = file_path self.save_path = save_path def rename_picture(self): filelist = os.listdir(self.file_path) #列举目录下的所有文件。返回的是列表类型。 total_num = len(filelist) #得到文件夹下文件总数量 i = 0 for item in filelist: #循环文件夹 if item.endswith('.png'): #判断文件是否为图像,此处‘png’可以根据需要修改或者添加图片后缀参数。 src = os.path.join(os.path.abspath(self.file_path), item) #旧名称 dst = os.path.join(os.path.abspath(self.file_path), str(i) + '.png') #修改后的名称 try: os.rename(src, dst) #重命名 print("coverting %s to %s..." % (src, dst)) i = i + 1 except: continue print("total %d to rename & conveted %d " % (total_num, i)) def operating_picture(self): filelist = os.listdir(self.file_path) print("the number of total pictures is %d" % len(filelist)) for i in range(len(filelist)): png_name = Image.open(self.file_path + str(i) + ".png") # 读取图片 img_rotate = png_name.rotate(180) # 180旋转 img_rotate.save(self.save_path + str(i) + "rotate.png") #另保为图片 img_out = png_name.transpose(Image.FLIP_LEFT_RIGHT) # 水平镜像 img_out.save(self.save_path + str(i) + "out.png") img_contrast = ImageEnhance.Contrast(png_name) # 对比度增强20倍 img_contrast.enhance(20).save(self.save_path + str(i) + "contrast.png") img_gaussianblur = png_name.filter(ImageFilter.GaussianBlur) # 高斯模糊 img_gaussianblur.save(self.save_path + str(i) + "gaussianblur.png") img_l = png_name.convert("L") # 转为灰度图 img_l.save(self.save_path + str(i) + "l.png") img_crop = png_name.crop((10, 10, 320, 320)) # 裁剪 img_crop.save(self.save_path + str(i) + "crop.png") print("%d pictures successfully operated" % i)

看一下运行前

运行代码及结果:文件夹中两张图片,代码结果最后一行显示1张成功操作,实际为两张都成功操作,因为 代码for i in range(len(filelist))中i从0开始计算,我没有修改。

在PIL中,任何一个图像文件都可以用Image对象表示。opencv读取图像出来的数组是BGR格式,而不是我们用的最多或者是图片原来的格式。在一些处理图像工作之前要进行像素的转换。而PIL读取图像是RGB格式,无需再转换。计算机通常将图像表示为RGBA值,A代表alpha值,或者称为透明度。RGBA在PIL中范围都为0~255之间,当A为0时,什么颜色都不可见,可理解成透明。

在进行裁剪缩放时,一些图片可能会失真严重,对于这种情况基本不可避免。一般情况下,位图(点阵图像)是由像素阵列组成,每个像素点颜色不同,放大位图可以看到构成图像的基本像素单元,能够表达色彩丰富的图像效果,但是在放大时会失真。矢量图使用直线和曲线描述图形,图像元素一般为点,线,矩形,弧线等等,优点是在放大裁剪等情况下不会失真,缺点就是难以表达色彩层次丰富的逼真图像效果。

代码中的方法属性说明:

Image类:

Image.open(filename) #根据参数加载图像文件---方法 Image.format #标识图像格式或来源,如果图像不是从文件中读取,值为None---属性 Image.mode #图像的色彩模式,"L"为灰度图像,"RGB"为真彩色图像,"CMYK"为出版图像---属性 Image.size #图像的宽度和高度,单位是像素,返回值为二元元组----属性 Image.save(filename, format) #将图像保存为filename文件名,format是图片格式---方法 Image.convert(mode) #使用不同的参数,转换图像为新的模式---方法 Image.resize(size) #按size大小调整图像,生成副本----方法 Image.rotate(angle) #按angle角度旋转图像,生成副本---方法 Image.crop(left, up, right, below) #左上右下的距离裁剪图片---方法

ImageFilter类:

ImageFilter.GaussianBlur #图像的高斯模糊效果---属性

利用Image类的filter()方法可以使用ImageFilter类,使用方式如下:

Image.filter(ImageFilter.fuction) #代码中使用此方式

ImageEnhance类:

ImageEnhance.enhance(factor) #对选择属性的数值增强factor倍 ImageEnhance.Contrast(im) #调整图像的对比度

代码麻烦?可以使用ACDSee软件

就是这个,可以按照一定规则重命名排序,还有很多其它功能,感兴趣可以探索。

参考:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有