Python實現圖片轉字符畫_風聞
壹零社-最新鲜的互联网产业资讯2021-10-22 20:32
文/陳新龍
前段時間我們學習了很多Python的基礎語法,但是對於各種庫的使用還是一知半解的,接下來我們挑選出幾個重要庫通過有意思的小項目瞭解這些庫的知識點。
在Python中,有一個優秀的圖像處理框架叫做PIL庫,今天我們利用PIL庫將圖片變成一幅黑白字符畫。
字符畫:字符畫是一系列字符的組合,我們可以把字符看作是比較大塊的像素,一個字符能表現一種顏色,字符的種類越多,可以表現的顏色也越多,圖片也會更有層次感。
如果我們想要手工繪製出字符畫,首先要有紮實的美術基礎,其次還要花費大量的時間和精力。但是我們可以使用Python,只需要幾行代碼,就能夠將一張圖片輕而易舉地轉化為一個字符畫。
這幅小豬佩奇就是利用Python的PIL庫,通過字符代替顏色的方法完成的字符畫。
我們知道一張RGB模式的圖片是由很多個像素點組成,而每一個像素點都有不同的顏色,而這個顏色可以由三個值表示,(RGB,範圍0-255)這三個值對應組成這種顏色的三原色百分比。所以RGB模式總共可以表現256×256×256=1638400種顏色。如果可以將每個像素根據顏色找一個字符替換這樣就能形成一個字符圖畫了。
那麼問題來了,我們沒有這麼多種字符來一一對應每種顏色啊,這時就要引入灰度概念了,對於黑白圖像中的像素我們可以用灰度值表示其顏色深度,範圍一般從0到255,白色為255,黑色為0。這種圖片也稱灰度圖像,我們可以通過RGB轉化灰度公式將像素的RGB值映射成灰度值。這個公式具體算法不止一種(常見的有3種),算出的結果也略有不同,有興趣的同學可以百度搜索一下其中的算法。
灰度值公式:Gray=0.2126×R+0.7152×G+0.0722×B
通過公式的轉換可以將256×256×256的顏色範圍減少到0-255的灰度範圍。但是256個數值範圍還是有點多了難以用字符一一對應,不過稍微靈活變通一下,將兩到三個灰度值對應為一個字符便可成功解決了。
首先導入Python圖片處理庫——PIL。自定義字符畫所需要使用的字符集是ascii_char,我選擇了其中70個字符,字符順序影響與灰度的對應關係,可以根據字符畫的效果反覆調整。
選擇一張需要字符畫的圖片,這裏我選取了一張哆啦A夢的頭像,確定好字符畫的寬度和高度,考慮到字符本身的高寬比,為了美觀考慮圖片的寬度最好是高度的兩倍多一點。接下來我們需要定義一個get_chart函數,此函數的目的是通過灰度來區分顏色塊。利用灰度值公式計算出不同的灰度對應着不同的字符。將需要圖片導入到Python環境中,通過雙重for循環對圖像的像素點進行遍歷,利用灰度值公式進行灰度值轉換,輸出對應的字符畫。程序運行後字符畫和原圖可以做一個對比,可以發現字符畫在一些細節上還可以優化,比如根據字符的複雜程度調整list的順序,總的來説轉換過程還是達到了預期目的。
通過轉換哆啦A夢成為字符畫的案例我們又學會了一項新的技能,趕緊打開你的Python編輯器製作一幅有趣的字符畫吧,偷偷告訴你Python還可以製作GIF動態的字符動畫哦,還不趕緊去試試看。