前段时间我们学习了很多Python的基础语法,但是对于各种库的使用还是一知半解的,接下来我们挑选出几个重要库,通过有意思的小项目了解这些库的知识点。
在Python中,有一个优秀的图像处理框架叫作PIL库,今天我们利用PIL库将图片变成一幅黑白字符画。
字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。
如果我们想要手工绘制出字符画,首先要有扎实的美术基础,其次还要花费大量的时间和精力。但是我们可以使用Python,只需要几行代码,就能够将一张图片轻而易举地转化为一个字符画。
这幅小猪佩奇就是利用Python的PIL库,通过字符代替颜色的方法完成的字符画。
我们知道一张RGB模式的图片是由很多个像素点组成的,而每一个像素点都有不同的颜色,而这个颜色可以由三个值表示(RGB,范围0-255),这三个值对应组成这种颜色的三原色百分比。所以RGB模式总共可以表现256×256×256=16777216种颜色。如果可以将每个像素根据颜色找一个字符替换,这样就能形成一个字符图画了。
那么问题来了,我们没有这么多种字符来一一对应每种颜色啊,这时就要引入灰度概念了,对于黑白图像中的像素我们可以用灰度值表示其颜色深度,范围一般从0到255,白色为255,黑色为0。这种图片也称灰度图像,我们可以通过RGB转化灰度公式将像素的RGB值映射成灰度值。这个公式具体算法不止一种(常见的有三种),算出的结果也略有不同,有兴趣的同学可以百度搜索一下其中的算法。
灰度值公式:Gray=0.2126×R+0.7152×G+0.0722×B
通过公式的转换可以将256×256×256的颜色范围减少到0-255的灰度范围。但是256个数值范围还是有点多了,难以用字符一一对应,不过稍微灵活变通一下,将两到三个灰度值对应为一个字符便可成功解决了。
首先导入Python图片处理库——PIL。自定义字符画所需要使用的字符集是ascii_char,我选择了其中70个字符,字符顺序影响与灰度的对应关系,可以根据字符画的效果反复调整。
选择一张需要字符画的图片,这里我选取了一张哆啦A夢的头像,确定好字符画的宽度和高度,考虑到字符本身的高宽比,为了美观考虑图片的宽度最好是高度的两倍多一点。接下来我们需要定义一个get_chart函数,此函数的目的是通过灰度来区分颜色块。利用灰度值公式计算出不同的灰度对应的不同字符。将需要的图片导入到Python环境中,通过双重for循环对图像的像素点进行遍历,利用灰度值公式进行灰度值转换,输出对应的字符画。程序运行后字符画和原图可以做一个对比,可以发现字符画在一些细节上还可以优化,比如根据字符的复杂程度调整list的顺序,总的来说转换过程还是达到了预期目的。
通过转换哆啦A梦成为字符画的案例我们又学会了一项新的技能,赶紧打开你的Python编辑器制作一幅有趣的字符画吧,偷偷告诉你Python还可以制作GIF动态的字符动画哦,还不赶紧去试试看。