python-图片之乐-ASCII 文本图形

ASCII:一个简单的字符编码方案

pillow模块:读取图像,访问底层数据
numpy模块:计算平均值

import sys, random, argparse
import numpy as np
import math
from PIL import Image

定义灰度等级和网格

定义两种灰度等级作为全局值,用于将亮度值转换为ASCII 字符

从最黑暗变到最亮

# 70 levels of gray
gscale1 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "# 10 levels of gray
gscale2 = '@%#*+=-:. '

http://paulbourke.net/dataformats/asciiart/

准备图像,并分割成网格

cols = 80
scale = 0.43# open the image and convert to grayscale
image = Image.open('youling.png').convert("L")
# store the image dimensions  # image.size
W, H = image.size[0], image.size[1]
# compute the tile width  根据用户给定列数(cols)计算每个网格的宽度
w = W/cols
# compute the tile height based on the aspect ratio and scale of the font
h = w/scale
# compute the number of rows to use in the final grid
rows = int(H/h)

w网格的宽 = W图片的宽 / cols列数
h网格的高度 = w网格的宽 / 垂直比例系数scale
rows行 总共有多少行

Pillow模块里的convert()函数可以将图像从一种模式转换为另一种模式
convert(‘L’)将原始图像转换为灰度图像 L is luminance:是图像亮度的单位
convert(‘1’)将原始图像转换为黑白模式
convert(‘P’, palette=Image.ADAPTIVE, colors=1)将原始图像转换为使用颜色调色板的单色模式,colors=2,图片只有2种颜色
还有RGB、RGBA,CMYK,LAB,HSV,YCbCr、XYZ等等模式

CMYK代表青、洋红、黄和黑色,是一种用于印刷的颜色模式。它是印刷过程中使用的四种油墨颜色的缩写,包括青色(Cyan)、洋红色(Magenta)、黄色(Yellow)和黑色(Key),通过它们的不同组合可以得到各种颜色和色调。相对于RGB颜色模式(红、绿、蓝),CMYK颜色模式更适合印刷。

计算平均亮度

计算灰度图像中每一小块的平均亮度

def getAverageL(image):# get the image as a numpy arrayim = np.array(image)# get the dimensionsw,h = im.shape# get the averagereturn np.average(im.reshape(w*h))

将 image 转换成一个 numpy数组,此时 im 成为一个二维数组,包含每个像素的亮度

保存该图像的尺寸

numpy.average()计算该图像中的亮度平均值,做法是用 numpy.reshape()先将维度为宽和高(w,h)的二维数组转换成扁平的一维,其长度是宽度乘以高度(w*h)。然后 numpy.average()调用对这些数组值求和并计算平均值

从图像生成 ASCII 内容

在这里插入图片描述

# an ASCII image is a list of character strings
aimg = []
# generate the list of tile dimensions
for j in range(rows):# 计算每个图像小块的起始和结束 y 坐标y1 = int(j*h)y2 = int((j+1)*h)# correct the last tileif j == rows-1:y2 = H# append an empty stringaimg.append("")for i in range(cols):# crop the image to fit the tilex1 = int(i*w)x2 = int((i+1)*w)# correct the last tileif i == cols-1:x2 = W# crop the image to extract the tile into another Image objectimg = image.crop((x1, y1, x2, y2))# get the average luminance # 获取网格的平均亮度值avg = int(getAverageL(img))# look up the ASCII character for grayscale value (avg)if moreLevels:# 将平均亮度值[0,255]对用到70级灰度[0,69]gsval = gscale1[int((avg*69)/255)]else:# 将平均亮度值[0,255]对用到10级灰度[0,9]gsval = gscale2[int((avg*9)/255)]# append the ASCII character to the stringaimg[j] += gsval

int((avg69)/255)
if avg = 255,可得int((avg
69)/255)=69,在该字符串中最后一个索引是69
在这里插入图片描述

命令行选项

接下来,为程序定义一些命令行选项。这段代码使用内置的 argparse 类:

parser = argparse.ArgumentParser(description="descStr")
# add expected arguments
parser.add_argument('--file', dest='imgFile', required=True)
parser.add_argument('--scale', dest='scale', required=False)
parser.add_argument('--out', dest='outFile', required=False)
parser.add_argument('--cols', dest='cols', required=False)
parser.add_argument('--morelevels', dest='moreLevels', action='store_true')

包含指定图像文件输入的选项(唯一必须的参数)
设置垂直比例因子
设置输出文件名
设置 ASCII 输出中的文本列数
添加–morelevels 选项,让用户选择更多层次的灰度梯度

将 ASCII 文本图形字符串写入文本文件

最后,将生成的 ASCII 字符串列表,写入一个文本文件:

# open a new text file
f = open(outFile, 'w')
# write each string in the list to the new file
for row in aimg:f.write(row + '\n')
# clean up
f.close()

完整代码

import sys, random, argparse
import numpy as np
import math
from PIL import Image# 70 levels of gray
gscale1 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "# 10 levels of gray
gscale2 = '@%#*+=-:. 'def getAverageL(image):# get the image as a numpy arrayim = np.array(image)# get the dimensionsw,h = im.shape# get the averagereturn np.average(im.reshape(w*h))def covertImageToAscii(fileName, cols, scale, moreLevels):"""Given Image and dimensions (rows, cols), returns an m*n list of Images"""# declare globalsglobal gscale1, gscale2# open image and convert to grayscaleimage = Image.open(fileName).convert('L')# store the image dimensionsW, H = image.size[0], image.size[1]print("input image dims: %d x %d" % (W, H))# compute tile widthw = W/cols# compute tile height based on the aspect ratio and scale of the fonth = w/scale# compute number of rows to use in the final gridrows = int(H/h)print("cols: %d, rows: %d" % (cols, rows))print("tile dims: %d x %d" % (w, h))# check if image size is too smallif cols > W or rows > H:print("Image too small for specified cols!")exit(0)# an ASCII image is a list of character stringsaimg = []# generate the list of tile dimensionsfor j in range(rows):# 计算每个图像小块的起始和结束 y 坐标y1 = int(j*h)y2 = int((j+1)*h)# correct the last tileif j == rows-1:y2 = H# append an empty stringaimg.append("")for i in range(cols):# crop the image to fit the tilex1 = int(i*w)x2 = int((i+1)*w)# correct the last tileif i == cols-1:x2 = W# crop the image to extract the tile into another Image objectimg = image.crop((x1, y1, x2, y2))# get the average luminance # 获取网格的平均亮度值avg = int(getAverageL(img))# look up the ASCII character for grayscale value (avg)if moreLevels:# 将平均亮度值[0,255]对用到70级灰度[0,69]gsval = gscale1[int((avg*69)/255)]else:# 将平均亮度值[0,255]对用到10级灰度[0,9]gsval = gscale2[int((avg*9)/255)]# append the ASCII character to the stringaimg[j] += gsval# return text imagereturn aimg# main() function
def main():# create parserdescStr = "This program converts an image into ASCII art."parser = argparse.ArgumentParser(description=descStr)# add expected argumentsparser.add_argument('--file', dest='imgFile', required=True)parser.add_argument('--scale', dest='scale', required=False)parser.add_argument('--out', dest='outFile', required=False)parser.add_argument('--cols', dest='cols', required=False)parser.add_argument('--morelevels', dest='moreLevels', action='store_true')# parse argumentsargs = parser.parse_args()imgFile = args.imgFile# set output fileoutFile = 'out.txt'if args.outFile:outFile = args.outFile# set scale default as 0.43, which suits a Courier fontscale = 0.43if args.scale:scale = float(args.scale)# set colscols = 80if args.cols:cols = int(args.cols)print('generating ASCII art...')# convert image to ASCII textaimg = covertImageToAscii(imgFile, cols, scale, args.moreLevels) # open a new text filef = open(outFile, 'w')# write each string in the list to the new filefor row in aimg:f.write(row + '\n')# clean upf.close()print("ASCII art written to %s" % outFile)# call main
if __name__ == '__main__':main()

https://github.com/electronut/pp/blob/master/ascii/ascii.py

将完整代码保存到py文件中

打开终端,切换到ascii.py目录

输入下面代码

$ python ascii.py --file data/robot.jpg --cols 100

将 data/robot.jpg 替换为你想使用的图像文件的相对路径

在这里插入图片描述
使用vscode打开out.txt文件,使用Ctrl±可以缩小,可以看到全屏,只能看10灰度等级

还可使用notepad查看out.txt文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
–morelevels就是70灰度等级

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111273.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境离线安装MySQL8.0.33

目录 一、准备 1、检查libaio.so.1 2、卸载删除原有的mariadb 3、删除my.cnf 4、下载mysql安装包 二、安装 1、上传mysql 2、建立mysql所需目录 3、建立配置文件my.cnf 4、创建mysql用户并授权 5、初始化数据库 6、启动MySQL数据库 7、常见启动报错处理 8、配置M…

VMware标准虚拟交换机和分布式交换机

一、虚拟交换机 初期的网络虚拟化&#xff0c;是非常狭义的概念&#xff0c;主要指的是因为计算资源虚拟化&#xff0c;每台物理宿主机上安装了虚拟化软件&#xff0c;同时会部署了虚拟交换机&#xff0c;负责物理机上面承载的VM&#xff08;虚拟机&#xff09;之间与对外的通…

用心维护好电脑,提高学习工作效率

文章目录 一、我的电脑1.1 如何查看自己的电脑硬件信息呢&#xff1f; 二、电脑标准保养步骤和建议2.1 保持清洁2.2 定期升级系统和软件2.3 安全防护2.4 清理磁盘空间2.5 备份重要数据2.6 优化启动项2.7 散热管理2.8 硬件维护2.9 电源管理2.10 注意下载和安装2.11 定期维护 三、…

数据结构:单向循环链表

单向循环链表和单向链表差不多&#xff0c;只需要记录头节点的位置把单向链表判断NULL的地方改为判断头节点即可 dxxhlb.h dxxhlb.cmain.c 结果

聚类分析 | MATLAB实现基于AHC聚类算法可视化

聚类分析 | MATLAB实现基于AHC聚类算法可视化 目录 聚类分析 | MATLAB实现基于AHC聚类算法可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHC聚类算法&#xff0c;聚类结果可视化&#xff0c;MATLAB程序。 Agglomerative Hierarchical Clustering&#xff08;自底…

ArrayList与顺序表

