前段时间,我们学习了很多Python的基本语法,但是对各种库的使用了解不多。接下来我们选取了几个重要的库,通过有趣的小项目学习这些库的知识点。
在Python中,有一个优秀的图像处理框架,叫做PIL库。今天,我们用PIL图书馆把一幅画变成了一幅黑白人物画。
人物画是一系列人物的组合。我们可以把字符想象成更大的像素,一个字符可以表达一种颜色。人物种类越多,可以表现的色彩就越多,画面也会越有层次感。
想要手绘人物画,首先要有扎实的美术功底,然后要花费大量的时间和精力。但是我们可以用Python,只需要几行代码就可以轻松的把一张图片变成人物画。
这个小猪佩奇是一幅人物画,使用Python的PIL库,用人物替换颜色完成的。
我们知道一张RGB模式的图片是由很多像素组成的,每个像素都有不同的颜色,而这个颜色可以用三个值来表示(RGB,范围0-255),对应的是组成这个颜色的三原色的百分比。所以RGB模式总共可以表现256× 256× 256 = 16,777,216种颜色。如果每个像素可以根据其颜色用一个字符代替,就可以形成一个字符图片。
那么问题来了。我们没有那么多字符去一一对应每种颜色。这时候我们就要引入灰度的概念了。对于黑白图像中的像素,我们可以用灰度值来表示它们的色深。通常,范围是从0到255,白色为255,黑色为0。这种图片也叫灰度图像。我们可以通过RGB转换灰度公式将像素的RGB值映射成灰度值。这个公式的具体算法不止一个(常见的有三个),计算结果略有不同。有兴趣的同学可以百度一下算法。
灰度值公式:灰度= 0.2126× r+0.7152× g+0.0722× b
通过公式的转换,可以将256×256×256的色彩范围缩小到0-255的灰度范围。但是256个数值的范围还是有点多,很难用字符一一对应。然而,通过将两个或三个灰度值对应到一个字符,可以使用一点灵活性来成功地解决问题。
首先,导入Python图像处理库——PIL。自定义字符绘制需要的字符集是ascii_char,我在其中选了70个字符。字符顺序影响与灰度的对应关系,可以根据字符绘制的效果反复调整。
选一张需要画人物的图。在这里,我选择了哆啦a梦的头部来确定人物画的宽度和高度。考虑到人物本身的长宽比,为了美观,画面的宽度应该是高度的两倍多一点。接下来,我们需要定义一个get_chart函数。该功能的目的是通过灰度区分色块。利用灰度值公式,计算出对应不同灰度级的不同字符。将所需图片导入Python环境,通过double for循环遍历图像的像素,利用灰度值公式转换灰度值,输出相应的字符图片。运行程序后,可以将人物画图与原图进行对比,可以发现人物画图在一些细节上可以进行优化,比如根据人物的复杂程度调整列表的顺序。总的来说,转换过程达到了预期目的。
把哆啦a梦改造成人物画案,我们学到了一项新技能。赶紧打开你的Python编辑器,做一个有趣的人物画像吧。偷偷告诉你,Python还可以制作动画GIF角色。不要急着尝试。
评论列表()