Python实现图片转字符画的示例


Posted in Python onAugust 22, 2017

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

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

转化方法:

  • 将彩色图片转化为灰度图
  • 根据颜色深浅的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 + '\n'

  # 保存字符画
  with open(savepath, 'w+', encoding='utf-8') as f:
    f.write(txt)




img_obj = preprocess(img_path)
img2char(img_obj, savepath)

插入图片

Python实现图片转字符画的示例

Python实现图片转字符画的示例 

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

Python实现图片转字符画的示例

Python实现图片转字符画的示例 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 字典(Dictionary)操作详解
Mar 11 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
Python多线程下载文件的方法
Jul 10 Python
python实现报表自动化详解
Nov 16 Python
python pygame实现2048游戏
Nov 20 Python
Python切片操作去除字符串首尾的空格
Apr 22 Python
Python调用C语言的实现
Jul 26 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python上传时包含boundary时的解决方法
Apr 08 Python
Python接口开发实现步骤详解
Apr 26 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
利用aardio给python编写图形界面
Aug 21 #Python
Python实现图片转字符画的示例代码
Aug 21 #Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 #Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 #Python
Python编程之微信推送模板消息功能示例
Aug 21 #Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 #Python
virtualenv实现多个版本Python共存
Aug 21 #Python
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
php中session定期自动清理的方法
2015/11/12 PHP
jQuery对象[0]是什么含义?
2010/07/31 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
Python selenium文件上传方法汇总
2020/11/19 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python的faker库用法
2019/11/28 Python
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
学雷锋的心得体会
2014/09/04 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
股权转让协议范本
2014/12/07 职场文书
行政处罚决定书
2015/06/24 职场文书
英语读书笔记
2015/07/02 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS