前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片转字符画

图片转字符画

作者头像
王强
发布2018-08-09 17:56:42
2.5K0
发布2018-08-09 17:56:42
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战

运行平台: 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可以看到下图所示:

从以上两幅转换图片来看,效果基本是一样的。

四、进阶

视频是由一帧帧图片组成的,既然我们可以把图片转成字符画了,那么把视频转成字符动画应该也是可行的。有兴趣的可以去尝试一下。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实验原理
  • 二、准备
  • 三、 实现
    • 3.1 PIL实现图片读取并转换
      • 3.2 openCV实现图片读取并转换
      • 四、进阶
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档