640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 阿广

责编 | 胡巍巍


640?wx_fmt=png

基于Python的铅笔素描图


说到铅笔素描,很多画家用它用得极为精湛。

有的细致到跟照片无法区别,简直是墨笔丹青,如行云流水绕素笺,展瀚海崇山依旧颜,怎一个好字了得;但是有的人画素描怎么花都画不好。

那么同一根铅笔,为啥差距这么大呢?今天笔者给大家介绍一种使用PIL库对原画自动生成素描画。

640?wx_fmt=png

思考

  • 铅笔素描的细节实体如何和Python灰度化、模糊度进行转换?

  • 模糊度和参数如何调节?

彩色图像和铅笔素描对比

640?wx_fmt=jpeg

笔者丑照图

640?wx_fmt=png

笔者丑照铅笔素描图

640?wx_fmt=png

山东科技大学校训彩色图

640?wx_fmt=png

山东科技大学校训铅笔素描图

640?wx_fmt=jpeg

济南校区一角风景原图

640?wx_fmt=png

济南校区一角风景铅笔素描图

640?wx_fmt=jpeg

山科一角美景图

640?wx_fmt=png

山科一角铅笔素描图

爬虫技术分析

PIL库:

PIL(Python Image Library)是Python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是Python官方图像处理库了。其官方主页为:PIL。

PIL历史悠久,原来是只支持Python2.x的版本的,后来出现了移植到Python3的库Pillow,Pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持Python3。

代码解析

导入PIL库

 
 

from PIL import Image, ImageFilter, ImageOps

加载图片

 
 

#先到相应的路径下加载到这张图片
img = Image.open('zandaoguang.jpg')  #jpg和png格式均可

处理图片并展示图片

 
 

def Formula(a, b, alpha):
   return min(int(a*255/(256-b*alpha)), 255)

#通过双层for循环将图片转换
def zandaoguang(img, blur=25, alpha=1.0):
 img1 = img.convert('L')        #图片转换成灰色
 img2 = img1.copy()
 img2 = ImageOps.invert(img2)
 for i in range(blur):          #模糊度
   img2 = img2.filter(ImageFilter.BLUR)
 width, height = img1.size
 for x in range(width):
   for y in range(height):
     a = img1.getpixel((x, y))
     b = img2.getpixel((x, y))
     img1.putpixel((x, y), Formula(a, b, alpha))
 img1.show()  #展示图片效果

zandaoguang(img)

由于篇幅原因,这就只展示部分代码,详情请查看源码请自行去GitHub下载:

  • https://github.com/zandaoguang/pic_proc

后记

毕加索曾经说过:“我在十几岁时画画就像个古代大师,但我花了一辈子学习怎样像孩子那样画画。”

最后笔者想对大家说:画画,我是认真的;搞笑,绝对不是故意的。


640?wx_fmt=png

如何利用Python打飞机?


学过爬虫的朋友都知道,它是一门“以简制胜”的语言,在笔者两天的努力下,使用200行代码完成了“打飞机”小游戏。

我相信雷霆战机很多人都玩过吧,它是Pygame库开发出来的。同时,它还可以开发扫雷、坦克大战等很多有趣的游戏!

        640?wx_fmt=jpeg 

640?wx_fmt=png

游戏界面

游戏说明

  • 这是一个简易的Python游戏代码,很多细节都没有去做;

  • 大家克隆下来可以直接运行showEnemy.py即可;

  • ↑↓←→和ASDF控制方向,空格键发射子弹;

  • Random函数主要实现敌方飞机产生和子弹的发射频率;

  • time.sleep()为了让CPU休息;

  • 后期我们完善的时候可以加上击中等场景的特效。

部分代码

初始化飞机参数

 
 

def __init__(self,screen):
       #设置飞机默认的xy值
       self.x=180
       self.y=600
       self.screen=screen
       self.imageName='./feiji/hero.gif'
       self.image=pygame.image.load(self.imageName).convert()
       self.bulletList=[]
       self.needRemoveList=[]

显示飞机

 
 

def display(self):
       self.screen.blit(self.image,(self.x,self.y))
       for bullet in self.bulletList:
           bullet.display()
           bullet.move()
       for bullet in self.bulletList:
           if bullet.judgeOut():
               self.needRemoveList.append(bullet)
       for bullet in self.bulletList:
           if bullet in self.needRemoveList:
               self.bulletList.remove(bullet)

飞机移动

 
 

def move(self,opt):
       if opt=='left':
           self.x-=15
       elif opt=='right':
           self.x+=15
       elif opt=='up':
           self.y-=15
       elif opt=='down':
           self.y+=15

飞机射击

 
 

def shoot(self):
       newBullet=Bullet(self.screen,self.x,self.y)
       newBulletLeft=BulletSmall(self.screen,self.x,self.y)
       newBulletRight=BulletSmall(self.screen,self.x+64,self.y+20)
       self.bulletList.append(newBulletLeft)
       self.bulletList.append(newBulletRight)
       self.bulletList.append(newBullet)

Python版雷霆战机完整代码链接:

  • https://github.com/zandaoguang/play-plane

之前玩雷霆战机的时候,看起来打飞机游戏蛮复杂,结果经过自己的实现之后,发现仅仅200行就能完成一个打飞机的小项目。

敲黑板,我们在做任何一件事情得时候,一定不要眼高手低,也不要大题小作。

只要是认真做就可以超越昨天的自己。像这款游戏一样,我们的人生只有一关一关的击败敌机(困难),只有在击败了敌机的情况下(完成了艰难任务),我们才能获得新的装备(知识),不断攀升,最终经过不断提升自己,走向成功!下面是啊广总结,与大家共勉!

眼高手低志不广,

欺软怕硬人嚣张;

欲上天宫揽明月,

以为自己会飞翔!

作者简介:阿广。本文首发个人公众号视学算法,专注于大数据、人工智能和算法的学习平台,也是一名保送中科院软件研究所直博的技术提升之路。人生苦短,我愿做您最忠实的技术支持伙伴!一起用代码改变世界!

声明:本文为作者投稿,版权归其个人所有。

推荐阅读:

640?wx_fmt=gif

640?wx_fmt=gif

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