原理:
- 将简单的表情图取灰度图像二值化,然后不同值用不同的字符串代替该像素即可
- 扩展一下,可自行定义一个数值(最好为2的指数幂,2,4,8,16等),将
256
个灰度值等分成几个范围,以4
为例,先自行定义四个字符,0-63
为第一块,64-127
为第二块,然后扫描灰度图,按灰度值确定属于四个范围的哪一块,然后用相应的字符替换该像素即可- 显而易见的是:当我们取值越大,给出的字符越多时,越能体现图像的细节,但是鉴于字符的文本显示非常依赖于编辑器,所以效果可能不是很好。
一些总结
举例字符数组的排列比较有讲究,换一个顺序,图片的展示效果完全不一样,这个大家可以自行测试。
以我个人的使用经验来看,字符之间的渐变应该比较小,但是两端的区别较大,这样的设置显示效果理论上应该比较好,举例:
mn
这两个字符相邻比较合适,空格和$@#
之类的字符应该隔得比较远,简单来说整个样例字符的分布理想状态应该类似于一条由明到暗的渐变带一样
from PIL import Image
chars = list("A-% ,+1n&M-B/\?<8&WM#$_+~*|(){}[]>i!lI;:,\"^`'. ")
# 图像整体使用多少个字符来表示? 必须为2的指数倍2,4,6,8,16,32最大
# 对于只想看轮廓的图,2或4显示效果较好,对稍微追求细节的图稍微弄大一点
num = 4;
chars = chars[:num]
# isThumb = True
isThumb = False
width,height =80,40
#分节因子
factor = int(256 / len(chars))
# 依据灰度值阶梯返回不同的字符
def get_char(pix):
for i in range(0,len(chars)):
if pix < factor * (i+1):
return chars[i]
img = Image.open('flower.jpg')
if img.mode=='P' or img.mode =='RGBA':
im=Image.new('RGB',img.size,'white')
im.paste(img.convert('RGBA'),img.convert('RGBA'))
img= im
# 转化为灰度图
img = img.convert("L")
w,h = 0,0
# 进行图片大小的变换
if isThumb:
w,h = width,height
img=img.resize((w,h),Image.NEAREST) #NEAREST低质量图
else:
w,h = img.size
img = img.resize((w,int(h/2)),Image.NEAREST)
h= int(h/2)
data=[]
pix = img.load()
length = len(chars)
data = ""
#扫描整个图片,按灰度置换图片
for i in range(0,h):
line = ""
for j in range(0,w):
line += get_char(pix[j,i])
data += line+"\n"
with open("a.txt",'w') as f:
f.write(data)
知识点记录:
一、图片的打开与显示
from PIL import Image
img=Image.open('d:/dog.png')
img.show()
另一种方式
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('d:dog.png')
plt.figure("dog")#图片的名称
plt.imshow(img)
plt.show()
打开图片后,可以使用一些属性来查看图片信息
print(img.size)#图片的尺寸
print(img.mode)#图片的模式
print(img.format)#图片的格式
二、图片的保存
img.save('d:/dog.jpg')
就只需要一行代码,不仅能保存图片,还可以转换格式
三、读取图像并将其转换成灰度图像
img=Image.open('d:/dog.jpg').convert('L')
坐标轴不显示的操作:
from pylab import *
axis('off')
四、显示轮廓图像和直方图
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('time.jpg').convert('L'))
# 新建一个图像
figure()
# 不使用颜色信息
gray()
# 在原点的左上角显示轮廓图像
contour(im, origin='image')
axis('equal')
axis('off')
figure()
hist(im.flatten(),128)
show()