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实现动态图解析、合成与倒放
Jan 18 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
python实现QQ批量登录功能
Jun 19 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
python实现坦克大战
Apr 24 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 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
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
PHP 危险函数全解析
2009/09/09 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
php简单防盗链实现方法
2015/07/29 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
jquery 笔记 事件
2011/11/02 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
微信小程序实现滑动操作代码
2020/04/23 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
使用python3构建文件传输的方法
2019/02/13 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
Goodee官方商店:迷你投影仪
2021/03/15 全球购物
爱护公共设施演讲稿
2014/09/13 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
市场营销工作计划书
2014/09/15 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers