资源简介

这是python的图片转换成字符画的源代码,里面还包括字库文件和三张图片。

资源截图

代码片段和文件信息

import numpy
import matplotlib.pyplot
import cv2


KEYS = [0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01]
# 先准备好图片转换后会变成哪些字符一会儿还会对字符进行排序
charset = [‘.‘ ‘!‘ ‘~‘ ‘@‘ ‘#‘ ‘$‘ ‘%‘ ‘^‘ ‘&‘ ‘*‘ ‘(‘ ‘)‘ ‘-‘ ‘+‘]
# orders用于存放排序后字符的顺序
orders = numpy.zeros(len(charset))


# 计算出每个符号再点阵中有多少个点显示
def numsofone_in_charbytes(text):
    # 先获取字符的ascii码值
    offset = ord(text)
    # 然后打开字库文件找到位置
    with open(“./ASC16“ “rb“) as ASC16:
        location = offset*16
        ASC16.seek(location)
        retbytes = ASC16.read(16)
    # 已经获取到该字符的点阵表示字节retbytes现在要计算这16字节中有多少个1
    count = 0
    for i in range(len(retbytes)):
        # 对于retbytes中的每一个字节
        for j in range(len(KEYS)):
            if KEYS[j] & retbytes[i]:
                count += 1
    return count

for s in range(len(charset)):
    orders[s] = numsofone_in_charbytes(charset[s])
print(orders)

# 依据这个对点进行排序
# numpy.argsort()可以给出排序后各元素在原来数组中的索引
s = numpy.argsort(orders)
print(s)
# 依据上面的索引重新对charset排序
charsetnew = []
for i in range(len(charset)):
    charsetnew.append(charset[s[i]])
print(charsetnew)

# 排序完成后就可以建立图片像素和字符的映射
# 建立映射并不是简单的一个像素对应一个字符,考虑到图片的大小问题
# 有时需要进行缩放不然做出来的字符画会过大无法显示
# 这里我们将图片中每16*8大小的一个像素块的平均像素值映射成一个字符

# 先写一个函数,将输入图片都裁剪成宽为8的倍数,高为16的倍数,即去掉右边和下面的余值
def trim_pic(img):
    shape = numpy.shape(img)
    # 如果图片本身的长宽不满足要求就直接返回空
    if shape[0] < 16 or shape[1] < 8:
        return None
    height = shape[0]//16
    width = shape[1]//8
    print(height)
    print(width)
    trimed_pic = img[:height*16 :width*8]
    return trimed_pic

# 裁剪完成后,将图片看成16*8大小像素块的组成,然后计算每一个像素块的平均像素值
# 得到平均像素值的矩阵其实相当于池化操作这里的图片一律先转成灰度图再输入
def pool16_8(img):
    # shape,第一个元素是矩阵行数,所以是图片的高
    shape = numpy.shape(img)
    row = shape[0] // 16
    cow = shape[1] // 8
    avgpixel = numpy.zeros((rowcow) dtype=float)
    for i in range(row):
        for j in range(cow):
            # 此处计算各个像素块的平均值
            t = 0.0
            for t1 in range(16):
                for t2 in range(8):
                   t += img[t1+i*16 t2+j*8]
            avgpixel[i j] = t/(16*8)
    return avgpixel

# 上面的函数完成后,再根据映射将元素替换成字符
def cvt2char(avgpixel charset):
    # avgpixel是计算后的像素平均值,charset是用于制作字符画的字符集
    chars = len(charset)
    race = 255.0/chars
    shape = numpy.shape(avgpixel)
    retcharmatrix = []
    rowchar = []
    for i in range(shape[0]):
        for j in range(shape[1]):
            # 获取像素的等级
            s = avgpixel[i j] // race
            # 得到对应的字符
            rowchar.append(charset[int(s)])
        retcharmatrix.append(rowchar[:])
        rowchar.clear()
    return retcharmatrix

# stackoverflow上一位大佬写的彩色图片转换成灰度图的代码
def rgb2gray(rgb):
    return numpy.dot(rgb[... :3] [0.299 0.587 0.114])

# 至此,所有的步骤都完成,下面是用图片做实验了



# 读入一张图片
srcimg = matplotlib.pyplot.imread(“F:/temp/ppghuahua.jpg“)
# 转换成灰度图
grayimg = rgb2gray(srcimg)
# 先裁剪一下
trimedimg = trim_pic(grayimg)
# 再进行池化平均
pooledimg = pool16_8(t

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     267616  2019-02-22 18:45  HZK16

     文件       5626  2019-02-23 15:49  main.py

     文件     100746  2019-02-23 15:49  ppghuahua.jpg

     文件      55886  2019-02-23 15:45  PowerPuffGirls.jpg

     文件      54149  2019-02-23 14:43  testKeji.jpg

     文件       4096  2011-08-14 01:57  ASC16

----------- ---------  ---------- -----  ----

               488119                    6


评论

共有 条评论