python小项目二:图片转字符画

这个项目注意练习python使用命令行参数,以及PIL库的使用。本文是练习实验楼项目的个人笔记与总结。


项目目的:输入一幅图像,输出一个文本,其中每个图像中的像素根据其颜色的不同,用不同的字符表示。

效果如下:

python小项目二:图片转字符画-----------》》》》》》》》

python小项目二:图片转字符画


为了掌握这个项目,需要解决以下问题:


1. 首先需要建立图像像素颜色(这里是灰度值)对应的字符列表。这里我们采用'''[email protected]%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. '''这个字符串当中的字符建议灰度-字符映射表的右侧。

实际使用时,我们需要的是单独的一个个字符,所以我们这里使用list()函数将整个字符串变为单个字符的list,变量名为ascii_char。

由此,我们可以根据label = np.int(gray/(256.0+1)*len(ascii_char))建立映射关系。


2. 之后我们需要遍历图像,取出每一个像素点,然后通过映射表得到字符。问题在于:如何取出图像的像素点?如何保存每个像素点上的字符?

实验楼的项目中选用了PIL库,不过这个库使用起来并不是很方便,这里为了了解一个新的库,作者也进行了尝试。遍历图像的所有坐标点(即像素点),运用getpixel((i,j))方法来得到像素点的颜色。再利用映射关系,得到对应的字符,将其存在一个字符串之中(每一行执行结束后,字符串中多写一个‘\n’以保持图像形状不变)。

这里有几个坑需要注意, 

getpixel在取像素点时,需要取成(j,i),这样输出的结果才一致。而因为这个原因,如果输出的图像行列大小不一致,则会报错(索引超出范围);

有的图像(如该项目中的图片读入后,每一个像素点是四维的,所以需要先变换为rgb图像:image = Image.open('...'),rgb_im = image.convert('RGB'))之后才能用getpixel得到其r、g、b值。


3. 命令行参数设置与获取

先做命令行参数的直观说明。 运行python函数时,以Windows为例,可以在cmd命令窗口下输入python 代码名称.py来运行这个程序。同样的,我们可以在运行时输入这个代码需要的一些参数,例如python XXX.py image_path 100 100(运行XXX代码,分别给出图像路径,输出的高和宽)。

下面我们介绍上述的内容如何实现:

我们需要使用argparse库,然后进行三步走:

1.创建解析器对象:parser = argparse.ArgumentParser()

2.设置命令行参数和选项:parser.add_argument('file')

3.获取参数:args = parser.parse_args()

filepath = args.file

在设置命令行参数时有着更详细的设置参数,可参看argparse库的官方文档。


我编写的代码存放在:http://download.csdn.net/detail/u010103202/9867790,可以参考(实验楼为py2,我的为py3)。