当前位置:   article > 正文

image pil 图像保存_学会Pillow再也不用PS啦——Python图像处理库Pillow入门!

pillow 读取图片再原状保存为什么跟原来不一样

你在用什么软件进行图像处理呢?厌倦了鼠标和手指的拖拖点点,想不想用程序和代码进行图像的高效处理,Python作为简单高效又很强大的一门编程语言,对于图像的处理自然也是轻松拿下,听起来是不是很酷很极客,那么就跟着我来看看吧!

一、Python的强大图像处理库——Pillow

工欲善其事必先利其器, Python的标准库中虽然没有直接支持图像处理操作的模块,但我们可以通过Python生态圈中的第三方库来完成这些操作。

1 什么是Pillow:

Pillow作为python的第三方图像处理库,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

2 Pillow与PIL的关系:

PIL(Python Image Library)是python的第三方图像处理库,因其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。但由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

二、安装Pillow

如果安装了Anaconda,Pillow就已经可用了。

否则,需要在命令行下通过pip安装:

pip install pillow

三、基本操作

1 使用 Image 类:

PIL最重要的类是 Image class, 读取和处理图像都要通过这个类来完成。我们可以通过多种方法创建这个类的实例,你可以从文件加载图像,或者处理其他图像, 或者从 scratch 创建。

要从文件加载图像,请使用Image模块中的open函数:

  1. from PIL import Image
  2. # 打开一个jpg图像文件,注意是当前路径:
  3. im = Image.open('cat.jpg')

温馨提示:向左滑动可查看完整代码~)

如果成功,这个函数返回Image对象。您现在可以使用实例属性来检查文件内容:

  1. print(im.format, im.size, im.mode)
  2. JPEG (1920, 1200) RGB

format属为图像来源。如果不是从文件读取就是None。

size属性是包含宽度和高度(像素)的二元组)。

mode属性定义了图像中波段的数量和名称,以及像素类型和深度。常见模式为灰度图像为“L”(亮度),真彩色图像为“RGB”,印刷四色为“CMYK”。

获得了Image类的实例,就可以使用此类定义的方法来处理和操作图像。例如让我们显示刚刚加载的图像:

im.show()

1d27411e38aad30545136255e4bd6cc6.png

接下来让我们看看一些具体的图像处理操作吧~

2 保存指定格式的图像

save(filename,format) :

im.save("cat.jpg",'png')

上面的代码将图像重新保存成png格式

3 剪裁矩形区域 crop(box)

box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。

crop()返回的仍然是一个Image对象。

  1. im = Image.open("cat.jpg","r")
  2. box = (300,300,800,800)
  3. region = im.crop(box)
  4. region.show()
  5. im.crop()

上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来,效果如图:

e480f456c9f40c2dc0904cd13be1a3f9.png

562c4b9f746d85c817bb1a6e60349fab.png

4 图像粘贴 paste(region,box,mask)

region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。

  1. im.paste(region,(100,100),None)
  2. im.show()

上面的代码将region图像粘贴到左上角为(100,100)的位置,效果如图所示:

f30c92e36840b44fd82c0d5442e69dc0.png

5 生成缩略图 thumbnail(size,resample)

thumbnail可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。

  1. im.thumbnail((200,200),resample=Image.BICUBIC)
  2. im.show()

上面的代码形成了一个200×200的缩略图,效果如图:

39bebace1662db39bce1da6048b41898.png

6 旋转和翻转 transpose(method)

method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:

- Image.FLIP_LEFT_RIGHT,表示将图像左右翻转

- Image.FLIP_TOP_BOTTOM,表示将图像上下翻转

- Image.ROTATE_90,表示将图像逆时针旋转90°

- Image.ROTATE_180,表示将图像逆时针旋转180°

- Image.ROTATE_270,表示将图像逆时针旋转270°

- Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)

- Image.TRANSVERSE,表示将图像进行转置,再水平翻转

  1. im_rotate_180 = im.transpose(Image.ROTATE_180)
  2. im_rotate_180.show()

上面的代码将im逆时针旋转180°,然后显示出来,效果如下图:

eed548833741c703e61d4031493e4ad4.png

7 颜色通道分离split())

split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。

  1. r,g,b = im.split()
  2. r.show()
  3. g.show()
  4. b.show()

上面的代码将小猫图像的RGB颜色通道分离,效果如图:

ffb479e6a4cee67fe89edb5a4c18082f.png

520a27622a7eede2cbd8162e77168727.png

89efbce7e442e07fbd05349ca59e589a.png

