本篇主要介紹了Python實現圖片轉字符畫的範例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧
字元畫真的很有意思,將圖片中的像素用字元代替,就產生了字元畫。
但是像素是有顏色深淺的,我們如何將帶有不同顏色的像素編碼為對應的字元呢?
轉換方法:
將彩色圖片轉換為灰階圖
根據顏色深淺的RGB值(值域為0到255,其中0為黑色,255為白色)
涉及自己喜歡的字元集合
#依字元集順序及字元集長度,由RGB值編碼為對應的字元。
RGB
RGB色彩模式是透過對紅(R)、綠色(G)、藍色(B)三個色彩通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色。通常情況下,RGB各有256級亮度,以數字表示為從0、1、2...直到255。注意雖然數字最高是255,但0也是數值之一,因此共256級。
灰階圖
灰階圖是指只含亮度訊息,不含色彩訊息的圖象,就像我們平常看到的黑白照片:亮度由暗到明,變化是連續的。 因此,要表示灰階圖,就需要把亮度值進行量化。通常分割成0到255共256個級別,其中0最暗(全黑),255最亮(全白)。在表示顏色的方法中,除了RGB外,從彩色圖片中的RGB 到灰階值Gray 轉換公式為:
#在PIL中,从模式“RGB”转换为“L”模式(灰度模式) Gray = 0.299R+0.587G+0.114B
例如我們用小寫英文26字母作為我們的字符集。字元集容量為26(一個字元對應的值區間寬度= 256/字元集長度)這裡的區間寬度為256/26=9.8),
#gray與字元集對應關係:
gray區間對應字元
#
[0.0, 9.8)这|a [9.8, 19.6)|b [19.6, 29.4)|c ...|... [225.6, 235.4]|x [235.4, 245.2]|y [245.2, 255.0]|z
char_string = 'abcdefghijklmnopqrstuvwxyz' def rgb2char(r, g, b): length = len(char_string) gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) # 每个字符对应的gray值区间宽度 unit = (256.0 + 1) / length # gray值对应到char_string中的位置(索引值) idx = int(gray / unit) return char_string[idx]
from PIL import Image #预处理(将图片尺寸压缩,并转为灰度图) def preprocess(img_path,delta=100): img = Image.open(img_path) # 获取图片尺寸 width, height = img.size # 获取图片最大边的长度 if width > height: max = width else: max = height # 伸缩倍数scale scale = max / delta width, height = int(width / scale), int(height / scale) img = img.resize((width, height)) return img
def img2char(img_obj, savepath): txt = '' width, height = img_obj.size # 获取像素点的rgb元组值,如(254, 0, 0),并将其转化为字符 for i in range(height): line = '' for j in range(width): line += rgb2char(*img_obj.getpixel((j, i))) txt = txt + line + '\n' # 保存字符画 with open(savepath, 'w+', encoding='utf-8') as f: f.write(txt) img_obj = preprocess(img_path) img2char(img_obj, savepath)
以上是如何利用Python實現圖片轉字符畫詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!