1.問題描述及思路
我是在<python極客編程>一書中看到的這个案例.
ASCII文本圖案是指一个僅由ascii字符構成的文本文件, 但藉由字符排列在視覺上實現了對圖像的簡化重現.
實現基于兩个前提: 一是將ascii字符按灰度進行有序排列, 這个工作已經由前人完成, 順序排列下文可見; 二是將圖片處理爲類似于素描繪畫的可用數值描述的灰度不同的色凷. 在這兩个基礎上, 對照圖像小凷的灰度尋找合適的字符表示, 最後將所有字符儲存起來, 即實現了圖像到文本的轉化.
本質是數學中代數對幾何的再描述.
2.實現代碼
# img2ASCII
import argparse
from pydoc import describe
import sys
from PIL import Image
import numpy as np
# ASCII文本預設的灰度級別, 以字符的線條密度區分, 70級更精細, 10級比較粗略
GRAYSCALE_70 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{[}]?-_+~<>i!lI;:,\"^`'. "
GRAYSCALE_10 = "@%#*+=-:. "
def get_average_L(img):
"""計算小凷的平均亮度
Args:
img (PIL.Image.Image): 轉換後的灰度圖像
"""
np_img = np.array(img) # 將img轉換爲np數組
# 計算並返回平均亮度
weight, height = np_img.shape
return np.average(np_img.reshape(weight*height))
def image2ascii(imgfile, cols, scale, gs):
"""轉換圖像到ASCII文本圖案
Args:
imgfile (.jpg等等): 待轉換的圖像
cols (int): ASCII文本的列數
scale (float): 字体寬高的縮放係數
Returns:
list: ASCII字符的二維數組
"""
global GRAYSCALE_10, GRAYSCALE_70
# 尺寸計算
img = Image.open(imgfile).convert('L') # 打開圖片並轉換爲灰度圖像, L表示luminace
img_weight, img_height &