python实现图片转字符画
2018-02-08 11:32
190 查看
一实验原理
二准备
三 实现
1 PIL实现图片读取并转换
2 openCV实现图片读取并转换
四进阶
运行平台: Windows
Python版本: Python3.6
IDE: Sublime Text
最终显示的是黑白色的字符画,那么彩色的图片怎么转换成黑白的呢?这里就需要了解灰度值的概念了。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。(来自互动百科)
我们利用下面的公式将像素的RGB值转换成灰度值:
用不同的字符代表不同的灰度值,字符的种类和数量可以根据自己需要的效果进行调整,最好从前往后可以看到明显的变化,最后一个字符为空格符最佳:
PIL
PIL是一个Python图像处理的库,使用以下命令安装:
openCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。使用下面命令安装:
打开pil.txt文件,可以看到下图所示:
打开cv.txt可以看到下图所示:
从以上两幅转换图片来看,效果基本是一样的。
二准备
三 实现
1 PIL实现图片读取并转换
2 openCV实现图片读取并转换
四进阶
运行平台: Windows
Python版本: Python3.6
IDE: Sublime Text
一、实验原理
字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。最终显示的是黑白色的字符画,那么彩色的图片怎么转换成黑白的呢?这里就需要了解灰度值的概念了。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。(来自互动百科)
我们利用下面的公式将像素的RGB值转换成灰度值:
gray = 0.2126 * r + 0.7152 * g + 0.0722 * b
用不同的字符代表不同的灰度值,字符的种类和数量可以根据自己需要的效果进行调整,最好从前往后可以看到明显的变化,最后一个字符为空格符最佳:
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
二、准备
接下来我将用两种方式来进行图片的读取和转换,需要用到两个库:PIL
PIL是一个Python图像处理的库,使用以下命令安装:
pip install pillow
openCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。使用下面命令安装:
pip install opencv-python
三、 实现
此处以BadApple中的一帧作为原图:3.1 PIL实现图片读取并转换
# coding = 'utf-8' from PIL import Image # 引入Image库对图片进行操作 import cv2 # 引入opencv库 # ascii列表,将其与图片像素对应 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") WIDTH = 120 HEIGHT = 60 # 将256个灰度值映射到字符列表中的字符 def get_char_from_pixel(r,g,b,alpha = 256): if alpha == 0: return ' ' length = len(ascii_char) gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) unit = (256.0 + 1)/length return ascii_char[int(gray/unit)] # 使用PIL库对图片进行转换 def ascii_pic_from_pil(path): text = "" im = Image.open(path) im = im.resize((WIDTH, HEIGHT), Image.NEAREST) for h in range(im.size[1]): # 图片像素纵坐标 for w in range(im.size[0]): # 图片像素横坐标 text += get_char_from_pixel(*im.getpixel((w, h))) text += '\n' return text # 保存txt文件 def save_to_file(filename, pic_str): with open(filename, 'w') as f: f.write(pic_str) img = ascii_pic_from_pil('huiyuan.jpg') save_to_file('pil.txt', img)
打开pil.txt文件,可以看到下图所示:
3.2 openCV实现图片读取并转换
# 使用cv库对图片进行转换 def ascii_pic_from_cv(path): text = "" img = cv2.imread(path) img = cv2.resize(img, (WIDTH, HEIGHT)) for h in range(HEIGHT): # 图片像素纵坐标 for w in range(WIDTH): # 图片像素横坐标 b, g, r = img[h,w] text += get_char_from_pixel(r,g,b) text += '\n' return text img = ascii_pic_from_pil('huiyuan.jpg') save_to_file('cv.txt', img)
打开cv.txt可以看到下图所示:
从以上两幅转换图片来看,效果基本是一样的。
四、进阶
视频是由一帧帧图片组成的,既然我们可以把图片转成字符画了,那么把视频转成字符动画应该也是可行的。有兴趣的可以去尝试一下。相关文章推荐
- Python实现图片转字符画的示例
- Python 25行代码实现图片转字符画
- python3实现图片转字符画
- 【003】Python实现图片转字符画(pillow 库的使用)
- Python实现图片转字符画的示例代码
- Python实现图片转字符画
- Python 50行代码实现图片转字符画
- python实现图片转字符画
- Python徒手实现识别手写数字—简易图片数据库
- Python 爬虫图片简单实现
- python实现图片爬虫
- Python基于pygame实现图片代替鼠标移动效果
- Python OpenCV实现图片上输出中文
- python 实现发送邮件(图片和图表直接在文本区显示)
- PHP实现图片转字符画
- 使用python中的socket实现服务器和客户端,并完成图片的传输。
- python小项目二:图片转字符画
- 利用python pil 实现给图片上添加文字
- Python实现自动存储Windows 10锁屏聚焦图片到指定文件夹
- Ubuntu下使用Python实现游戏制作中的切分图片功能