圖片處理拓展篇 : 圖片轉字符畫(ascii)


首先要明確思路, 圖片是由像素組成的, 不同的像素有不同的顏色(rgb), 那么既然我們要轉化為字符畫, 最直接的辦法就是利用字符串來替代像素, 也就是用不同的字符串來代表不同的像素. 另外圖片一般來講是彩色的, 而acsii(一般打印在終端上吧) 都是黑白的, 此時就要介紹另外一個概念了 :

灰度值:指黑白圖像中點的顏色深度,范圍一般從0到255,白色為255,黑色為0,故黑白圖片也稱灰度圖像.

到這里思路就很明確了, 我們要做的就是兩件事 :

1. 將每一個像素點(彩色圖片用rgb)映射到每一個灰度值...

2. 將灰度值映射到每一個字符串...

所以我們還需要從像素點的rgb到灰度值的轉換公式 :  灰度值 = 0.2126 * r + 0.7152 * g + 0.0722 * b.

 

代碼如下 :

 1 from PIL import Image
 2 
 3 ascii_chars = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'.")   #用來替代像素的字符集合...
 4 
 5 def get_chars(r, g, b, alpha = 256):
 6     global ascii_chars
 7     if alpha == 0:
 8         return ' '
 9     length = len(ascii_chars)
10     gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
11     unit = alpha / length                 #將256個像素均分給字符...
12     return ascii_chars[int(gray/unit)]
13 
14 
15 
16 imagePath = "/Users/zhangzhimin/ascii_dora.png"
17 outPutHeight = 70
18 outPutWidth = 100
19 
20 
21 img = Image.open(imagePath)
22 img = img.resize((outPutWidth, outPutHeight))
23 
24 
25 txt = ""
26 for y in range(outPutHeight):
27     for x in range(outPutWidth):
28         txt += get_chars(*img.getpixel((x, y)))
29     txt += '\n'
30 
31 print(txt)

 

效果大概是這樣的 : 

 

值得一提的是只對一些層次簡單的圖形會有很好的效果, 如果想要解析復雜的圖片建議增加字符串的個數以及顯示屏的大小...

感謝實驗樓提供這樣一個有趣的編程練習...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM