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使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
Python基于百度云文字识别API
Dec 13 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
Python3 Tkinter选择路径功能的实现方法
Jun 14 Python
numpy中的meshgrid函数的使用
Jul 31 Python
Django使用rest_framework写出API
May 21 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删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
JS与框架页的操作代码
2010/01/17 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
python中MethodType方法介绍与使用示例
2017/08/03 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Django密码存储策略分析
2020/01/09 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python代码区分大小写吗
2020/06/17 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
python 制作本地应用搜索工具
2021/02/27 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
关于感恩的演讲稿400字
2014/08/26 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
辞职申请书范本
2019/05/20 职场文书