程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python將真實圖像轉為文字照片

編輯:Python

文章目錄

  • 前言
  • 結果
  • 原理
  • 操作
    • 導入使用的模塊
    • 二值化
    • 漢字筆畫排序
    • 得到.txt文件
  • 完整代碼
  • 其他
  • 附上一張博主的悶騷照片

前言

這是一個使用python做的玩具代碼,個人覺得挺有意思的,是根據b站的一個up的視頻的原理講解實現的
原視頻是這個

【自制開源】520寫個小程序用女朋友的名字把她畫出來,女朋友:“這是個動物嗎?”

結果

原圖參見作者頭像,轉換後結果如圖

原理

那根據視頻裡面的原理,是這樣的

  1. 將彩色圖片二值化,就是轉為黑白照片
  2. 將黑白照片裡的像素使用文字替換,深色的用筆畫多的文字替換,淺色的用筆畫少的文字替換

操作

導入使用的模塊

from PIL import Image
import numpy as np
from chinese_stroke_sorting import sort_by_stroke
import math
  1. PIL用於將圖片二值化
  2. numpy中的asarray可以將圖片轉為一個矩陣
  3. chinese_stroke_sorting可以將漢字根據筆畫數進行排序
  4. math裡使用一些數字處理函數

二值化

def image_binarization(self):
old_img = Image.open(self.filename)
new_img = old_img.convert('L')
return new_img

經過這個函數,可以得到一個二值化的圖片,每一個像素,都是0-255的一個值

漢字筆畫排序

word_arr = ['不', '夜', '熬', '要']
word_arr = sort_by_stroke(self.word_arr)

之後的word_arr就是一個根據漢字排序的列表了

得到.txt文件

根據原理,我們遍歷整個圖像矩陣,依照給的word_arr長度來平均分配漢字,什麼意思呢?以['不', '夜', '熬', '要']這個為例,像素矩陣的值是0-63的就是"不",64-127的就是"夜",128-191的就是"熬",192-255的就是"要"。

所以函數就是這樣

 def to_txt(self):
word_arr = sort_by_stroke(self.word_arr)
interval = 256 / len(word_arr)
with open(self.filename.split('.')[0] + '.txt', 'w', encoding='utf-8') as f:
try:
for line in self.img_arr:
for px in line:
r = math.floor(px / interval)
f.write(word_arr[r])
else:
f.write('\n')
except IndexError as e:
print(e)

完整代碼

from PIL import Image
import numpy as np
from chinese_stroke_sorting import sort_by_stroke
import math
class IMG_to_TXT:
def __init__(self, filename, word_arr=None):
if word_arr is None:
word_arr = ['不', '夜', '熬', '要']
self.filename = filename
self.img_arr = None
self.word_arr = word_arr
def image_binarization(self):
old_img = Image.open(self.filename)
new_img = old_img.convert('L')
return new_img
def to_txt(self):
word_arr = sort_by_stroke(self.word_arr)
interval = 256 / len(word_arr)
with open(self.filename.split('.')[0] + '.txt', 'w', encoding='utf-8') as f:
try:
for line in self.img_arr:
for px in line:
r = math.floor(px / interval)
f.write(word_arr[r])
else:
f.write('\n')
except IndexError as e:
print(e)
def __call__(self, *args, **kwargs):
new_img = self.image_binarization()
self.img_arr = np.asarray(new_img)
self.to_txt()
if __name__ == '__main__':
i_t_txt = IMG_to_TXT(filename='cgy.png', word_arr=['一', '億', '已', '藝', '以', '衣', '異', '怡',
'宜', '咦', '姨', '益', '移', '意'])
i_t_txt()

其他

如果想要圖片更精細一點的話,可以自定義word_arr
然後就是圖片的像素盡量不要太高,因為電腦的記事本能顯示的最大寬度是有限的,所以像素太高的話,就會導致一行的像素,不能夠以一行的文字顯示出來

附上一張博主的悶騷照片

細節還是挺清楚的吧


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved