資源簡介
這是python的圖片轉換成字符畫的源代碼,里面還包括字庫文件和三張圖片。

代碼片段和文件信息
import?numpy
import?matplotlib.pyplot
import?cv2
KEYS?=?[0x80?0x40?0x20?0x10?0x08?0x04?0x02?0x01]
#?先準備好圖片轉換后會變成哪些字符一會兒還會對字符進行排序
charset?=?[‘.‘?‘!‘?‘~‘?‘@‘?‘#‘?‘$‘?‘%‘?‘^‘?‘&‘?‘*‘?‘(‘?‘)‘?‘-‘?‘+‘]
#?orders用于存放排序后字符的順序
orders?=?numpy.zeros(len(charset))
#?計算出每個符號再點陣中有多少個點顯示
def?numsofone_in_charbytes(text):
????#?先獲取字符的ascii碼值
????offset?=?ord(text)
????#?然后打開字庫文件找到位置
????with?open(“./ASC16“?“rb“)?as?ASC16:
????????location?=?offset*16
????????ASC16.seek(location)
????????retbytes?=?ASC16.read(16)
????#?已經獲取到該字符的點陣表示字節retbytes現在要計算這16字節中有多少個1
????count?=?0
????for?i?in?range(len(retbytes)):
????????#?對于retbytes中的每一個字節
????????for?j?in?range(len(KEYS)):
????????????if?KEYS[j]?&?retbytes[i]:
????????????????count?+=?1
????return?count
for?s?in?range(len(charset)):
????orders[s]?=?numsofone_in_charbytes(charset[s])
print(orders)
#?依據這個對點進行排序
#?numpy.argsort()可以給出排序后各元素在原來數組中的索引
s?=?numpy.argsort(orders)
print(s)
#?依據上面的索引重新對charset排序
charsetnew?=?[]
for?i?in?range(len(charset)):
????charsetnew.append(charset[s[i]])
print(charsetnew)
#?排序完成后就可以建立圖片像素和字符的映射
#?建立映射并不是簡單的一個像素對應一個字符,考慮到圖片的大小問題
#?有時需要進行縮放不然做出來的字符畫會過大無法顯示
#?這里我們將圖片中每16*8大小的一個像素塊的平均像素值映射成一個字符
#?先寫一個函數,將輸入圖片都裁剪成寬為8的倍數,高為16的倍數,即去掉右邊和下面的余值
def?trim_pic(img):
????shape?=?numpy.shape(img)
????#?如果圖片本身的長寬不滿足要求就直接返回空
????if?shape[0]?16?or?shape[1]?8:
????????return?None
????height?=?shape[0]//16
????width?=?shape[1]//8
????print(height)
????print(width)
????trimed_pic?=?img[:height*16?:width*8]
????return?trimed_pic
#?裁剪完成后,將圖片看成16*8大小像素塊的組成,然后計算每一個像素塊的平均像素值
#?得到平均像素值的矩陣其實相當于池化操作這里的圖片一律先轉成灰度圖再輸入
def?pool16_8(img):
????#?shape,第一個元素是矩陣行數,所以是圖片的高
????shape?=?numpy.shape(img)
????row?=?shape[0]?//?16
????cow?=?shape[1]?//?8
????avgpixel?=?numpy.zeros((rowcow)?dtype=float)
????for?i?in?range(row):
????????for?j?in?range(cow):
????????????#?此處計算各個像素塊的平均值
????????????t?=?0.0
????????????for?t1?in?range(16):
????????????????for?t2?in?range(8):
???????????????????t?+=?img[t1+i*16?t2+j*8]
????????????avgpixel[i?j]?=?t/(16*8)
????return?avgpixel
#?上面的函數完成后,再根據映射將元素替換成字符
def?cvt2char(avgpixel?charset):
????#?avgpixel是計算后的像素平均值,charset是用于制作字符畫的字符集
????chars?=?len(charset)
????race?=?255.0/chars
????shape?=?numpy.shape(avgpixel)
????retcharmatrix?=?[]
????rowchar?=?[]
????for?i?in?range(shape[0]):
????????for?j?in?range(shape[1]):
????????????#?獲取像素的等級
????????????s?=?avgpixel[i?j]?//?race
????????????#?得到對應的字符
????????????rowchar.append(charset[int(s)])
????????retcharmatrix.append(rowchar[:])
????????rowchar.clear()
????return?retcharmatrix
#?stackoverflow上一位大佬寫的彩色圖片轉換成灰度圖的代碼
def?rgb2gray(rgb):
????return?numpy.dot(rgb[...?:3]?[0.299?0.587?0.114])
#?至此,所有的步驟都完成,下面是用圖片做實驗了
#?讀入一張圖片
srcimg?=?matplotlib.pyplot.imread(“F:/temp/ppghuahua.jpg“)
#?轉換成灰度圖
grayimg?=?rgb2gray(srcimg)
#?先裁剪一下
trimedimg?=?trim_pic(grayimg)
#?再進行池化平均
pooledimg?=?pool16_8(t
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????267616??2019-02-22?18:45??HZK16
?????文件???????5626??2019-02-23?15:49??main.py
?????文件?????100746??2019-02-23?15:49??ppghuahua.jpg
?????文件??????55886??2019-02-23?15:45??PowerPuffGirls.jpg
?????文件??????54149??2019-02-23?14:43??testKeji.jpg
?????文件???????4096??2011-08-14?01:57??ASC16
-----------?---------??----------?-----??----
???????????????488119????????????????????6
評論
共有 條評論