python影像處理-個性化頭像

  • 2020 年 3 月 17 日
  • 筆記

前言

本系列課程是針對無基礎的,爭取用簡單明了的語言來講解,學習前需要具備基本的電腦操作能力,準備一個已安裝python環境的電腦。如果覺得好可以分享轉發,有問題的地方也歡迎指出,在此先行謝過。

前言

很多時候我們都想要一個專屬的頭像表現,除了影像內容外不同,形狀不一樣,下面我就來說說如何使用python來實現個性化頭像。

下面的圓形頭像和牛角頭像都是我使用python實現的,接下來我將通過講解這個實現的過程,給大家帶來一些想法。

實現原理

我們可以看到原來圖片是方正的,通過處理後,影像形狀外的地方都變成白色,這裡實際上是透明,上面第三幅圖可以幫助我們理解。

我們的處理過程其實就是將原來的圖片變成RGBA格式,RGB是紅綠藍三種顏色,這裡的A就是透明通道的意思,A的取值範圍是從0-255之間變化,當A設置為0時,完全透明,255時完全不透明。

下面藍色圓形,可以看到透明度越高,自身的顏色就變淡了,底部的文字就看的更清楚了,如果100%透明,圓形就會消失不存在了。

回到我們上面原來的貓圖片,只要我們能夠將貓影像的圓形區外的所有地方變成完全透明(看不見了),那麼整個圖片就變成圓形的了。

這裡如果自己去計算圓形的邊界,圓形外側全部設置為完全透明,圓形內容不變,一個個像素點去處理,那將會非常麻煩,牛角的就更不用想了。

在PIL庫裡面,提供了兩種方法幫助我們去解決這個問題,第一種是使用Image.putalpha方法;第二種是使用Image.paste蒙版粘貼圖片的方法。

putalpha方法程式碼實現

這裡的putalpha正常裡面是放入一個0-255的數字的,表示要將這整張圖片設置為透明度為多少,這是方式對於整張圖片都更改透明度非常方便,但是對於更改局部或者特定形狀部分的透明度就不行了;這裡使用另外一種方式,傳入一張灰度圖模式的圓形圖片(灰度圖是黑白圖片,灰度0是顯示黑色的,灰度255是顯示白色的),貓的圓形外的透明度就被設置成黑色所代表的數值0,而0在透明度中是表示完全透明的,最終貓的圓外就變成透明了,裡面白色部分不透明顯示出一個圓形。

上面是通過自己繪製一個圖片來實現的,如果要實現一個牛角的,可能自己不會繪製,那可以去找一個現成的。

下面我就找了一張牛角圖片,但是牛角是黑色的,外部是白色的,這個出來的效果是下面這樣的。

顯示出的效果不符合我的要求,我想要的是中間是牛角,周圍是透明的,下面利用PIL的ImageOps方法先進行反色處理,把白的變成黑,黑的地方變成白,其它步驟不變。

paste方法程式碼實現

上面是使用putalpha方法實現的,下面再來看看如何使用paste方法如何實現。paste是粘貼的意思,如果後面沒有第三個,那麼就是在某個位置粘貼一張圖片,最後的效果如下。

上面的效果並不是我們想要的,paste除了上面兩個參數,還有第三個參數蒙版影像,這裡要注意蒙版影像和putalpha的影像有所區別,中間是黑色,邊緣是白色;因為蒙版的運行原理是,灰度圖黑色時數值是0,表示透明度就是完全透明的意思,白色數值是255,表示透明圖是完全不透明,所以整個效果就是黑色部分會透明顯示出下面一層的貓,而白色部分不透明也就保留原來效果。

可優化方向

上面的圖片邊緣還有鋸齒,也就是不夠工整,但是影響不大,這個可以自己嘗試再去優化調整一下。

(全文完)