GRzhan
通过简单的Python代码来做ascii字符画

写这个东西的原因是问社团前辈买的云主机到了,用putty连上去后想在/etc/motd里加点东西。

考虑了下就网上参考了些Python的代码弄个字符画。

另外大概PIL还是挺有用的,基友在学校写的选课机其中的验证码识别就是用PIL处理的。大概以后自己也要挖模式识别的坑所以就先看一点。

因为以前libjpeg没装好配置不对所以下下来的PIL有点问题,花了半个下午的时间。

---

大家如果经常逛B站或者网站的话可以看到一些用ASCII码制作的动画。(一般都是 Bad Apple的 PV,因为比较好处理)

比如 http://www.bilibili.tv/video/av419052/

在视频中采用的技术应该是 Python + PIL + OpenCV , PIL是一个Python的数字图像处理库(Python Image Library),OpenCV功能更加强大,负责处理视频帧,而这

一切库的调用以都是在Python语言编程基础上实现的。

Python跟C一样是一门高级语言,跟PHP一样是一门脚本语言,现在因其简单的语法强大的功能以及优秀的设计在各个领域都十分流行。

强烈建议没有接触过Python以及希望学习编程的同学学习Python这门语言,比C/C++要简单多了=,=。

这个贴子呢主要讲的是通过Python + PIL 库来制作一些字符画,效果如图(选用我们社团logo的jpg图片)

在写代码之前要确定自己装了Python(我用的是Python2.7,在Linux多数发行版本中自带)以及PIL库(PIL库在使用之前libjpeg等库作为扩展,代码运行时如果碰到问题可以去网上搜索解决或者找我)

Python下载地址:http://www.python.org/getit/

PIL下载地址(不知道Windows要不要装别的库~_~,Linux安装会遇到点问题):http://www.pythonware.com/products/pil/

