您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中PIL庫有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先,給出Image模塊中的一個簡單的例子。例子實現的功能是:讀取圖片,并進行45°旋轉,然后進行可視化。
# -*- coding:utf-8 -*- # Image模塊開篇例子 from PIL import Image im = Image.open('test.bmp') # 讀取圖片 im.rotate(45).show() # 將圖片旋轉,并用系統自帶的圖片工具顯示圖片
創建縮略圖
# -*- coding:utf-8 -*- # PIL中創建縮略圖(create thumbnails) from PIL import Image import glob,os size = 128,128 for infile in glob.glob("*.jpg"): # glob的作用是文件搜索,返回的是一個列表 file,ext = os.path.splitext(infile) # 將文件的文件名和拓展名分開,用于之后的保存重命名 im = Image.open(infile) im.thumbnail(size,Image.ANTIALIAS) # 等比例縮放 im.save(file+".thumbnail","JPEG") #im.show() # 顯示縮略圖 #print im.size,im.mode
縮略圖不能直接雙擊打開,而可以使用PIL.image的open讀取,然后使用show()方法進行顯示。
圖像處理
PIL.image.alpha_composite(im1,im2) PIL.image.blend(im1,im2,alpha) PIL.Image.composite(im1,im2,mask)
這三個方法都屬于圖片的合成或者融合。都要求im1和im2的mode和size要一致,alpha代表圖片占比的意思,而mask是mode可以為”1”,”L”或者”RGBA”的size和im1、im2一致的。
# coding:utf-8 -*- from PIL import Image # 圖片合成 # PIL的alpha_composite(im1,im2) 圖像通道融合 # im2要和im1的size和mode一致,且要求格式為RGBA im1 = Image.open("test.png") im2 = Image.open("test2.png") newim1 = Image.alpha_composite(im1,im2) # 將im2合成到im1中,如果其一是透明的, # 才能看到結果,不然最終結果只會顯示出im2 newim1.show() #print(im1.mode) # ----------------------------------------- # image.blend(im1,im2,alpha) # alpha為透明度 newim2 = Image.blend(im1,im2,0.5) newim2.show() # ----------------------------------------- mask = Image.open("mask.png") newim3 = Image.composite(im2,im1,mask) newim3.show()
PIL.image.eval(image,*args)
程序:
# -*- coding:utf-8 -*- from PIL import Image im = Image.open("test.png") imnew = Image.eval(im,lambda i:i*2) # 將原圖片的像素點,都乘2,返回的是一個Image對象 #print imnew.mode imnew.show() im.show()
創建圖像
(1) PIL.image.new(mode,size,color=0)
使用模式和大小,創建一個新的圖像。其中,mode可以是”L”,”RGB”,”RGBA”;而size則是一個tuple(元組),color應該和mode相對應。
下面例子,分別創建”L”、”RGB”和”RGBA”的圖片。
# -*- coding:utf-8 -*- from PIL import Image # 創建圖像 # 創建一個灰度圖像 newL = Image.new("L",(28,28),255) newL.show() # 創建一個RGb圖像 newrgb = Image.new("RGB",(28,28),(20,200,45)) newrgb.show() newrgba = Image.new("RGBA",(28,28),(20,200,45,255)) newrgba.show() print "The frist image:",newL.size,newL.mode print "The second image:",newrgb.size,newrgb.mode print "The third image:",newrgba.size,newrgba.mode
(2)以其他形式創建圖像
a. 以數組的形式創建圖像,PIL.image.fromarray(obj,mode=None)
obj - 圖像的數組,類型可以是numpy.array()
mode - 如果不給出,會自動判斷
本人覺得這個功能還是挺實用的,可以將一個數組(具體一點就是像素數組)轉換為圖像,從圖像的本質去處理圖像。
下面一段程序,就是用fromarray()函數實現圖像的灰度化(使用了兩種方法)。
# -*- coding:utf-8 -*- from PIL import Image import numpy as np a = Image.open("fromimg.png") a.show() b = a.resize((28,28)) datab = list(b.getdata()) #print type(datab) obj1 = [] obj2 = [] for i in range(len(datab)): obj1.append([sum(datab[i])/3]) # 灰度化方法1:RGB三個分量的均值 obj2.append([0.3*datab[i][0]+0.59*datab[i][1]+0.11*datab[i][2]]) #灰度化方法2:根據亮度與RGB三個分量的對應關系:Y=0.3*R+0.59*G+0.11*B obj1 = np.array(obj1).reshape((28,28)) obj2 = np.array(obj2).reshape((28,28)) print obj1 print obj2 arrayimg1 = Image.fromarray(obj1) arrayimg2 = Image.fromarray(obj2) arrayimg1.show() arrayimg2.show()
顯然,兩種方法都能成功灰度化。
還有:
PIL.Image.frombytes(mode,size,data,decoder_name='raw',*args) PIL.Image.fromstring(*args,**kw) PIL.Image.frombuffer(mode,size,data,decoder_name='raw',*args)
感覺不常用,沒有仔細研究。
Image模塊下的Image類
下面的Image是一個圖像對象,而不是模塊!
(1) Image.convert(mode=None,matrix=None,dither=None,palette=0,color=256)
該方法,同樣可以實現上面的灰度化處理。
# -*- coding:utf-8 -*- from PIL import Image img = Image.open("test.png") # 灰度化:將RGB/RGBA -> L img = img.convert("L") img.show()
(2) Image.copy()
將讀取的圖片復制一份。
# -*- coding:utf-8 -*- from PIL import Image img = Image.open("test.png") # 灰度化:將RGB/RGBA -> L img = img.convert("L") #img.show() # ------ copy()---------- img1 = img.copy() img1.show()
將灰度化的圖片復制一份,因此該程序的運行結果和之前的一致。
(3) Image.filter(filter)
該函數是用于圖像濾波的,PIL中自帶了很多的濾波器,就是括號中的filter的參數。filter應該是一個ImaageFilter模塊下的對象。這里把ImageFilter模塊講了。其實,該模塊就是提供濾波器。自帶的濾波器有:
使用中值濾波:
# -*- coding:utf-8 -*- from PIL import Image from PIL import ImageFilter # BLUR - 模糊處理 # CONTOUR - 輪廓處理 # DETAIL - 增強 # EDGE_ENHANCE - 將圖像的邊緣描繪得更清楚 # EDGE_ENHANCE_NORE - 程度比EDGE_ENHANCE更強 # EMBOSS - 產生浮雕效果 # SMOOTH - 效果與EDGE_ENHANCE相反,將輪廓柔和 # SMOOTH_MORE - 更柔和 # SHARPEN - 效果有點像DETAIL testimg = Image.open("filter1.png") testimg.show() filterimg = testimg.filter(ImageFilter.MedianFilter) filterimg.show()
(4) 使用各種方法/函數獲取圖片的基本信息
Image.getbands()
Image.geebbox()
Image.getcolors(maxcolor=256)
Image.getdata(band=None)(一般和list()結合使用)
Image.getextrema()
Image.getpixel((x,y))
Image.histogram(mask=None,extrema=None)
# -*- coding:utf-8 -*- from PIL import Image img1 = Image.open("test.png") img1.show() # getbands() - 顯示該圖像的所有通道,返回一個tuple bands = img1.getbands() print bands # getbbox() - 返回一個像素坐標,4個元素的tuple bboxs = img1.getbbox() print bboxs # getcolors() - 返回像素信息,是一個含有元素的列表[(該種像素的數量,(該種像素)),(...),...] colors = img1.getcolors() print colors # getdata() - 返回圖片所有的像素值,要使用list()才能顯示出具體數值 #data = list(img1.getdata()) #print data # getextrema() - 獲取圖像中每個通道的像素最小和最大值,是一個tuple類型 extremas = img1.getextrema() print extremas # getpixel() - 獲取該坐標 pixels = img1.getpixel((87,180)) print pixels # histogram() - 返回圖片的像素直方圖 print(img1.histogram())
運行結果:
('R', 'G', 'B', 'A')
(0, 0, 338, 238)
[(73463, (255, 255, 255, 255)), (32, (252, 249, 252, 255)), (1, (255, 189, 143, 255)), (12, (255, 199, 160, 255)), (22, (247, 239, 247, 255)), (3, (255, 242, 246, 255)), (9, (238, 221, 238, 255)), (9, (235, 215, 235, 255)), (5, (232, 209, 232, 255)), (1, (255, 228, 209, 255)), (2, (255, 210, 225, 255)), (1, (255, 202, 201, 255)), (3, (255, 158, 92, 255)), (22, (218, 181, 218, 255)), (1, (217, 181, 218, 255)), (2, (255, 232, 217, 255)), (16, (255, 195, 153, 255)), (22, (212, 169, 212, 255)), (3, (211, 169, 212, 255)), (1, (204, 153, 204, 255)), (1, (255, 229, 238, 255)), (53, (255, 131, 46, 255)), (9, (255, 203, 167, 255)), (1, (255, 157, 90, 255)), (3, (186, 119, 187, 255)), (2, (255, 217, 229, 255)), (6, (183, 113, 184, 255)), (1, (255, 212, 227, 255)), (14, (214, 175, 215, 255)), (2, (255, 182, 131, 255)), (12, (166, 79, 167, 255)), (2, (255, 180, 127, 255)), (4309, (255, 127, 39, 255)), (737, (163, 73, 164, 255)), (4, (255, 252, 253, 255)), (3, (255, 232, 216, 255)), (9, (255, 250, 233, 255)), (1, (255, 245, 248, 255)), (34, (255, 239, 228, 255)), (3, (255, 142, 64, 255)), (1, (255, 162, 98, 255)), (19, (255, 247, 241, 255)), (7, (255, 223, 201, 255)), (2, (255, 133, 49, 255)), (16, (255, 221, 232, 255)), (58, (255, 235, 221, 255)), (1, (255, 225, 204, 255)), (2, (255, 219, 194, 255)), (21, (255, 175, 120, 255)), (6, (255, 182, 206, 255)), (37, (255, 243, 235, 255)), (3, (255, 179, 127, 255)), (6, (255, 207, 223, 255)), (3, (255, 232, 240, 255)), (1, (255, 134, 51, 255)), (2, (255, 222, 233, 255)), (2, (255, 218, 192, 255)), (1, (255, 186, 186, 255)), (1, (255, 163, 99, 255)), (1, (255, 207, 173, 255)), (8, (255, 151, 80, 255)), (1, (255, 184, 201, 255)), (19, (255, 211, 180, 255)), (1, (255, 143, 65, 255)), (9, (255, 233, 158, 255)), (18, (255, 215, 187, 255)), (1, (255, 185, 136, 255)), (7, (255, 227, 237, 255)), (22, (255, 163, 100, 255)), (1, (255, 221, 198, 255)), (5, (255, 184, 208, 255)), (10, (255, 195, 215, 255)), (5, (255, 239, 182, 255)), (1, (255, 197, 157, 255)), (1, (255, 154, 85, 255)), (1, (255, 136, 55, 255)), (8, (255, 240, 190, 255)), (14, (255, 216, 229, 255)), (3, (255, 179, 204, 255)), (1, (255, 143, 67, 255)), (1, (255, 196, 155, 255)), (19, (255, 249, 227, 255)), (2, (255, 211, 181, 255)), (10, (255, 230, 142, 255)), (4, (255, 187, 140, 255)), (195, (255, 201, 14, 255)), (2, (255, 129, 42, 255)), (1, (255, 131, 47, 255)), (12, (255, 231, 214, 255)), (1, (255, 181, 151, 255)), (8, (249, 244, 249, 255)), (13, (246, 238, 246, 255)), (44, (244, 234, 244, 255)), (1, (243, 232, 244, 255)), (7, (240, 226, 241, 255)), (25, (255, 167, 107, 255)), (24, (255, 215, 229, 255)), (22, (230, 206, 230, 255)), (6, (229, 204, 229, 255)), (3, (255, 130, 45, 255)), (11, (227, 200, 228, 255)), (4, (226, 198, 226, 255)), (3, (255, 127, 40, 255)), (5, (223, 192, 223, 255)), (9, (220, 186, 221, 255)), (172, (255, 174, 201, 255)), (16, (255, 231, 239, 255)), (1, (255, 171, 113, 255)), (33, (209, 164, 209, 255)), (1, (255, 192, 213, 255)), (6, (255, 247, 250, 255)), (2, (255, 136, 54, 255)), (9, (255, 253, 247, 255)), (1, (255, 171, 114, 255)), (2, (255, 147, 73, 255)), (5, (255, 181, 130, 255)), (7, (189, 124, 190, 255)), (1, (255, 199, 161, 255)), (13, (255, 183, 134, 255)), (3, (255, 152, 82, 255)), (2, (255, 156, 88, 255)), (32, (255, 143, 66, 255)), (5, (178, 102, 178, 255)), (6, (175, 96, 176, 255)), (8, (255, 129, 43, 255)), (4, (172, 90, 173, 255)), (1, (255, 168, 109, 255)), (1, (255, 153, 83, 255)), (1, (255, 174, 118, 255)), (1, (255, 172, 115, 255)), (1, (255, 148, 75, 255)), (8, (255, 244, 248, 255)), (1, (255, 130, 43, 255)), (5, (255, 205, 222, 255)), (1, (255, 210, 177, 255)), (1, (255, 170, 110, 255)), (1, (255, 157, 89, 255)), (1, (255, 197, 134, 255)), (13, (255, 155, 86, 255)), (3, (255, 137, 56, 255)), (2, (255, 138, 57, 255)), (11, (255, 227, 208, 255)), (1, (255, 190, 145, 255)), (2, (255, 155, 87, 255)), (1, (169, 84, 170, 255)), (4, (255, 202, 220, 255)), (6, (255, 139, 59, 255)), (1, (255, 128, 42, 255)), (1, (255, 158, 91, 255)), (1, (255, 198, 158, 255)), (5, (255, 130, 44, 255)), (1, (255, 202, 165, 255)), (1, (255, 187, 154, 255)), (1, (255, 132, 48, 255)), (1, (255, 154, 84, 255)), (1, (255, 235, 241, 255)), (7, (255, 135, 53, 255)), (62, (255, 159, 93, 255)), (2, (255, 177, 124, 255)), (4, (255, 187, 210, 255)), (11, (255, 251, 248, 255)), (1, (255, 229, 211, 255)), (1, (255, 208, 176, 255)), (1, (255, 133, 50, 255)), (2, (255, 219, 231, 255)), (2, (255, 141, 63, 255)), (2, (255, 146, 71, 255)), (1, (255, 160, 95, 255)), (2, (255, 184, 135, 255)), (1, (255, 208, 175, 255)), (1, (255, 139, 61, 255)), (1, (255, 189, 211, 255)), (2, (255, 145, 69, 255)), (263, (255, 191, 147, 255)), (4, (255, 187, 141, 255)), (3, (255, 250, 252, 255)), (1, (255, 147, 72, 255)), (5, (255, 177, 203, 255)), (1, (255, 169, 109, 255)), (62, (255, 207, 174, 255))]
((163, 255), (73, 255), (14, 255), (255, 255))
(255, 127, 39, 255)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 12, 0, 0, 1, 0, 0, 4, 0, 0, 6, 0, 0, 5, 0, 0, 0, 0, 6, 0, 0, 3, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 33, 0, 3, 22, 0, 14, 0, 0, 1, 22, 0, 9, 0, 0, 5, 0, 0, 4, 11, 0, 6, 22, 0, 5, 0, 0, 9, 0, 0, 9, 0, 7, 0, 0, 1, 44, 0, 13, 22, 0, 8, 0, 0, 32, 0, 0, 79360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 7, 0, 0, 4312, 1, 10, 9, 54, 1, 3, 1, 7, 3, 3, 2, 7, 0, 2, 3, 34, 0, 2, 2, 3, 1, 0, 0, 8, 3, 2, 2, 15, 2, 2, 4, 62, 1, 0, 1, 23, 33, 0, 0, 25, 1, 26, 1, 2, 1, 0, 173, 35, 0, 7, 0, 6, 2, 29, 8, 13, 8, 1, 10, 13, 0, 2, 1, 263, 6, 0, 0, 26, 1, 2, 5, 13, 11, 195, 6, 9, 6, 5, 22, 69, 2, 5, 3, 21, 1, 0, 0, 51, 14, 2, 2, 4, 0, 26, 2, 7, 0, 1, 7, 18, 1, 2, 10, 28, 9, 9, 44, 59, 0, 0, 13, 61, 8, 0, 3, 37, 16, 1, 0, 25, 0, 51, 12, 11, 4, 9, 0, 73463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4309, 3, 0, 3, 9, 5, 3, 53, 1, 1, 2, 1, 1, 0, 7, 2, 1, 3, 2, 0, 6, 0, 1, 0, 2, 3, 1, 32, 1, 0, 2, 0, 2, 1, 2, 0, 1, 0, 0, 0, 0, 8, 0, 3, 1, 1, 1, 13, 2, 2, 1, 1, 1, 3, 62, 0, 1, 0, 0, 1, 1, 22, 0, 0, 0, 0, 0, 0, 25, 0, 2, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 21, 0, 0, 0, 2, 0, 0, 5, 0, 0, 5, 2, 0, 0, 14, 2, 1, 0, 0, 0, 4, 4, 10, 1, 0, 1, 0, 263, 0, 0, 0, 1, 0, 16, 1, 1, 0, 1, 10, 0, 12, 1, 0, 0, 737, 1, 0, 21, 0, 0, 1, 0, 0, 5, 62, 1, 7, 1, 5, 0, 19, 2, 5, 0, 6, 0, 1, 21, 0, 0, 15, 0, 2, 0, 2, 0, 0, 0, 1, 0, 0, 181, 0, 5, 5, 0, 6, 0, 16, 34, 4, 2, 25, 1, 12, 24, 3, 2, 23, 0, 4, 67, 5, 11, 0, 2, 4, 20, 45, 46, 22, 2, 21, 11, 0, 46, 0, 7, 10, 16, 3, 27, 0, 0, 45, 0, 16, 31, 20, 8, 6, 0, 35, 4, 0, 73463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80444]
(5) 圖像粘貼操作(paste)
Image.paste(im,box=None,maske=None)
使用im粘貼到原圖片中。注意:兩個圖片的mode和size要求一致,不一致可以使用convert()和resize()進行調整。
# -*- coding:utf-8 -*- from PIL import Image rawimg = Image.open("qqtou.png") print rawimg.size im = Image.open("number.png") print im.size # rawimg的size和im的size要相同,不然不能匹配 # paste(用來粘貼的圖片,(位置坐標)),可以通過設置位置坐標來確定粘貼圖片的位置 # 該方法沒有返回值,直接作用于原圖片 rawimg.paste(im,(75,-90)) rawimg.show()
(6) 各種put操作
Image.putalpha(alpha) - 添加多一層alpha層,沒看出具體效果
Image.putdata(data,scale=1.0,offset=0.0) - 添加一個像素序列到原圖像。
# -*- coding:utf-8 -*- from PIL import Image img = Image.open("qqtou.png") img = img.convert("L") img.show() imgdata = list(img.getdata()) print imgdata addlist = [] for i in range(len(imgdata)): if imgdata[i]>250: addlist.append(imgdata[i]-100) else: addlist.append(imgdata[i]) # putdata - 將一個序列添加進原圖像,沒有返回值,直接作用在原圖像中 img.putdata(addlist) img.show()
顯然,原始圖像(左圖)已經發生了改變。
關于“Python中PIL庫有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。