首頁  >  文章  >  後端開發  >  如何利用Python實現圖片轉字符畫詳解

如何利用Python實現圖片轉字符畫詳解

黄舟
黄舟原創
2017-08-22 13:24:342689瀏覽

本篇主要介紹了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

#RGB轉字元函數


###### #####
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]
######預處理#########如果尺寸太大或太小,導致我們打開txt檔案無法辨識出字元畫。所以要先將圖片尺寸調整合適。這裡要注意,大家可依需求更改伸縮係數delta係數############
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
######圖片轉字########讀取圖片,根據座標取得此像素的rgb元組,並編碼為字元############
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)
###插入圖片################## #### ###改變char_string,變換你想要的效果################### ###

以上是如何利用Python實現圖片轉字符畫詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn