教你把Python当美图秀秀用(二)
本文作者:钱梦璇
文字编辑:孙晓玲
导读
在《教你把Python当美图秀秀用(一)》中介绍了PIL图形处理库以及一些图像处理方法,本文将继续介绍更有趣的其他方法,一起来感受下它的神奇吧。
有时候我们希望在美图秀秀中将一个图像模糊化,或者说对图像中的人物轮廓化、锐化等,有些滤镜可以帮我们做到这些。同样地,PIL库中的Image类也可以实现这些操作。
采用的方法是ImageFilter模块中的filter函数,此函数会返回一个给定滤波器处理过的图像的拷贝。这就类似在神经网络中的滤波器一样,不同的滤波器会观测到不同的特征。
from PIL import Image
from PIL import ImageFilter
cat=Image.open('喵星人.jpg')
cat.show()
展示将要处理的图像:
应用一些过滤器操作:
cat_blur=cat.filter(ImageFilter.BLUR)
cat_blur.show()
cat_edge=cat.filter(ImageFilter.FIND_EDGES)
cat_edge.show()
cat_shap=cat.filter(ImageFilter.SHARPEN)
cat_shap.show()
在ImageFilter模块中,预定义了很多增强滤波器,比如BLUR均值滤波,对图像进行模糊处理,FIND_EDGES用于对边缘进行检测,SHARPEN对图像进行锐化,这些都是美图秀秀调整图像时的操作。
三种处理展示的图像如下所示:
Image中的blend方法可以使用给定的两张图像以及透明度α,插值出一张新的图像,它的函数格式为Image.blend(image1,image2, alpha)。合成的公式为:image1 (1.0 - alpha) +image2 alpha.如果透明度变量α值为0.0,返回的是第一张图像,如果为1.0,则返回第二张图像。
但需要注意的是,合并的两张图像必须有一样的尺寸和模式。采用上篇文章中的猫猫图像,将两张图像设置为相同的尺寸。
cat2=Image.open('猫猫.jpg','r')
cat2.show()
print(cat.size,cat2.size)
由于两张图像的尺寸不同,通过resize函数将cat2的图像大小变为(237,311)。
cat2=cat2.resize((237,311))
print(cat2.size)
接下来,只需设置透明度变量alpha为0.5,利用blend函数将两张图像合并在一起。
catmerge=Image.blend(cat,cat2,0.5)
catmerge.show()
美图秀秀也没有的功能:图像序列的遍历
小编有时在看到一个可爱的gif动图时,只想保存动图中某个瞬间的图像,这时PIL同样可以帮上忙。
通过图像序列ImageSequence模块可以遍历gif图像中的所有帧,并保存为图像。其实,这里的帧指的是动画中最小单位的单幅动画画面,也就是动图中的某个瞬间,相当于电影胶片上的每一格镜头。
导入如下所示的小黄人动图:
from PIL import ImageSequence
from PIL import Image
gif = Image.open("小黄人动图.gif")
for i,frame in enumerate(ImageSequence.Iterator(gif)):
if frame.mode == 'JPEG':
frame.save("%d.jpg" %i)
else:
frame.save("%d.png" % i)
通过ImageSequence模块中的迭代器来遍历小黄人动图中的所有帧,并根据图像格式和数字对每个图像命名。
最终得到的14张图像如下所示:
同样,你也可以拿它做电影片段每一帧的保存,这样就可以做成豆瓣上的那种影视经典画面的分享图啦!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。