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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
python 基础教程之Map使用方法
Jan 17 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python编写一个优美的下载器
Apr 15 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python交互式图形编程的实现
Jul 25 Python
python实现截取屏幕保存文件,删除N天前截图的例子
Aug 27 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
js跳转页面方法总结
2014/01/29 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
JS实现简单日历特效
2020/01/03 Javascript
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
PyCharm代码格式调整方法
2018/05/23 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
Android面试宝典
2013/08/06 面试题
药品质量检测应届生求职信
2013/11/14 职场文书
小学毕业感言50字
2014/02/16 职场文书
班主任寄语大全
2014/04/04 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
React如何创建组件
2021/06/27 Javascript
一篇文章带你复习java知识点
2021/06/28 Java/Android
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技