用Python來P圖
Python騷操作 | 用Python來P圖
給大家帶來一篇關於PIL的文章,PIL全稱是Python Image Library,顧名思義,是用來做影象處理的。用這個庫,可以實現很多PS裡的效果,比如像圖片模糊、尋找輪廓、邊緣檢測等等。我們來看看具體怎麼做到的呢?
PS作為世界四大發明之一可以說被廣大網友用到了極致,只有你想不到的沒有我P不了的,任何正經的圖片在都可以變成搞笑圖片(比如下圖)當然也可以用ps做一點正經的事情。
作為一個愛折騰的程式猿能用程式碼的解決的事情絕對不會用其他的方式,Python可以打飛機,人工降雪,那麼p個圖對於Python來說是小兒科了,今天就教給大家Python之p圖大法。
具體介紹
今天P圖主要用到的就是PIL庫。
PIL(Python Image Library)是python的第三方影象處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方影象處理庫了,今天只是簡單的學習了幾個方法就已經感受到PIL的強大。
PIL可以做很多和影象處理相關的事情:
影象歸檔(Image Archives)。PIL非常適合於影象歸檔以及影象的批處理任務。你可以使用PIL建立縮圖,轉換影象格式,列印影象等等。
影象展示(Image Display)。PIL較新的版本支援包括TkPhotoImage,BitmapImage還有Windows DIB等介面。PIL支援眾多的GUI框架介面,可以用於影象展示。
影象處理(Image Processing)。PIL包括了基礎的影象處理函式,包括對點的處理,使用眾多的卷積核(convolution kernels)做過濾(filter),還有顏色空間的轉換。PIL庫同樣支援影象的大小轉換,影象旋轉,以及任意的仿射變換。PIL還有一些直方圖的方法,允許你展示影象的一些統計特性。這個可以用來實現影象的自動對比度增強,還有全域性的統計分析等。
今天先給大家介紹今天學到的三個比較好玩的操作,並沒有詳細的介紹PIL那些最常用的特性與用法,感興趣的小夥伴文末留言如果人數較多會考慮分享常用的特性。
主要參考自:
http://www.effbot.org/imaging...程式碼實現
先上一個效果圖。
實現這個效果使用的是PIL中的Blend類
Image.blend(image1,image2,alpha)
⇒image
使用給定的兩張影象及透明度變數alpha,插值出一張新的影象。這兩張影象必須 有一樣的尺寸和模式 。
合成公式為:out=image1(1.0- alpha)+image2alpha
若變數alpha為0.0,返回第一張影象的拷貝。若變數alpha為1.0,將返回第二張影象的拷貝。對變數alpha的值無限制。
from PIL import Image im1 = Image.open("124.jpg") im2 = Image.open("123.jpg") print(im1.mode,im1.size) print(im2.mode,im2.size) im = Image.blend(im1, im2, 0.3) im.save('k3.jpg')
當然除了上面的方法還可以使用Composite類
Image.composite(image1,image2, mask) ⇒ image
複合類使用給定的兩張影象及mask影象作為透明度,插值出一張新的影象。變數mask影象的模式可以為“1”,“L”或者“RGBA”。所有影象必須有 相同的尺寸 。
from PIL import Image im1 = Image.open("124.jpg") im2 = Image.open("123.jpg") r,g,b = im1.split() print(b.mode) print(im1.mode,im1.size) print(im2.mode,im2.size) im = Image.composite(im1,im2,b) im.save('k1.jpg')
自己只是做了一個簡單的測試大家可以通過這種方法做出更好看的圖片,PIL不僅可以使兩張圖片進行重合,還可以給圖片新增水印。
from PIL import Image, ImageDraw,ImageFont #將原來的圖片轉換為RGBA模式 im = Image.open(r"timg2.png").convert('RGBA') #新建一個圖片,尺寸與上面的尺寸一樣,透明度為0即完全透明 txt=Image.new('RGBA', im.size, (0,0,0,0)) #設定要寫文字的字型 fnt=ImageFont.truetype("D:\PycharmProjects\music\SIMYOU.TTF", 30) #打漢字 d=ImageDraw.Draw(txt) #寫要打的位置,內容,用的字型,文字透明度 d.text((txt.size[0]-205,txt.size[1]-50),"@Ahab雜貨鋪",font=fnt, fill=(255,0,0,300)) #兩個圖片複合 out=Image.alpha_composite(im, txt) #儲存加水印後的圖片 out.save(r"KB.png")
下面帶來最後一組有趣的操作:
Filter類
im.filter(filter) ⇒ image
返回一個使用給定濾波器處理過的影象的拷貝。在該模組中,預先定義了很多增強濾波器,可以通過filter()函式使用,預定義濾波器包括:
- BLUR
- CONTOUR
- DETAIL
- EDGE_ENHANCE
- EDGE_ENHANCE_MORE
- EMBOSS
- FIND_EDGES
- SMOOTH
其中BLUR就是均值濾波,CONTOUR找輪廓,FIND_EDGES邊緣檢測,使用該模組時,需先匯入。
from PIL import Image from PIL import ImageFilter## 調取ImageFilter img = Image.open("123.jpg") blu = imgF.filter(ImageFilter.BLUR)##均值濾波 con = imgF.filter(ImageFilter.CONTOUR)##找輪廓 edge = imgF.filter(ImageFilter.FIND_EDGES)##邊緣檢測 blu.save('k.jpg') con.save('k2.jpg') edge.save('k3.jpg')
看一下效果第一張是原圖,剩下的是根據我們設定的呈現的效果圖。