文章目录

  • 前言
  • 一、字符画的实现原理
  • 二、黑白字符画实现代码
  • 三、彩色字符画生成
    • 代码实现:
  • 总结

前言

字符画这个话题,似乎早在贴吧时代就已经被玩烂了。在百度图片随便一搜索,就能够看到非常多。然后在这个时代,会编程的人越来越多(尤其是 MATLAB,Python 等非常适合图像处理的脚本语言),类似的教程更是数不胜数。


一、字符画的实现原理

字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。

问题来了,我们是要转换一张彩色的图片,这么多的颜色,要怎么对应到单色的字符画上去?这里就要介绍灰度值的概念了。

灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
我们可以使用灰度值公式将像素的 RGB 值映射到灰度值:

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

这样就好办了,我们可以创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。

二、黑白字符画实现代码

demo.py test.jpg -o outfile.txt --width 90 --height 90

代码如下(示例):

from PIL import Image
import argparsedef get_char(r,g,b,a=256):if a == 0:return ' 'gray = 0.2126 * r + 0.7152 * g + 0.0722 * blength = len(ascii_str)unit = 256/lengthreturn ascii_str[int(gray/unit)]if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument('file')  # 需要设置输入文件parser.add_argument('-o', '--output')  # 输出文件parser.add_argument('--width', type=int, default=80)  # 输出字符画宽parser.add_argument('--height', type=int, default=80)  # 输出字符画高# 获取参数args = parser.parse_args()IMG = args.fileWIDTH = args.widthHEIGHT = args.heightOUTPUT = args.outputascii_str = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")im = Image.open(IMG)im = im.resize((WIDTH,HEIGHT))txt = ''for i in range(HEIGHT):for j in range(WIDTH):txt += get_char(*im.getpixel((j,i))) # (r,g,b,a)txt += '\n'print(txt)#字符画输出到文件if OUTPUT:with open(OUTPUT,'w') as f:f.write(txt)else:with open("output.txt",'w') as f:f.write(txt)

三、彩色字符画生成

代码实现:

import numpy as np
import cv2
from PIL import Image, ImageFont, ImageDraw, ImageFilter
import random
from pathlib import Path
import time
from tqdm import tqdmdef color(input: str,output: str = None,rows: int = 100,alphabet='uppercase',background='origin7',out_height: int = None,scale: float = None,
):"""output colorful text picture"""input_path = Path(input)# the original imageorigin = Image.open(input_path)width, height = origin.sizeprint(f'input size: {origin.size}')# text amount of the output imagetext_rows = rowstext_cols = round(width / (height / text_rows) * 1.25)  # char height-width ratioorigin_ref_np = cv2.resize(np.array(origin), (text_cols, text_rows), interpolation=cv2.INTER_AREA)origin_ref = Image.fromarray(origin_ref_np)# font propertiesfontsize = 17font = ImageFont.truetype('courbd.ttf', fontsize)char_width = 8.88char_height = 11# output size depend on the rows and colscanvas_height = round(text_rows * char_height)canvas_width = round(text_cols * char_width)# a canvas used to draw texts on itcanvas = get_background(background, origin, canvas_width, canvas_height)print(f'canvas size: {canvas.size}')# start drawingsince = time.time()print(f'Start transforming {input_path.name}')draw = ImageDraw.Draw(canvas)charlist = get_alphabet(alphabet)length = len(charlist)for i in tqdm(range(text_cols)):for j in range(text_rows):x = round(char_width * i)y = round(char_height * j - 4)char = charlist[random.randint(0, length - 1)]color = origin_ref.getpixel((i, j))draw.text((x, y), char, fill=color, font=font)# resize the reproduct if necessaryif out_height:  # height goes firstcanvas_height = out_heightcanvas_width = round(width * canvas_height / height)canvas = canvas.resize((canvas_width, canvas_height), Image.BICUBIC)elif scale:canvas_width = round(width * scale)canvas_height = round(height * scale)canvas = canvas.resize((canvas_width, canvas_height), Image.BICUBIC)# output filenameif output:output_path = Path(output)else:output_path = input_path.with_name(f'{input_path.stem}_{canvas_width}x{canvas_height}_D{text_rows}_{background}.png')canvas.save(output_path)print(f'Transformation completed. Saved as {output_path.name}.')print(f'Output image size: {canvas_width}x{canvas_height}')print(f'Text density: {text_cols}x{text_rows}')print(f'Elapsed time: {time.time() - since:.4} second(s)')