文章目录 一. 顺序表是什么二. ArrayList是什么三. ArrayList的构造方法四. ArrayList的常见方法4.1 add()4.2 size()4.3 remove()4.4 get()4.5 set()4.6 contains()4.7 lastIndexOf()和 indexOf(&#xff09;4.8 subList()4.9 clear() 以上就是ArrayList的常见方法&#xff01…

【科研论文配图绘制】task6直方图绘制

【科研论文配图绘制】task6直方图绘制 task6 主要掌握直方图的绘制技巧&#xff0c;了解直方图含义&#xff0c;清楚统计指标的添加方式 1.直方图 直方图是一种用于表示数据分布和离散情况的统计图形&#xff0c;它的外观和柱形图相近&#xff0c;但它所 表达的含义和柱形图…

串口联网通信数据监听视监控侦测协议规约破解方案

作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot 在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。 本方案主要用于监听和侦测 串口通信数据报文&#xff0c;主要用于协议报文分析 破解领域。 例如破解摄像头控制道闸开启的命令等。 监控和分析通信数据代表的含…

设计模式-职责链模式

文章目录 职责链模式模式概述主要角色适用场景实现步骤优点注意事项 定义职责链结构示例总结 职责链模式 职责链模式是一种行为设计模式&#xff0c;它可以将请求的发送者和请求的处理者解耦&#xff0c;并按照预定义的顺序处理请求。职责链模式常用于需要逐级审批或转交处理的…

网络编程——套接字和字节序

目录 一、BSD套接字接口1.1 套接字类型1.2 套接字的位置 二、字节序2.1 大小端2.2 大小端判断2.3 主机字节序和网络字节序2.4 字节序转换函数 一、BSD套接字接口 BSD套接字接口是BSD的进程间通信的方式&#xff0c;它不仅支持各种形式的网络应用而且它还是一种进程间通信的机制…

汽车类 ±0.25°C SPI 温度传感器,TMP126EDBVRQ1、TMP126EDCKRQ1、TMP127EDBVRQ1引脚配置图

一、概述 TMP126-Q1 是一款精度为 0.25C 的数字温度传感器 &#xff0c; 支持的环境温度范围为 -55C 至 175C 。TMP126-Q1 具 有 14 位 &#xff08; 有符号 &#xff09; 温度分辨率(0.03125C/LSB)&#xff0c;并且可在 1.62V 至 5.5V 的电源电压范围内工作。TMP126-Q1 具有转…

Linux-crontab使用问题解决

添加定时进程 终端输入&#xff1a; crontab -e选择文本编辑方式&#xff0c;写入要运行的脚本&#xff0c;以及时间要求。 注意&#xff0c;如果有多个运行指令分两种情况&#xff1a; 1.多个运行指令之间没有耦合关系&#xff0c;分别独立&#xff0c;则可以直接分为两个…

SpringDataRedis 使用

1. SpringDataRedis 特点2. 使用 SpringDataRedis 步骤3. 自定义 RedisTemplate 序列化4. SpringDataRedis 操作对象 1. SpringDataRedis 特点 提供了对不同 Redis 客户端的整合&#xff08;Lettuce 和 Jedis&#xff09;提供了 RedisTemplate 统一 API 来操作 Redis支持 Redi…

【附安装包】Vm虚拟机安装Linux系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;VMware硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.Vm虚拟机15.5下载链接&#xff1a;https://pan…

Ansible学习笔记(一)

1.什么是Ansible 官方网站&#xff1a;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html Ansible是一个配置管理和配置工具&#xff0c;类似于Chef&#xff0c;Puppet或Salt。这是一款很简单也很容易入门的部署工具&#xff0c;它使用SS…

【USRP】集成化仪器系列1 :信号源,基于labview实现

USRP 信号源 1、设备IP地址&#xff1a;默认为192.168.10.2&#xff0c;请勿 修改&#xff0c;运行阶段无法修改。 2、天线输出端口是TX1&#xff0c;请勿修改。 3、通道&#xff1a;0 对应RF A、1 对应 RF B&#xff0c;运行 阶段无法修改。 4、中心频率&#xff1a;当需要…

MySQL的共享锁和排他锁

锁定读 Locking Reads 有过编程语言并发学习经验的同学&#xff0c;应该都了解过读写锁的概念。读写锁主要是为了解决多读少写条件下&#xff0c;程序的并发性能问题。它的特点即是&#xff1a;如果一个线程持有了读锁&#xff0c;那么其他线程也是可以继续读取它锁定的数据&a…

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析&#xff0c;RDA的实现路径也有很多&#xff0c;今天介绍一下CANOCO软件的实现方法。 1.软件安装 时间调整到2010年 2.数据处理 得有不同的物种或者样点数值&#xff0c;再加上环境因子数据。 3.软件运行 4.结果解读 结果解读主要把握这几点…

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…

【复杂网络建模】——ER网络和SF网络的阈值分析

目录 1、介绍ER网络和SF网络 2、计算网络阈值 2.1 ER&#xff08;Erdős-Rnyi&#xff09;网络 2.2 SF&#xff08;Scale-Free&#xff09;网络 3、 研究网络阈值的意义 1、介绍ER网络和SF网络 在复杂网络理论中&#xff0c;ER网络&#xff08;Erdős-Rnyi网络&#xff…