Python影象處理庫PIL的Image模組介紹(四)
(Image模組方法16-25)
16、 Paste
定義1:im.paste(image,box)
含義1:將一張圖貼上到另一張影象上。變數box或者是一個給定左上角的2元組,或者是定義了左,上,右和下畫素座標的4元組,或者為空(與(0,0)一樣)。如果給定4元組,被貼上的影象的尺寸必須與區域尺寸一樣。
如果模式不匹配,被貼上的影象將被轉換為當前影象的模式。
例子1:
>>>from PIL import Image
>>> im01= Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>box=[0,0,100,100]
>>>im_crop = im01.crop(box)
>>>im_crop.size
(100, 100)
>>>im_crop.mode
'RGB'
>>>im01.paste(im_crop, (200,200))
>>>im01.paste(im_crop, (500,500,600,600))
>>>im01.show()
我們先從影象im01中裁剪出一個100x100的影象,它的模式與im01一樣都是“RGB”。然後通過2元組和4元組的方式,將裁剪出來的影象貼上到影象im01上。在影象im01的(200,200)和(500,500)兩個位置分別出現了裁剪出來的100x100的影象。其結果如下圖所示:
定義2:im.paste(colour,box)
含義2:它與定義1一樣,但是它使用同一種顏色填充變數box對應的區域。對於單通道影象,變數colour為單個顏色值;對於多通道,則為一個元組。
例子2:
>>>from PIL import Image
>>> im01= Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im01.paste((0,256,0),(0,0,100,100))
影象im01的(0,0)位置將出現一個100x100的綠色方塊。
>>> im01.paste(255,(0,0,100,100))
影象im01的(0,0)位置將出現一個100x100的紅色方塊。對於多通道的影象,如果變數colour只給定一個數值,將只會應用於影象的第一個通道。如果是“RGB”模式的影象,將應用於紅色通道。
定義3:im.paste(image,box, mask)
含義3:與定義1一樣,但是它使用變數mask對應的模板影象來填充所對應的區域。可以使用模式為“1”、“L”或者“RGBA”的影象作為模板影象。模板影象的尺寸必須與變數image對應的影象尺寸一致。如果變數mask對應影象的值為255,則模板影象的值直接被拷貝過來;如果變數mask對應影象的值為0,則保持當前影象的原始值。變數mask對應影象的其他值,將對兩張影象的值進行透明融合。
注意:如果變數image對應的為“RGBA”影象,即貼上的影象模式為“RGBA”,則alpha通道被忽略。使用者可以使用同樣的影象作為原影象和模板影象。
例子3:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> box =[500,500,600,600]
>>> im_crop =im01.crop(box)
>>> r,g,b =im_crop.split()
>>>im01.paste(im_crop, (0,0,100,100), r)
>>> im01.show()
在影象im01的(0,0)位置將出現一個半透明的100x100的方塊。
定義4:im.paste(colour,box, mask)
含義4:與定義3一樣,只是使用變數colour對應的單色來填充區域。
例子4:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> box= [500,500,600,600]
>>>im_crop = im01.crop(box)
>>>r,g,b = im_crop.split()
>>>im01.paste((0,256,0), (0,0,100,100), r)
>>>im01.show()
在影象im01的(0,0)位置將出現一個100x100的綠色方塊。
17、 Point
定義1:im.point(table)⇒ image
im.point(function) ⇒ image
含義1:返回給定查詢表對應的影象畫素值的拷貝。變數table為影象的每個通道設定256個值。如果使用變數function,其對應函式應該有一個引數。這個函式將對每個畫素值使用一次,結果表格將應用於影象的所有通道。
如果影象的模式為“I(整數)”或者“F(浮點)”,使用者必須使用function方式,function必須按照下面的格式:
argument * scale+ offset
例如:
out = im.point(lambda i: i * 1.2 + 10)
使用者可以省略變數scale和offset。
例子1:
>>>from PIL import Image
>>> im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im_point_fun = im01.point(lambda i:i*1.2+10)
>>>im_point_fun.show()
影象im_point_fun比原圖im01亮度增加了很多;因為lambda表示式中對原圖的每個畫素點的值都做了增加操作。
Lambda表示式是python中可以替代簡單函式的一種方式,它只能封裝有限的邏輯,但是對於某些情況,使用起來還是很方便的。
定義lambda函式的形式如下:labmda引數:表示式lambda函式預設返回表示式的值。你也可以將其賦值給一個變數。lambda函式可以接受任意個引數,包括可選引數,但是表示式只有一個。
Lambda表示式的例子:
>>>range(10)
[0, 1, 2, 3, 4,5, 6, 7, 8, 9]
如果我們要對這10個數字,逐個做加一操作,可以使用如下表達式:
>>>map(lambda x:x+1, [y for y in range(10)])
[1, 2, 3, 4, 5,6, 7, 8, 9, 10]
函式map()是python的內建函式,其格式如下:
map( func,seq1[, seq2...]
Python函數語言程式設計中的map()函式是將func作用於seq中的每一個元素,並用一個列表給出返回值。如果func為None,作用同zip()。
當seq只有一個時,將func函式作用於這個seq的每個元素上,得到一個新的seq。
例如:
>>>map(lambda x:x+10, range(10))
[10, 11, 12, 13,14, 15, 16, 17, 18, 19]
當seq多於一個時,map可以並行地對每個seq執行。每個seq的同一位置的元素在執行過一個多元的func函式之後,得到一個返回值,這些返回值放在一個結果列表中。需要注意的是,不同長度的多個seq是無法執行map函式的,會出現型別錯誤。
例如:
>>>map(lambda x,y:x+y, [1,2,3],[4,5,6])
[5, 7, 9]
func是None的情況,它的目的是將多個列表相同位置的元素歸併到一個元組,在現在已經有了專用的函式zip()了。
例如:
>>>map(None, [1,2,3],[4,5,6])
[(1, 4), (2, 5),(3, 6)]
>>>zip([1,2,3],[4,5,6])
[(1, 4), (2, 5),(3, 6)]
zip()是Python的一個內建函式,它接受一系列可迭代的物件作為引數,將物件中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表)。若傳入引數的長度不等,則返回list的長度和引數中長度最短的物件相同。利用*號操作符,可以將list unzip(解壓)。
例如:
>>> a =[1,2,3]
>>> b =[2,3,4]
>>> b =[4,5,6]
>>> c =[4,5,6,7,8]
>>>zipped = zip(a,b)
>>>zipped
[(1, 4), (2, 5),(3, 6)]
>>>zip(a,c)
[(1, 4), (2, 5),(3, 6)]
>>>zip(*zipped)
[(1, 2, 3), (4,5, 6)]
定義2:im.point(table,mode) ⇒ image
im.point(function, mode) ⇒ image
含義2:與定義1一樣,但是它會為輸出影象指定一個新的模式。這個方法可以一步將模式為“L”和“P”的影象轉換為模式為“1”的影象。
(New in 1.1.5)這個方法也可以將“L”影象轉換為“I”和“F”模式,或者將16 位的“I”模式影象轉換為“L”模式,此時必須使用65536項的查詢表。
例子2:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>r,g,b = im01.split()
>>>r.mode
'L'
>>> im= r.point(lambda x:x*1.3+5, "1")
>>>im.show()
>>>im.getpixel((0,0))
19
影象im為全白圖;
>>> im= r.point(lambda x:1, "1")
>>>im.show()
>>>im.getpixel((0,0))
1
影象im為全白圖;
>>> im= r.point(lambda x:x*0, "1")
>>>im.show()
>>> im.getpixel((0,0))
0
影象im為全黑圖;
18、 Putalpha
定義:im.putalpha(band)
含義:將給定的通道拷貝到影象的alpha層。此處的影象模式必須為“RGBA”,變數band必須為“L”或者“1”。
(New in PIL 1.1.5)方法putalpha()也可以用於其他模式;影象原地轉換為有alpha通道的模式(通常轉換為“LA”或者“RGBA”)。變數band要麼為影象,要麼為顏色值(一個整數)。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im01.mode
'RGB'
>>>im01.putalpha(100)
>>>im01.mode
'RGBA'
>>>im01.getpixel((0,0))
(11, 113, 198,100)
19、 Putdata
定義:im.putdata(data)
im.putdata(data, scale, offset)
含義:從sequence物件中拷貝資料到當前影象,從影象的左上角(0,0)位置開始。變數scale和offset用來調整sequence中的值:
pixel = value *scale + offset
如果變數scale忽略,則預設為1.0。如果變數offset忽略,則預設為0.0。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> r,g,b =im01.split()
>>>r.getpixel((0,0))
11
>>>r.getpixel((1,0))
10
>>>r.getpixel((2,0))
9
>>>r.getpixel((3,0))
6
>>>r.putdata([1,2,3,4])
>>>r.getpixel((0,0))
1
>>>r.getpixel((1,0))
2
>>>r.getpixel((2,0))
3
>>>r.getpixel((3,0))
4
20、 Putpalette
定義:im.putpalette(sequence)
含義:為“P”或者“L”影象增加一個調色盤。對於“L”影象,它的模式將變化為“P”。調色盤序列需要包含768項整數,每組三個值表示對應畫素的紅,綠和藍。使用者可以使用768個byte的字串代替這個整數序列。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>r,g,b = im01.split()
>>>r.mode
'L'
>>>r.putpalette([1,2,3])
>>> r.mode
'P'
21、 Putpixel
定義:im.putpixel(xy,colour)
含義:修改指定位置上的畫素值。對於單通道影象,變數colour為一個數值;對於多通道影象,變數colour為一個元組。
注意:這個方法執行比較慢。如果是1.1.6版本,畫素訪問物件(參考load方法)提供了一個更快的方法修改影象。如果使用者要生成整幅影象,可以使用更有效的方法產生一個python list,然後使用方法putdata()將它拷貝到影象上去。對於更大的改變,使用方法paste或者ImageDraw模組。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im01.getpixel((0,0))
(11, 113, 198)
>>>im01.putpixel((0,0),(1,2,3))
>>>im01.getpixel((0,0))
(1, 2, 3)
22、 Quantize
定義:im.quantize(colors,**options) ⇒ image
含義:(不贊成)使用給定的顏色將“L”或者“RGB”影象轉換為“P”影象,返回新的影象。
新的程式碼中,使用有自適應的調色盤的convert方法來代替:
out =im.convert("P", palette=Image.ADAPTIVE,colors=256)
例子:
23、 Resize
定義:im.resize(size) ⇒ image
im.resize(size, filter) ⇒ image
含義:返回改變尺寸的影象的拷貝。變數size是所要求的尺寸,是一個二元組:(width, height)。
變數filter為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者影象模式為“1”或者“P”,該變數設定為NEAREST。
注意:在當前的版本中bilinear和bicubic濾波器不能很好地適應大比例的下采樣(例如生成縮圖)。使用者需要使用ANTIALIAS,除非速度比質量更重要。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im01.size
(1024, 768)
>>> im= im01.resize((512, 384))
>>>im.size
(512, 384)
24、 Rotate
定義:im.rotate(angle) ⇒ image
im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
含義:返回一個按照給定角度順時鐘圍繞影象中心旋轉後的影象拷貝。
變數filter應該是NEAREST、BILINEAR或者BICUBIC之一。如果省略該變數,或者影象模式為“1”或者“P”,則預設為NEAREST。
變數expand,如果為true,表示輸出影象足夠大,可以裝載旋轉後的影象。如果為false或者預設,則輸出影象與輸入影象尺寸一樣大。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im01.size
(1024, 768)
>>>im_30 = im01.rotate(30)
>>>im_30.size
(1024, 768)
>>>im_30_1 = im01.rotate(30, Image.BICUBIC,1)
>>>im_30_1.size
(1271, 1178)
影象im_30如下:
影象im_30_1如下:
25、 Save
定義:im.save(outfile,options…)
im.save(outfile, format, options…)
含義:使用給定的檔名儲存影象。如果變數format預設,如果可能的話,則從檔名稱的副檔名判斷檔案的格式。該方法返回為空。
關鍵字options為檔案編寫器提供一些額外的指令。如果編寫器不能識別某個選項,它將忽略它。
使用者可以使用檔案物件代替檔名稱。在這種情況下,使用者必須指定檔案格式。檔案物件必須實現了seek()、tell()和write()方法,且其以二進位制模式開啟。
如果方法save()因為某些原因失敗,這個方法將產生一個異常(通常為IOError異常)。如果發生了異常,該方法也有可能已經建立了檔案,並向檔案寫入了一些資料。如果需要的話,使用者的應用程式可以刪除這個不完整的檔案。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im01.size
(1024, 768)
>>>im_30 = im01.rotate(30)
>>>im_30.save("D:\\Code\\Python\\test\\img\\test_rotate_30.jpg")
(未完待續) --------------------- 作者:icamera0 來源:CSDN 原文:https://blog.csdn.net/icamera0/article/details/50706615 版權宣告:本文為博主原創文章,轉載請附上博文連結!