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中的数据类型
May 05 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
python SVD压缩图像的实现代码
Nov 05 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
如何使用Pytorch搭建模型
Oct 26 Python
python 利用opencv实现图像网络传输
Nov 12 Python
Python简易开发之制作计算器
Apr 28 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
无线电广播的开始
2002/01/30 无线电
论坛头像随机变换代码
2006/10/09 PHP
php你的验证码安全码?
2007/01/02 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
openPNE常用方法分享
2011/11/29 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
vue内置指令详解
2018/04/03 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
对pandas replace函数的使用方法小结
2018/05/18 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
python中sys.argv函数精简概括
2018/07/08 Python
新员工入职感言
2014/02/01 职场文书
工程管理英文求职信
2014/03/18 职场文书
村长贪污检举信
2014/04/04 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技