学会这些Python美图技巧,就等着女朋友夸你吧
一、前言
Python中有許多用于圖像處理的庫,像是Pillow,或者是OpenCV。而很多時候感覺學完了這些圖像處理模塊沒有什么用,其實只是你不知道怎么用罷了。今天就給大家帶了一些美圖技巧,讓你的圖美翻全場,朋友圈贊不絕口,女朋友也夸你,富貴你好厲害啊!
二、模塊安裝
我們主要使用到OpenCV和Pillow,另外我們還會使用到wordcloud和paddlehub,我們先安裝一下:
pip?install?opencv-python pip?install?pillow python?-m?pip?install?paddlepaddle?-i?https://mirror.baidu.com/pypi/simple pip?install?-i?https://mirror.baidu.com/pypi/simple?paddlehub pip?install?-i?https://pypi.tuna.tsinghua.edu.cn/simple/?myqr另外我使用的Python環境是3.7,知道這些我們就可以開始進行我們的美圖之旅了。
三、圖片美化
1、祛痘
還在為痘痘犯難,不敢拍照嗎?有了這個你就不用怕了(雖然有p圖軟件,但是大家不要揭穿我):
import?cv2 level?=?22????#?降噪等級 img?=?cv2.imread('girl.jpg')????#?讀取原圖 img?=?cv2.bilateralFilter(img,?level,?level*2,?level/2)????#?美顏 cv2.imwrite('result.jpg',?img)????實際上,在光滑的臉蛋上,痘痘就可以視為一個噪點,而我們可以通過降噪的方式達到祛痘祛斑的效果,在OpenCV中就提供了相應的濾鏡,我們只需要調用即可。原圖和實現效果圖對比如下:
可以看到臉上的斑明顯是變少了。紳士們應該可以注意到,脖子下面的皮膚光滑了許多。不過頭發細節被抹除了不少。我們可以通過調節level參數,調節效果。如果想效果更好,可以結合人臉識別,進行局部的祛痘處理。
2、詞云——我不只是一張圖
其實詞云已經是老生常談了,但是作美圖中的姣姣者,還是有必要列出來的,因為一張詞云所能包含的信息太多了:
from?PIL?import?Image import?numpy?as?np from?wordcloud?import?WordCloud,?ImageColorGenerator#?讀取背景圖片 mask?=?np.array(Image.open('rose.png'))#?定義詞云對象 wc?=?WordCloud(#?設置詞云背景為白色background_color='white',#?設置詞云最大的字體max_font_size=30,#?設置詞云輪廓mask=mask,#?字體路徑,如果需要生成中文詞云,需要設置該屬性,設置的字體需要支持中文#font_path='msyh.ttc' ) #?讀取文本 text?=?open('article.txt',?'r',?encoding='utf-8').read() #?生成詞云 wc.generate(text) #?給詞云上色 wc?=?wc.recolor(color_func=ImageColorGenerator(mask)) #?保存詞云 wc.to_file('result.png')其中article.txt為我們的詞云的文本素材,而rose.png則是詞云輪廓(該圖片背景應該為嚴格的白色或者透明),原圖和實現效果如下:
還是非常美的。更多詳細內容可以參考https://blog.csdn.net/ZackSock/article/details/103517841。
3、風格遷移——努力變成你喜歡的樣子
風格遷移,顧名思義就是將某一張圖片的風格遷移到另一張圖片上。比如我拍了一張白天的圖片,但是我想要一張夜景的圖片,那我們該怎么做呢?當然是等到晚上再拍了,不過除了這個方法,我們還可以下載一張夜景圖片,將夜景效果遷移到我們的原圖上。
風格遷移的實現需要使用深度學習才能實現,但是像我這樣的菜雞肯定是不會深度學習的啦,所以我們直接使用paddlehub中已經實現好的模型庫:
import?cv2 import?paddlehub?as?hub #?加載模型庫 stylepro_artistic?=?hub.Module(name="stylepro_artistic") #?進行風格遷移 im?=?stylepro_artistic.style_transfer(images=[{#?原圖'content':?cv2.imread("origin.jpg"),#?風格圖'styles':?[cv2.imread("style.jpg")]}],#?透明度alpha?=?0.1 ) #?從返回的數據中獲取圖片的ndarray對象 im?=?im[0]['data'] #?保存結果圖片 cv2.imwrite('result.jpg',?im)原圖風格圖和效果圖如下:
左邊是原圖,中間是風格圖,右邊為效果圖。上面的效果還算可以,但是不是每次都怎么成功,還是要多試試。
4、圖中圖——每一個像素都是你
這個相比上面的要復雜一些,我們需要準備圖庫,將這些圖作素材,然后根據圖片某個區域的主色調進行最適當的替換,代碼如下:
import?os import?cv2 import?numpy?as?npdef?getDominant(im):"""獲取主色調"""b?=?int(round(np.mean(im[:,?:,?0])))g?=?int(round(np.mean(im[:,?:,?1])))r?=?int(round(np.mean(im[:,?:,?2])))return?(b,?g,?r)def?getColors(path):"""獲取圖片列表的色調表"""colors?=?[]filelist?=?[path?+?i?for?i?in?os.listdir(path)]for?file?in?filelist:im?=?cv2.imdecode(np.fromfile(file,?dtype=np.uint8),?-1)dominant?=?getDominant(im)colors.append(dominant)return?colorsdef?fitColor(color1,?color2):"""返回兩個顏色之間的差異大小"""b?=?color1[0]?-?color2[0]g?=?color1[1]?-?color2[1]r?=?color1[2]?-?color2[2]return?abs(b)?+?abs(g)?+?abs(r)def?generate(im_path,?imgs_path,?box_size,?multiple=1):"""生成圖片"""#?讀取圖片列表img_list?=?[imgs_path?+?i?for?i?in?os.listdir(imgs_path)]#?讀取圖片im?=?cv2.imread(im_path)im?=?cv2.resize(im,?(im.shape[1]*multiple,?im.shape[0]*multiple))#?獲取圖片寬高width,?height?=?im.shape[1],?im.shape[0]#?遍歷圖片像素for?i?in?range(height?//?box_size+1):for?j?in?range(width?//?box_size+1):#?圖塊起點坐標start_x,?start_y?=?j?*?box_size,?i?*?box_size#?初始化圖片塊的寬高box_w,?box_h?=?box_size,?box_sizebox_im?=?im[start_y:,?start_x:]if?i?==?height?//?box_size:box_h?=?box_im.shape[0]if?j?==?width?//?box_size:box_w?=?box_im.shape[1]if?box_h?==?0?or?box_w?==?0:continue#?獲取主色調dominant?=?getDominant(im[start_y:start_y+box_h,?start_x:start_x+box_w])img_loc?=?0#?差異,同主色調最大差異為255*3dif?=?255?*?3#?遍歷色調表,查找差異最小的圖片for?index?in?range(colors.__len__()):if?fitColor(dominant,?colors[index])?<?dif:dif?=?fitColor(dominant,?colors[index])img_loc?=?index#?讀取差異最小的圖片box_im?=?cv2.imdecode(np.fromfile(img_list[img_loc],?dtype=np.uint8),?-1)#?轉換成合適的大小box_im?=?cv2.resize(box_im,?(box_w,?box_h))#?鋪墊色塊im[start_y:start_y+box_h,?start_x:start_x+box_w]?=?box_imj?+=?box_wi?+=?box_hreturn?imif?__name__?==?'__main__':#?獲取色調列表colors?=?getColors('表情包/')result_im?=?generate('main.jpg',?'表情包/',?50,?multiple=5)cv2.imwrite('C:/Users/zaxwz/Desktop/result.jpg',?result_im)關于實現,我后續會寫文章詳細分析。我們看看效果圖:
圖片我們還是可以看出人物的,但是某些地方顏色不太對,這就是根據我們圖庫來的了。我們放大圖片就能看到上面幾百張小圖片。(當然你放大上面的圖是看不到的,因為分辨率太低)
5、切換背景——帶你去旅行
最近大家都宅家里,照片拍了不少,可惜背景全是沙發。遇到我就是你女朋友的福氣,看我如何10行代碼換圖片背景:
from?PIL?import?Image import?paddlehub?as?hub #?加載模型 humanseg?=?hub.Module(name='deeplabv3p_xception65_humanseg') #?摳圖 results?=?humanseg.segmentation(data={'image':['xscn.jpeg']}) #?讀取背景圖片 bg?=?Image.open('bg.jpg') #?讀取原圖 im?=?Image.open('humanseg_output/xscn.png').convert('RGBA') im.thumbnail((bg.size[1],?bg.size[1])) #?分離通道 r,?g,?b,?a?=?im.split() #?將摳好的圖片粘貼到背景上 bg.paste(im,?(bg.size[0]-bg.size[1],?0),?mask=a) bg.save('xscn.jpg')下面看看我們的效果:
6、九宮格——一張照片裝不下你的美
很多人發照片都喜歡發九宮格,但是一般又沒那么多照片,這個時候就需要用表情包占位了。對于技術宅,這種不合理的方式是絕不容許的,于是我們寫下如下代碼:
from?PIL?import?Image #?讀取圖片 im?=?Image.open('xscn.jpeg') #?寬高各除?3,獲取裁剪后的單張圖片大小 width?=?im.size[0]//3 height?=?im.size[1]//3 #?裁剪圖片的左上角坐標 start_x?=?0 start_y?=?0 #?用于給圖片命名 im_name?=?1 #?循環裁剪圖片 for?i?in?range(3):for?j?in?range(3):#?裁剪圖片并保存crop?=?im.crop((start_x,?start_y,?start_x+width,?start_y+height))crop.save(str(im_name)?+?'.jpg')#?將左上角坐標的?x?軸向右移動start_x?+=?widthim_name?+=?1#?當第一行裁剪完后?x?繼續從?0?開始裁剪start_x?=?0#?裁剪第二行start_y?+=?height我們執行上面的代碼后,就能生成名為1~9的圖片,這些圖片就是我們的九宮格圖片,下面看看測試效果:
不得不說,小松菜奈是真的美。
7、圖片二維碼——冰冷的圖里也飽含深情
有話想說又不敢說?來試試二維碼吧,小小的圖飽含深情:
from?MyQR?import?myqr myqr.run(words='http://www.baidu.com',????#?包含信息picture='lbxx.jpg',????????????#?背景圖片colorized=True,????????????#?是否有顏色,如果為False則為黑白save_name='code.png'????#?輸出文件名 )效果圖如下:
因為上面的二維碼經過我的特殊處理,在你掃碼的時候會發現上面是碼中碼中碼,要掃很多遍才能獲得最后結果,大家可以發揮自己的想象力,做出點有趣的東西。
? ???精 彩 文 章?
Web前端開發必不可少的9個開源框架
Flutter 1.17 | 2020 首個穩定版發布!
微軟官方再次上線了Python教程,這次比較高級
總結
以上是生活随笔為你收集整理的学会这些Python美图技巧,就等着女朋友夸你吧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简洁、有趣的无限下拉方案
- 下一篇: 学习难?求职难?90分钟点亮你的AI求职