灰度图的字符画的制作"/>
基于灰度图的字符画的制作
媒体上经常会出现一些字符表示的图片,这段ASCII字符是用来形容每个像素点的颜色深浅,从视觉效果(灰度)来看,字符的越复杂越能形容深色,我们只需要获得一张图并将这张图转化为灰度图,然后遍历其中的像素点的灰度值,并根据灰度值转化为相应的ASCII字符,最后存入一个txt文件中即可。
代码如下:
# -*- coding: utf-8 -*-
from PIL import ImagecodeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集
count = len(codeLib)def transform1(image_file):image_file = image_file.convert("L")#转换为黑白图片,参数"L"表示黑白模式codePic = ''for h in range(0,image_file.size[1]): #size属性表示图片的分辨率,'0'为横向大小,'1'为纵向for w in range(0,image_file.size[0]):gray = image_file.getpixel((w,h)) #返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组codePic = codePic + codeLib[int(((count-1)*gray)/256)]#建立灰度与字符集的映射codePic = codePic+'\r\n'return codePicdef transform2(image_file):codePic = ''for h in range(0,image_file.size[1]):for w in range(0,image_file.size[0]):g,r,b = image_file.getpixel((w,h))gray = int(r* 0.299+g* 0.587+b* 0.114)codePic = codePic + codeLib[int(((count-1)*gray)/256)]codePic = codePic+'\r\n'return codePicfp = open(u'./2.jpeg','rb')
image_file = Image.open(fp)
image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整图片大小
print (u'Info:',image_file.size[0],' ',image_file.size[1],' ',count)tmp = open('tmp.txt','w')
tmp.write(transform1(image_file))
tmp.close()
OpenCV的作用是实现图像从彩色到灰度图的转换
我们喂给程序一张图片:
运行程序:
得到输出文件:
查看字符图形效果:
灰度指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。
生成字符画的字符集的设计是有根据的,如果把这个字符串看成一个数组,则数组前面的字符,对应于较小的灰度值,对应颜色偏黑,绘制出来的区域颜色深一些,而后面的字符,对应颜色偏白,绘制出来的区域颜色浅一些。
codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''
GIF动图转为字符动图:
# -*- coding: utf-8 -*-
import imageio
import cv2origin_pic='./a.gif'
target_pic='./b.gif'
codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集pics=imageio.mimread(origin_pic) #读取动态图,把动态图转换为一帧一帧的图像#应用上面定义好的图片灰度与字符的映射,把上面的每帧图片都转化为字符画,并保存在一个列表中
A=[]for img in pics:u,v,_=img.shapec=img*0+255gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)for i in range(0,u,6):for j in range(0,v,6):pix=gray[i,j]b,g,r,_=img[i,j]zifu=codeLib[int(((len(codeLib)-1)*pix)/256)]cv2.putText(c,zifu,(j,i),cv2.FONT_HERSHEY_COMPLEX, 0.3, (int(b),int(g), int(r)), 1)A.append(c)imageio.mimsave(target_pic, A, 'GIF',duration=0.1) #把A列表里的字符画组合起来,变成动态图
print('转化完成,请到你保存的路径下查看')
转化后的结果:
结束!
更多推荐
基于灰度图的字符画的制作
发布评论