pythonpil库详解_Python爬虫 PIL库应用详解-Go语言中文社区 - Go语言中文社区

pythonpil库详解_Python爬虫 PIL库应用详解-Go语言中文社区


Python爬虫(十六)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— PIL库应用详解 ——

1. 安装

windows系统:pip install pillow

Linux系统:

安装支持:sudo apt-get install python-imaging

安装依赖:

sudo apt-get install libjpeg62-dev

sudo apt-get install zlib1g-dev

sudo apt-get install libfreetype6-dev

sudo apt-get install liblcms1-dev

安装库:sudo pip install Pillow

2. 方法

我们这次学习主要操作下面的图片:

bed02926e30774697670891febf7594b.png

夹带私货,就用女神照片,允儿的冷白皮爱了爱了,顺便说一句,林允儿超美。(痴汉笑)

new(mode, size,color):新建一个空白的图片。

im3 = Image.open("/home/cjt/pythontext/s1.png")

n_im= Image.new("RGB", (128, 128), "#FF0000")

n_im.show()

结果如图:

8e3e4252bdac568d720affbd6065c2ed.png

【注意!】虽然是新建图片,但是必须先打开一张图片在进行操作,否则会报错!

mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说 ‘L’(luminance)表示灰度图像, ‘RGB’ 表示真彩图像, ‘CMYK’ 表示预先压缩的图像。

size是给定的宽/高二元组,这是按照像素数来计算的。

对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。

open(filename,mode):打开一张图像。

例如:

from PIL import Image

im = Image.open('/home/cjt/pythontext/1.jpeg')

print (im.format, im.size, im.mode)

结果如图:

691356339bf692c68733ddb330ff881a.png

(上面的.format、.size、.mode是一些图片的信息,详见后面的方法)

Image.open返回一个Image对象,该对象有size,format,mode等属性,其中:

size表示图像的宽度和高度(像素表示)

format表示图像的格式,常见的包括JPEG,PNG等格式

mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说 ‘L’(luminance)表示灰度图像, ‘RGB’ 表示真彩图像, ‘CMYK’ 表示预先压缩的图像。

save(filename,format):保存指定格式的图像。

im.save("1.png",'png')

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

结果如图:

667afcf3ae29c7713e22d7a1c15e008e.png

thumbnail(size,resample):创建缩略图。

im.thumbnail((50,50),resample=Image.BICUBIC)

im.show()

上面的代码可以创建一个指定大小(size)的缩略图。

crop(box):裁剪矩形区域。

im = Image.open("1.jpg","r")

box = (100,100,200,200)

region = im.crop(box)

region.show()

im.crop()

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

box是一个元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y)

分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。

transpose(method):图像翻转或者旋转。

im_rotate_180 = im.transpose(Image.ROTATE_180)

im_rotate_180.show()

结果如图:

62379b6365a5c588d41bb4e90c971ef3.png

上面的代码将im逆时针旋转180°,然后显示出来,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,表示将图像进行转置,再水平翻转

paste(region,box,mask) :将一个图像粘贴到另一个图像。

im.paste(region,(100,100),None)

im.show()

上面的代码将region图像粘贴到左上角为(100,100)的位置。

region是要粘贴的Image对象

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

split():颜色通道分离。

r,g,b = im.split()

r.show()

g.show()

b.show()

结果如图:

a65a351030c62565106a30e4b0edb90e.png

39693f8ee13da5d45a3c9de9fc38bbf4.png

be76bbc80aa533015cdae05b59b4b392.png

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

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

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

im_merge.show()

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

resize(size,resample,box)

im_resize = im.resize((200,200))

im_resize

结果如图:

1609b7b853f7fd51fee42a5f11b2fff8.png

im_resize.show()

结果如图:

1748c2cf5aab452fe9a6583848ce542e.png

resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法,默认是PIL.Image.NEAREST,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。

convert(mode,matrix,dither,palette,colors):mode转换。

im_L = im.convert("L")

im_L.show()

结果如图:

afe87213ae86fea1c9d3dd962a282c50.png

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

值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。

filter(filter):应用过滤器。

from PIL import ImageFilter

我们需要引入PIL库的另一个类,ImageFilter类。

im_blur = im.filter(ImageFilter.BLUR)

im_blur.show()

进行模糊操作。

结果如图:

ff150d30ca0f2357a7004ea21268fad0.png

im_find_edges = im.filter(ImageFilter.FIND_EDGES)

im_find_edges.show()

进行查找边(描边)操作。

结果如图:

202780ca1dc8856a58da986f1ed9d0fb.png

filter方法可以将一些过滤器操作应用于原始图像,比如模糊操作,查找边、角点操作等。

filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(模糊操作),GaussianBlur(高斯模糊),MedianFilter(中值过滤器),FIND_EDGES(查找边)等。

point(lut,mode) :对图像像素操作。

im_point = im.point(lambda x:x*1.5)

im_point.show()

结果如图:

3da5a29c721651d6714a4087295afd55.png

point方法可以对图像进行单个像素的操作,上面的代码对point方法传入了一个匿名函数,表示将图像的每个像素点大小都乘以1.5,mode是返回的图像的模式,默认是和原来图像的mode是一样的。

load():取出图像中某个点的RGB值。

pix = im.load()

print pix[1,2]

结果如图:

7e6f4b38fc3f9655b95613a744be1b75.png

putpixel(xy,colour):修改指定位置上的像素值。对于单通道图像,变量colour为一个数值;对于多通道图像,变量colour为一个元组。

im.putpixel((1,2), (255,0,255))

【注意】 对于大部分图片修改一个像素并不能看出什么,可以建立循环,改变大部分像素。

ImageSequence():处理图像序列。

下面的代码可以遍历gif图像中的所有帧,并分别保存为图像

from PIL import ImageSequence

from PIL import Image

gif = Image.open("pipixia.gif")

for i,frame in enumerate(ImageSequence.Iterator(gif),1):

if frame.mode == 'JPEG':

frame.save("%d.jpg" %i)

else:

frame.save("%d.png" % i)

原图gif:

9461ff840a9070088c7c8f44ec9e7230.gif

结果如图:

6c8c5cf57efd75dcca53b8b7bafd9a29.png

结果产生了三十张图片,选择其中一张:

70290acb01deabfcbe1e9f718f1e5741.png

3. 趣味小P图

运用ImageEnhance类对照片进行修改。

from PIL import ImageEnhance

brightness = ImageEnhanBce.Brightness(im)

im_brightness = brightness.enhance(1.5)

im_brightness.show()

结果如图:

c9e01347afe77f9521c8d0af61cf67db.png

im_contrast = ImageEnhance.Contrast(im)

im_contrast.enhance(1.5).show()

结果如图:

7571b0705cb94a2b53a45ab0ba54d00a.png

ImageEnhance是PIL下的一个子类,主要用于图像增强,比如增加亮度(Brightness),增加对比度(Contrast)等。上面的代码将原来图像的亮度增加50%,将对比度也增加了50%。

这里说一句:女神的颜真的服气,不仅一帧一帧剪切也能这么好看。还驾驭各种高亮修改。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_44867435/article/details/104867915

站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

发表于 2020-04-18 20:26

阅读 ( 82 )

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39846553/article/details/113647530
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2022-12-29 21:36:22
  • 阅读 ( 223 )
  • 分类:Go应用

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