使用的代码大概也是参考来的(http://zhan.renren.com/linuxfunc ... 717986&checked=true),去掉装饰器后加上注释:

[mw_shl_code=python,true]

#-*- coding: utf-8 -*-

# Image 库即PIL,是用来进行数字图像处理的Python库

import Image

# color = 'MNHQ$OC?7>!:-;.'

# 字符映射,将对应的像素根据其灰度映射成不同的字符,比如 `M` 代表黑色, ' '空格代表白色等

color = 'MNHQ$OC?7>!:- '

def make_char_img(img):

""" 将已经预处理好的图片根据color生成字符字符串,存放到 pic_str 变量中 """

pix = img.load()

pic_str = ''

width, height = img.size

for h in xrange(height):

for w in xrange(width):

pic_str += color[int(pix[w,h]) * 14 /255]

pic_str += '\n'

return pic_str

def preprocess(img_name):

""" 预处理: 通过使用PIL库里的函数将图片打开并重新缩放大小"""

img = Image.open(img_name)

w, h = img.size

m = max(img.size)

# 修改 delta 可以更改图片的大小,分母越大图片越大。

delta = m / 50.0

w, h = int(w/delta), int(h/delta)

img = img.resize((w,h))

img = img.convert('L')

return img

def save_to_file(filename, pic_str):

""" 将生成的图片载入到 filename 中"""

outfile = open(filename,'w')

outfile.write(pic_str)

outfile.close()

def main():

""" 这是主函数,相当于 C 里的 int main() """

# 预处理 'ncg.jpg' 图片,把处理好的图片放入 img 变量中

img = preprocess('ncg.jpg')

# 生成图片字符串

pic_str = make_char_img(img)

# 保存字符串到 foo.txt 中

save_to_file('foo.txt', pic_str)

if __name__ == '__main__':

main()

[/mw_shl_code]

之后只要在当前文件夹里放好对应图片,用python解释器跑一下即可。

关于在Linux使用的时候会碰到错误,应该是没有安装libjpeg库(或者在编译PIL的时候没有指定路径无法安装扩展)

这里有解决方案:

http://www.360doc.com/content/13/0314/15/7972_271475405.shtml

http://mariz.org/blog/2007/01/26 ... jpeg-not-available/ 在使用这个解决方案的时候请在对libjpeg源码进行编译并要 "./configure" 时加上 --enable-static选项(大概是这个如果不是查查下载下来的文档,README啊 install.doc什么的)

opencv的话,最近学校里有数字图像处理课还是蛮不错的,基友玩机器人搞Kinect也挖了不少坑,这学期可以多研究研究,搞个PHP的扩展出来。

neuront
思路不错
展开Biu

思路不错, 不过用的字符是不是区分度略挫了一点呃...

另外, 稍作一点修改

[mw_shl_code=python,true]import sys

def save_to_file(outfile, pic_str):

""" 将生成的图片载入到 filename 中"""

outfile.write(pic_str)

def main():

""" 这是主函数,相当于 C 里的 int main() """

# 预处理 'ncg.jpg' 图片,把处理好的图片放入 img 变量中

if len(sys.argv) < 2:

print >> sys.stderr, 'Image not specified'

return sys.exit(1)

outfile = sys.stdout if len(sys.argv) < 3 else open(sys.argv[2], 'w')

img = preprocess(sys.argv[1])

# 生成图片字符串

pic_str = make_char_img(img)

# 保存字符串到 foo.txt 中

save_to_file(outfile, pic_str)

outfile.close()

[/mw_shl_code]

这样可以用

[mw_shl_code=shell,true]python ascii.py INPUT_IMAGE [OUTPUT_TEXT_FILE][/mw_shl_code]

来指定输入输出文件了@@1!!

[查看全文]
GRzhan
主要处理是读汉字点阵做匹配
展开Biu

dchneric 发表于 2013-9-9 00:58

主要处理是读汉字点阵做匹配,图像side取决于输入type。我也可以直接提供0101010作为输入嘛,避开图像格 ...

刚发现是汉字...=367=

[查看全文]
dchneric
的话应该也很简单写出来吧
展开Biu

GRzhan 发表于 2013-9-8 16:24

用Opencv的话应该也很简单写出来吧

主要处理是读汉字点阵做匹配,图像side取决于输入type。我也可以直接提供0101010作为输入嘛,避开图像格式解析

[查看全文]
GRzhan
刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆
展开Biu

dchneric 发表于 2013-9-8 12:03

刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆  癯躔爨醴酆

儡醴躔爨醴醴醴醴醴瓤  醴躔醴扌  刂蠼躔躔躔

鏖醴醴 ...

用Opencv的话应该也很简单写出来吧

[查看全文]
GRzhan
刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆
展开Biu

dchneric 发表于 2013-9-8 12:03

刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆  癯躔爨醴酆

儡醴躔爨醴醴醴醴醴瓤  醴躔醴扌  刂蠼躔躔躔

鏖醴醴 ...

graphics.h咩?

[查看全文]
dchneric
刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆
展开Biu

刂躔醴醴醴醴醴醴醴醴礻刂醴醴躔酆  癯躔爨醴酆

儡醴躔爨醴醴醴醴醴瓤  醴躔醴扌  刂蠼躔躔躔

鏖醴醴醴醴醴醴爨醴匚  醴躔醴  厶一蠼蠼醴醴

鏖躔躔醴醴圜酆爨厂冖 艹醴躔酆    墉躔躔醣

鏖醴躔醴醴醴嬲酆    醴醴     邝躔醴醴

癯醴醴醴醴酽埠灬鏖躔绅 醴阝 刂醴醴鲨刂醴躔醴

刂躔鹳躔酆 丶 醴酆忄 酽   僵醴町 醴爨酆

爨山圜酆   蠖躔      谭醴忄 醴酆瞿

鬏躔癯酆灬   艹          爨黔衢

纟鞲鏖蠼酆              刂爨

扌慵藿擎              刂黔

髦刂蠲癯         入    勹

廴 赝阝         冫   邝

刂瀚醴鹈             刂

艹 刂醴躔躔             刂

卩醴醴蠼麓           凵艹

嚯 遭醴醴蠊躔牖雀    丶亠 灬蠲

灬醴醴醴醴酽躔醴躔鲨灬  灬蠲躔醴阝

谦蠊蠊覃圜酆 糨鳄蠼爨醴醴鳔蠼醴爨躔躔

啊,c程序员飘过...

[查看全文]
GRzhan
代码注释里很多描述非常不准确
展开Biu

...代码注释里很多描述非常不准确。。。

望各位及时指正。。。

[查看全文]