1. 程式人生 > >Python影象處理庫PIL的Image模組介紹(四)

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  版權宣告:本文為博主原創文章,轉載請附上博文連結!