8 颜色通道合并merge(mode,channels)

merge方法和split方法是相对的,其将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。

  1. im_merge = Image.merge("RGB",[b,r,g])
  2. im_merge.show()

上面的代码将小猫图像的颜色通道合并,效果如下图:

c83054a911a9d2b95488fbf86c66a237.png

9 颜色模式转换

convert(mode,matrix,dither,palette,colors)

convert方法可以改变图像的模式(mode),一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。

  1. im_L = im.convert ("L")
  2. im_L .show()

上面的代码就是将图像转化为灰度图。效果如下图:

614542849e9731ad526319366f26324a.png

10 图像过滤器 filter(filter)

filter方法可以将一些过滤器操作应用于原始图像,比如模糊,边缘增强、浮雕等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找边)等

  1. from PIL import Image, ImageFilter
  2. im = Image.open('cat.jpg')
  3. # 高斯模糊
  4. im_gaussianblur = im.filter(ImageFilter.GaussianBlur)
  5. im_gaussianblur.show()
  6. # 普通模糊
  7. im_blur = im.filter(ImageFilter.BLUR)
  8. im_blur.show()
  9. # 找到边缘
  10. im_find_edge = im.filter(ImageFilter.FIND_EDGES)
  11. im_find_edges.show()
  12. # 浮雕
  13. im_emboss = im.filter(ImageFilter.EMBOSS)
  14. im_emboss.show()
  15. # 轮廓
  16. im_contour = im.filter(ImageFilter.CONTOUR)
  17. im_contour.show()
  18. # 锐化
  19. im_sharpen = im.filter(ImageFilter.SHARPEN)
  20. im_sharpen.show()
  21. # 平滑
  22. im_smooth = im.filter(ImageFilter.SMOOTH)
  23. im_smooth.show()
  24. # 细节
  25. im_detail = im.filter(ImageFilter.DETAIL)
  26. im_detail.show()

下图依次为浮雕与轮廓效果:

2670a51e3cb1076ece96b817a6e66279.png

b43499d8df9ab9a987745f9294445877.png

11 图像增强ImageEnhance()

图像增强也是图像预处理中的一个基本技术,Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的白平衡(Color)、亮度(Brightness)、对比度(Contrast)和锐化(Sharpness)等。

  1. from PIL import ImageEnhance
  2. brightness = ImageEnhance.Brightness(im)
  3. im_brightness = brightness.enhance(1.5)
  4. im_brightness.show()

上面的代码将原来图像的亮度增加50%,效果如下图:

eaf7e107e281e638ab8f07b896c98c55.png

四、练习项目——图片转字符画

看完了上面的操作是不是手痒痒呢,下面我们一起来做一个有趣的练手项目吧~

主要思路

读取彩色图片的RGB值,利用公式转化为灰度值,将图片的灰度值与你自己设定的字符集之间建立映射关系,不同区间的灰度值对应不同的字符。最后将每个像素对应的字符按照原位置打印出来

测试图片与结果:

45a998aac9ea42f01cc525d9a3d37d6f.png

操作代码:

  1. # -*- coding: utf-8 -*-
  2. from PIL import Image
  3. codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集
  4. count = len(codeLib)
  5. def transform1(image_file):
  6. image_file = image_file.convert("L") #转换为黑白图片,参数"L"表示黑白模式
  7. codePic = ''
  8. for h in range(0,image_file.size[1]): #size属性表示图片的分辨率,'0'为横向大小,'1'为纵向
  9. for w in range(0,image_file.size[0]):
  10. gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组
  11. codePic = codePic + codeLib[int(((count-1)*gray)/256)]#建立灰度与字符集的映射
  12. codePic = codePic+'rn'
  13. return codePic
  14. def transform2(image_file):
  15. codePic = ''
  16. for h in range(0,image_file.size[1]):
  17. for w in range(0,image_file.size[0]):
  18. g,r,b = image_file.getpixel((w,h))
  19. gray = int(r* 0.299+g* 0.587+b* 0.114)
  20. codePic = codePic + codeLib[int(((count-1)*gray)/256)]
  21. codePic = codePic+'rn'
  22. return codePic
  23. fp = open(u'gray.jpg','rb')
  24. image_file = Image.open(fp)
  25. image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整图片大小
  26. print(u'Info:',image_file.size[0],' ',image_file.size[1],' ',count)
  27. tmp = open('tmp.txt','w')
  28. tmp.write(transform1(image_file))
  29. tmp.close()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/804164
推荐阅读
相关标签
  

闽ICP备14008679号