代码比较多,这里不做展示,需要的可以去下载。
python代码实现把图片生成字符画(黑白色、彩色图片)




总结

关于python代码学习手把手教你将图片变成字符画(骚操作)就介绍到这了,上述实例对大家学习使用Python有一定的参考价值,希望大家阅读完这篇文章能有所收获。

python学习之手把手教你将图片变成黑白或彩色字符画(骚操作)相关推荐

  1. Python学习笔记:爬取网页图片

    Python学习笔记:爬取网页图片 上次我们利用requests与BeautifulSoup爬取了豆瓣<下町火箭>短评,这次我们来学习爬取网页图片. 比如想爬取下面这张网页的所有图片.网址 ...

  2. Python学习教程:教你用Python通过微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天的Python学习教程就来通过itchart库来实现通过微信对电脑的一些操作. 1.安装库 安装itc ...

  3. 【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning

    系列文章目录 在本系列文章中笔者将手把手带领大家实现基于强化学习的通关类小游戏,笔者将考虑多种方案,让角色顺利通关.本文将讲述如何使用Q-Learning算法实现AI通关. 完整代码已上传至githu ...

  4. 【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现

    系列文章目录 在本系列文章中笔者将手把手带领大家实现基于强化学习的通关类小游戏,笔者将考虑多种方案,让角色顺利通关. 完整代码已上传至github:https://github.com/TommyGo ...

  5. ppt怎么把图片做成翻书效果_手把手教你做图片翻书效果.ppt

    手把手教你做图片翻书效果 第六张幻灯片 (第2张翻第3张的动画过程) 第七张幻灯片 (右边超链接到自定义放映中的"第3张翻第4张" , 左边超链接到自定义放映中的"第3张 ...

  6. Python学习(1)OpenCV读取图片

    Python学习(1)OpenCV读取图片 前言 一. Python准备 二. Python仿真 三. 仿真结果 四. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Py ...

  7. python以图搜图api_Python深度学习,手把手教你实现「以图搜图」

    随着深度学习的崛起,极大的推动了图像领域的发展,在提取特征这方面而言,神经网络目前有着不可替代的优势.之前文章中我们也介绍了图像检索往往是基于图像的特征比较,看特征匹配的程度有多少,从而检索出相似度高 ...

  8. python如何实现找图_Python深度学习,手把手教你实现「以图搜图」

    随着深度学习的崛起,极大的推动了图像领域的发展,在提取特征这方面而言,神经网络目前有着不可替代的优势.之前文章中我们也介绍了图像检索往往是基于图像的特征比较,看特征匹配的程度有多少,从而检索出相似度高 ...

  9. 掌握python编程语言tensorflow_手把手教你eclipse集成Python语言+Tensorflow环境

    本文主要向大家介绍了手把手教你eclipse集成Python语言+Tensorflow环境,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.安装Eclipse 百度Eclips ...

最新文章

  1. 【剑指offer-Java版】33把数组排成最小的数
  2. 一起学DHCP系列(五)指派、获取
  3. 10种增强脑力的办法
  4. 实战|手把手教你训练一个基于Keras的多标签图像分类器
  5. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)
  6. 算法(17)-leetcode-剑指offer1
  7. c语言加密shell脚本,shell脚本加密
  8. 领扣简单版--两数之和(Two Sum)
  9. ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装
  10. 云小课|聊一聊DRS的数据过滤特性
  11. sqlserver 时间递增循环
  12. 题解报告:hdu1205吃糖果(插空法)
  13. ubuntu安装ElasticSearch-head插件
  14. 设计模式(四)行为型模式
  15. fmea第五版pfmea表格_第五版PFMEA模板(含附属评分准则编写指南全套EXCEL表)
  16. 【软件测评】屏幕标注软件
  17. 数据分析师面试题目_数据分析师面试的77个常见问题,你准备好了吗?
  18. 专转本-数学考试大纲
  19. 莫纳什大学计算机专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名莫纳什大学排名第151-200...
  20. 划词翻译 插件的安装教程 附下载链接【超简单】

热门文章

  1. VS2017编译SQLite3生成.lib
  2. 工程项目进度控制的重点内容是什么?
  3. Windows HANDLE是什么
  4. 域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...
  5. 关于前端授权获取微信用户信息实践
  6. GitHub上热门的Java开源项目
  7. Unity2D 简易2D地图 —— 地图的显示
  8. 【懒懒的Python学习笔记十】
  9. 一万字长文解读中国的消费经济
  10. dimm和udimm_服务器内存类型(UDIMM、RDIMM和LRDIMM)