视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何利用Python实现图片转字符画详解
2020-11-27 14:13:36 责编:小OO
文档
 本篇文章主要介绍了Python实现图片转字符画的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

字符画真的很有意思,将图片中的像素用字符代替,就生成了字符画。

但是像素是有颜色深浅的,我们如何将带有不同颜色的像素编码为对应的字符呢?

转化方法:

  • 将彩色图片转化为灰度图

  • 根据颜色深浅的RGB值(值域从0到255,其中0为黑色,255为白色)

  • 涉及自己喜欢的字符集合

  • 根据字符集顺序及字符集长度,由RGB值编码为对应的字符。

  • RGB

    RGB色彩模式是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色。

    通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。

    灰度图

    灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。

    因此,要表示灰度图,就需要把亮度值进行量化。通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。在表示颜色的方法中,除了RGB外,从彩色图片中的RGB 到 灰度值Gray 转换公式为:

    #在PIL中,从模式“RGB”转换为“L”模式(灰度模式)
    Gray = 0.299R+0.587G+0.114B

    比如我们用小写英文26字母作为我们的字符集。字符集容量为26(一个字符对应的值 区间宽度= 256/字符集长度)

    这里的区间宽度为256/26=9.8),

    gray与字符集对应关系:

    gray区间对应字符

    [0.0, 9.8)这|a
    [9.8, 19.6)|b
    [19.6, 29.4)|c
    ...|...
    [225.6, 235.4]|x
    [235.4, 245.2]|y
    [245.2, 255.0]|z

    RGB转字符函数

    char_string = 'abcdefghijklmnopqrstuvwxyz'
    
    def rgb2char(r, g, b):
     length = len(char_string)
     gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
     # 每个字符对应的gray值区间宽度
     unit = (256.0 + 1) / length
    
     # gray值对应到char_string中的位置(索引值)
     idx = int(gray / unit)
     return char_string[idx]

    预处理

    如果尺寸太大或太小,导致我们打开txt文件无法辨识出字符画。所以要先将图片尺寸调整合适。这里注意,大家可根据需要更改伸缩系数delta系数

    from PIL import Image
    
    #预处理(将图片尺寸压缩,并转为灰度图) 
    def preprocess(img_path,delta=100):
     img = Image.open(img_path) 
     # 获取图片尺寸
     width, height = img.size
     # 获取图片最大边的长度 if width > height:
     max = width
     else:
     max = height
    
     # 伸缩倍数scale
     scale = max / delta
     width, height = int(width / scale), int(height / scale)
     img = img.resize((width, height)) 
     return img

    图片转字符

    读取图片,根据坐标获得该像素的rgb元组,并编码为字符

    def img2char(img_obj, savepath):
     txt = ''
     width, height = img_obj.size
     # 获取像素点的rgb元组值,如(254, 0, 0),并将其转化为字符
     for i in range(height):
     line = ''
     for j in range(width):
     line += rgb2char(*img_obj.getpixel((j, i)))
     txt = txt + line + '
    '
    
     # 保存字符画
     with open(savepath, 'w+', encoding='utf-8') as f:
     f.write(txt)
    
    
    
    
    img_obj = preprocess(img_path)
    img2char(img_obj, savepath)

    插入图片

    更改char_string,变换你想要的效果

    下载本文
    显示全文
    专题