Python影象處理PIL各模組詳細介紹
Image模組
Image模組是在Python PIL影象處理中常見的模組,對影象進行基礎操作的功能基本都包含於此模組內。如open、save、conver、show…等功能。
open類
Image.open(file) ⇒ image
Image.open(file, mode) ⇒ image
要從檔案載入影象,使用 open() 函式, 在 Image 模組:
@zhangziju
from PIL import Image ##呼叫庫
im = Image.open("E:\mywife.jpg") ##檔案存在的路徑
im.show()
需要知道的是在win的環境下im.show的方式為win自帶的影象顯示應用。開啟並確認給定的影象檔案。這個是一個懶操作;該函式只會讀檔案頭,而真實的影象資料直到試圖處理該資料才會從檔案讀取(呼叫load()方法將強行載入影象資料)。如果變數mode被設定,那必須是“r”。使用者可以使用一個字串(表示檔名稱的字串)或者檔案物件作為變數file的值。檔案物件必須實現read(),seek()和tell()方法,並且以二進位制模式開啟。
Save類
im.save(outfile,options…)
im.save(outfile, format, options…)
若要儲存檔案,則使用 Image 類的 save() 方法,此時儲存檔案的檔名就變得十分重要了,除非指定格式,否則這個庫將會以檔名的副檔名作為格式儲存。使用給定的檔名儲存影象。如果變數format預設,如果可能的話,則從檔名稱的副檔名判斷檔案的格式。該方法返回為空。關鍵字options為檔案編寫器提供一些額外的指令。如果編寫器不能識別某個選項,它將忽略它。使用者可以使用檔案物件代替檔名稱。在這種情況下,使用者必須指定檔案格式。檔案物件必須實現了seek()、tell()和write()方法,且其以二進位制模式開啟。如果方法save()因為某些原因失敗,這個方法將產生一個異常(通常為IOError異常)。如果發生了異常,該方法也有可能已經建立了檔案,並向檔案寫入了一些資料。如果需要的話,使用者的應用程式可以刪除這個不完整的檔案。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im)
im.save("E:\mywife.png") ## 將"E:\mywife.jpg"儲存為"E:\mywife.png"
im = Image.open("E:\mywife.png") ##開啟新的png圖片
print(im.format, im.size, im.mode)
如下圖,在指定路徑下可看到新儲存的png格式的圖片。
format類
im.format ⇒ string or None
這個屬性標識了影象來源,如果影象不是從檔案讀取它的值就是None。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.format) ## 打印出格式資訊
im.show()
如下圖可以看到其format為”JPEG”。
Mode類
im.mode ⇒ string
影象的模式,常見的mode 有 “L” (luminance) 表示灰度影象,“RGB”表示真彩色影象,和 “CMYK” 表示出版影象,表明影象所使用畫素格式。如下表為常見的nodes描述:
modes | 描述 |
---|---|
1 | 1位畫素,黑和白,存成8位的畫素 |
L | 8位畫素,黑白 |
P | 8位畫素,使用調色盤對映到任何其他模式 |
RGB | 3× 8位畫素,真彩 |
RGBA | 4×8位畫素,真彩+透明通道 |
CMYK | 4×8位畫素,顏色隔離 |
YCbCr | 3×8位畫素,彩色視訊格式 |
I | 32位整型畫素 |
F | 32位浮點型畫素 |
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.mode) ## 打印出模式資訊
im.show()
如下圖為圖片的mode為“RGB”模式。
convert類
im.convert(mode)⇒ image
將當前影象轉換為其他模式,並且返回新的影象。當從一個調色盤影象轉換時,這個方法通過這個調色盤來轉換畫素。如果不對變數mode賦值,該方法將會選擇一種模式,在沒有調色盤的情況下,使得影象和調色盤中的所有資訊都可以被表示出來。當從一個顏色影象轉換為黑白影象時,PIL庫使用ITU-R601-2 luma轉換公式:
L = R * 299/1000 + G * 587/1000 + B * 114/1000
當轉換為2點陣圖像(模式“1”)時,源影象首先被轉換為黑白影象。結果資料中大於127的值被設定為白色,其他的設定為黑色;這樣影象會出現抖動。如果要使用其他閾值,更改閾值127,可以使用方法point()。為了去掉影象抖動現象,可以使用dither選項。
from PIL import Image
im = Image.open("E:\mywife.jpg")
new_im = im.convert('P')
print(new_im.mode)
new_im.show()
如下,將影象轉換為“P”模式。
對比原始影象。
im.convert(“P”,**options) ⇒ image
這個與第一個方法定義一樣,但是當“RGB”影象轉換為8位調色盤影象時能更好的處理。可供選擇的選項為:
Dither=. 控制顏色抖動。預設是FLOYDSTEINBERG,與鄰近的畫素一起承擔錯誤。不使能該功能,則賦值為NONE。
Palette=. 控制調色盤的產生。預設是WEB,這是標準的216色的“web palette”。要使用優化的調色盤,則賦值為ADAPTIVE。
Colors=. 當選項palette為ADAPTIVE時,控制用於調色盤的顏色數目。預設是最大值,即256種顏色
im.convert(mode,matrix) ⇒ image
使用轉換矩陣將一個“RGB”影象轉換為“L”或者“RGB”影象。變數matrix為4或者16元組。
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.mode)
rgb2xyz = (0.412453,0.357580, 0.180423, 0,
0.212671,0.715160, 0.072169, 0,
0.019334,0.119193, 0.950227, 0 )
new_im = im.convert("L", rgb2xyz)
print(new_im.mode)
new_im.show()
轉換後效果
Size類
im.size ⇒ (width, height)
影象的尺寸,按照畫素數計算,它的返回值為寬度和高度的二元組(width, height)。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.size) ## 打印出尺寸資訊
im.show()
如下圖所示為圖片的尺寸資訊,750*560。
Palette類
im.palette ⇒ palette or None
顏色調色盤表格。如果影象的模式是“P”,則返回ImagePalette類的例項;否則,將為None。
如下為對非“P”模式下的影象進行palette資訊顯示。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.palette)
易知,返回值為空,none
對影象進行convert操作,轉換成“P”模式
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
new_im = im.convert('P')
print(new_im.mode)
print(new_im.palette)
則返回值為ImagePalette類的例項。如下:
Info類
im.info ⇒ dictionary
儲存影象相關資料的字典。檔案控制代碼使用該字典傳遞從檔案中讀取的各種非影象資訊。大多數方法在返回新的影象時都會忽略這個字典;因為字典中的鍵並非標準化的,對於一個方法,它不能知道自己的操作如何影響這個字典。如果使用者需要這些資訊,需要在方法open()返回時儲存這個字典。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.info)
new類
Image.new(mode,size) ⇒ image
Image.new(mode, size,color) ⇒ image
使用給定的變數mode和size生成新的影象。Size是給定的寬/高二元組,這是按照畫素數來計算的。對於單通道影象,變數color只給定一個值;對於多通道影象,變數color給定一個元組(每個通道對應一個值)。在版本1.1.4及其之後,使用者也可以用顏色的名稱,比如給變數color賦值為“red”。如果沒有對變數color賦值,影象內容將會被全部賦值為0(為黑色)。如果變數color是空,影象將不會被初始化,即影象的內容全為0。這對向該影象複製或繪製某些內容是有用的。
如下為將影象設定為128x128大小的紅色影象。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
n_im= Image.new("RGB", (128, 128), "#FF0000")
n_im.show()
顯示效果如下:
如下影象為128x128大小的黑色影象,因為變數color不賦值的話,影象內容被設定為0,即黑色。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
n_im= Image.new("RGB", (128, 128))
n_im.show()
影象為128x128大小的綠色影象。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
n_im= Image.new("RGB", (128, 128),"green")
n_im.show()
Copy類
im.copy() ⇒ image
拷貝這個影象。如果使用者想貼上一些資料到這張圖,可以使用這個方法,但是原始影象不會受到影響。
from PIL import Image
im = Image.open("E:\mywife.jpg")
im_copy = im.copy()
影象im_copy和im完全一樣。
Crop類
im.crop(box) ⇒ image
從當前的影象中返回一個矩形區域的拷貝。變數box是一個四元組,定義了左、上、右和下的畫素座標。用來表示在原始影象中擷取的位置座標,如box(100,100,200,200)就表示在原始影象中以左上角為座標原點,擷取一個100*100(畫素為單位)的影象,為方便理解,如下為示意圖box(b1,a1,b2,a2)。作圖軟體為Visio2016。這是一個懶操作。對源影象的改變可能或者可能不體現在裁減下來的影象中。為了獲取一個分離的拷貝,對裁剪的拷貝呼叫方法load()。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
box = (300, 100, 700, 700) ##確定拷貝區域大小
region = im.crop(box) ##將im表示的圖片物件拷貝到region中,大小為box
region.show()
如下圖為box擷取的影象區域顯示。
Paste類
im.paste(image,box)
將一張圖貼上到另一張影象上。變數box或者是一個給定左上角的2元組,或者是定義了左,上,右和下畫素座標的4元組,或者為空(與(0,0)一樣)。如果給定4元組,被貼上的影象的尺寸必須與區域尺寸一樣。如果模式不匹配,被貼上的影象將被轉換為當前影象的模式。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
box=[0,0,100,100]
im_crop = im.crop(box)
print(im_crop.size,im_crop.mode)
im.paste(im_crop, (100,100)) ##(100,100,0,0)
im.paste(im_crop, (400,400,500,500))
im.show()
如下圖為paste操作:
Filter類
im.filter(filter) ⇒ image
返回一個使用給定濾波器處理過的影象的拷貝。具體參考影象濾波在ImageFilter 模組的應用,在該模組中,預先定義了很多增強濾波器,可以通過filter( )函式使用,預定義濾波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值濾波,CONTOUR找輪廓,FIND_EDGES邊緣檢測,使用該模組時,需先匯入。
@zhangziju
from PIL import Image
from PIL import ImageFilter ## 調取ImageFilter
imgF = Image.open("E:\mywife.jpg")
bluF = imgF.filter(ImageFilter.BLUR) ##均值濾波
conF = imgF.filter(ImageFilter.CONTOUR) ##找輪廓
edgeF = imgF.filter(ImageFilter.FIND_EDGES) ##邊緣檢測
imgF.show()
bluF.show()
conF.show()
edgeF.show()
濾波處理下的gakki~
Blend類
Image.blend(image1,image2, alpha) ⇒ image
使用給定的兩張影象及透明度變數alpha,插值出一張新的影象。這兩張影象必須有一樣的尺寸和模式。
合成公式為:out = image1 (1.0 - alpha) + image2 alpha
若變數alpha為0.0,返回第一張影象的拷貝。若變數alpha為1.0,將返回第二張影象的拷貝。對變數alpha的值無限制。
@zhangziju
from PIL import Image
im1 = Image.open("E:\mywife.jpg")
im2 = Image.open("E:\mywife2.jpg")
print(im1.mode,im1.size)
print(im2.mode,im2.size)
im = Image.blend(im1, im2, 0.2)
im.show()
需保證兩張影象的模式和大小是一致的,如下為顯示im1和im2的具體資訊。
im1和im2按照第一張80%的透明度,第二張20%的透明度,合成為一張。
Split
im.split() ⇒ sequence
返回當前影象各個通道組成的一個元組。例如,分離一個“RGB”影象將產生三個新的影象,分別對應原始影象的每個通道(紅,綠,藍)。
from PIL import Image
im = Image.open("E:\mywife.jpg")
r,g,b = im.split()
print(r.mode)
print(r.size)
print(im.size)
Composite類
Image.composite(image1,image2, mask) ⇒ image
複合類使用給定的兩張影象及mask影象作為透明度,插值出一張新的影象。變數mask影象的模式可以為“1”,“L”或者“RGBA”。所有影象必須有相同的尺寸。
@zhangziju
from PIL import Image
im1 = Image.open("E:\mywife.jpg")
im2 = Image.open("E:\mywife2.jpg")
r,g,b = im1.split() ##分離出r,g,b
print(b.mode)
print(im1.mode,im1.size)
print(im2.mode,im2.size)
im = Image.composite(im1,im2,b)
im.show()
b.mode為”L”,兩圖尺寸一致。
最終效果
Eval類
Image.eval(image,function) ⇒ image
使用變數function對應的函式(該函式應該有一個引數)處理變數image所代表影象中的每一個畫素點。如果變數image所代表影象有多個通道,那變數function對應的函式作用於每一個通道。注意:變數function對每個畫素只處理一次,所以不能使用隨機元件和其他生成器。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
def fun01(x):
return x*0.3
def fun02(y):
return y*2.0
im1_eval = Image.eval(im, fun01)
im2_eval = Image.eval(im, fun02)
im1_eval.show()
im2_eval.show()
在函式fun01和fun02下的影象顯示。
Merge類
Image.merge(mode,bands) ⇒ image
合併類使用一些單通道影象,建立一個新的影象。變數bands為一個影象的元組或者列表,每個通道的模式由變數mode描述。所有通道必須有相同的尺寸。
變數mode與變數bands的關係:
len(ImageMode.getmode(mode).bands)= len(bands)
@zhangziju
from PIL import Image
im1 = Image.open("E:\mywife.jpg")
im2 = Image.open("E:\mywife2.jpg")
r1,g1,b1 = im1.split()
r2,g2,b2 = im2.split()
print(r1.mode,r1.size,g1.mode,g1.size)
print(r2.mode,r2.size,g2.mode,g2.size)
new_im=[r1,g2,b2]
print(len(new_im))
im_merge = Image.merge("RGB",new_im)
im_merge.show()
列印資訊顯示
merge操作
Draft類
im.draft(mode,size)
配置影象檔案載入器,使得返回一個與給定的模式和尺寸儘可能匹配的影象的版本。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.size,im.mode)
new_im = im.draft("L", (200,200))
print(new_im.size,new_im.mode)
new_im.show()
關鍵資訊顯示
轉換效果
Getbands類
im.getbands()⇒ tuple of strings
返回包括每個通道名稱的元組。例如,對於RGB影象將返回(“R”,“G”,“B”)。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.getbands())
Getbbox類
im.getbbox() ⇒ 4-tuple or None
計算影象非零區域的包圍盒。這個包圍盒是一個4元組,定義了左、上、右和下畫素座標。如果影象是空的,這個方法將返回空。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.getbbox())
Getdata類
im.getdata() ⇒ sequence
以包含畫素值的sequence物件形式返回影象的內容。這個sequence物件是扁平的,以便第一行的值直接跟在第零行的值後面,等等。這個方法返回的sequence物件是PIL內部資料型別,它只支援某些sequence操作,包括迭代和基礎sequence訪問。使用list(im.getdata()),將它轉換為普通的sequence。Sequence物件的每一個元素對應一個畫素點的R、G和B三個值。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
sequ = im.getdata()
sequ0 = list(sequ)
print(sequ0[0])
print(sequ0[1])
print(sequ0[2])
視覺化顯示sequence0裡面的資料。
列印顯示結果,與前面對比。
Getextrema類
im.getextrema() ⇒ 2-tuple
返回一個2元組,包括該影象中的最小和最大值。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.getextrema())
該方法返回了R/G/B三個通道的最小和最大值的2元組。
Getpixel類
im.getpixel(xy) ⇒ value or tuple
返回給定位置的畫素值。如果影象為多通道,則返回一個元組。該方法執行比較慢;如果使用者需要使用python處理影象中較大部分資料,可以使用畫素訪問物件(見load),或者方法getdata()。
@zahngziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.getpixel((0,0)))
print(im.getpixel((4,0)))
r,g,b = im.split()
print(b.getpixel((11,8)))
Histogram類
im.histogram()⇒ list
返回一個影象的直方圖。這個直方圖是關於畫素數量的list,影象中的每個象素值對應一個成員。如果影象有多個通道,所有通道的直方圖會連線起來(例如,“RGB”影象的直方圖有768個值)。二值影象(模式為“1”)當作灰度影象(模式為“L”)處理。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
imhis = im.histogram()
print(len(imhis))
print(imhis[0])
print(imhis[150])
print(imhis[300])
im.histogram(mask)⇒ list
返回影象中模板影象非零地方的直方圖。模板影象與處理影象的尺寸必須相同,並且要麼是二值影象(模式為“1”),要麼為灰度影象(模式為“L”)。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
r,g,b = im.split()
imhis = im.histogram()
print(r.mode)
print(len(imhis))
print(imhis[0])
print(imhis[150])
print(imhis[300])
Load類
im.load()
為影象分配記憶體並從檔案中載入它(或者從源影象,對於懶操作)。正常情況下,使用者不需要呼叫這個方法,因為在第一次訪問影象時,Image類會自動地載入開啟的影象。在1.1.6及以後的版本,方法load()返回一個用於讀取和修改畫素的畫素訪問物件。這個訪問物件像一個二維佇列,如:
pix = im.load()
print pix[x, y]
pix[x, y] =value
通過這個物件訪問比方法getpixel()和putpixel()快很多。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
pix = im.load()
print(pix[0,2])
im.paste(colour,box)
使用同一種顏色填充變數box對應的區域。對於單通道影象,變數colour為單個顏色值;對於多通道,則為一個元組。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
im.paste((256,256,0),(0,0,100,100)) ##(256,256,0)表示黃色
im.show()
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
im.paste("blue",(0,0,100,100)) ##或者“blue”
im.show()
im.paste(image,box, mask)
使用變數mask對應的模板影象來填充所對應的區域。可以使用模式為“1”、“L”或者“RGBA”的影象作為模板影象。模板影象的尺寸必須與變數image對應的影象尺寸一致。如果變數mask對應影象的值為255,則模板影象的值直接被拷貝過來;如果變數mask對應影象的值為0,則保持當前影象的原始值。變數mask對應影象的其他值,將對兩張影象的值進行透明融合,如果變數image對應的為“RGBA”影象,即貼上的影象模式為“RGBA”,則alpha通道被忽略。使用者可以使用同樣的影象作為原影象和模板影象。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
box=[300,300,400,400]
im_crop =im.crop(box)
r,g,b =im_crop.split()
im.paste(im_crop, (200,200,300,300), r)
im.show()
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。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
r, g, b = im.split()
print(
r.getpixel((0, 0)),
r.getpixel((1, 0)),
r.getpixel((2, 0)),
r.getpixel((3, 0)),
r.putdata([1, 2, 3, 4]),
r.getpixel((0, 0)),
r.getpixel((1, 0)),
r.getpixel((2, 0)),
r.getpixel((3, 0)),
)
Resize類
im.resize(size) ⇒ image
im.resize(size, filter) ⇒ image
返回改變尺寸的影象的拷貝。變數size是所要求的尺寸,是一個二元組:(width, height)。變數filter為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者影象模式為“1”或者“P”,該變數設定為NEAREST。在當前的版本中bilinear和bicubic濾波器不能很好地適應大比例的下采樣(例如生成縮圖)。使用者需要使用ANTIALIAS,除非速度比質量更重要。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
region = im.resize((400, 400)) ##重新設定大小
region.show()
很明顯由於大小的重新設定,圖片的顯示效果有所轉變,gakki依然美膩~
Rotate類
im.rotate(angle) ⇒ image
im.rotate(angle,filter=NEAREST, expand=0) ⇒ image
返回一個按照給定角度順時鐘圍繞影象中心旋轉後的影象拷貝。變數filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略該變數,或者影象模式為“1”或者“P”,則預設為NEAREST。變數expand,如果為true,表示輸出影象足夠大,可以裝載旋轉後的影象。如果為false或者預設,則輸出影象與輸入影象尺寸一樣大。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
im_45 = im.rotate(45)
im_30 = im.rotate(30, Image.NEAREST,1)
print(im_45.size,im_30.size)
im_45.show()
im_30.show()
Seek類
im.seek(frame)
在給定的檔案序列中查詢指定的幀。如果查詢超越了序列的末尾,則產生一個EOFError異常。當檔案序列被開啟時,PIL庫自動指定到第0幀上。
@zhangziju
from PIL import Image
im_gif = Image.open("E:\mywife.gif")
print(im_gif.mode)
im_gif.show() ##第0幀
im_gif.seek(3)
im_gif.show()
im_gif.seek(9)
im_gif.show()
來來來~這是gakki原圖欣賞下~
查詢幀seek()的效果如下:
Tell類
im.tell() ⇒ integer
返回當前幀所處位置,從0開始計算。
@zhangziju
from PIL import Image
im_gif = Image.open("E:\mywife.gif")
print(im_gif.tell())
im_gif.seek(8)
print(im_gif.tell())
Thumbnail類
im.thumbnail(size)
im.thumbnail(size, filter)
修改當前影象,使其包含一個自身的縮圖,該縮圖尺寸不大於給定的尺寸。這個方法會計算一個合適的縮圖尺寸,使其符合當前影象的寬高比,呼叫方法draft()配置檔案讀取器,最後改變影象的尺寸。變數filter應該是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果省略該變數,則預設為NEAREST。注意:在當前PIL的版本中,濾波器bilinear和bicubic不能很好地適應縮圖產生。使用者應該使用ANTIALIAS,影象質量最好。如果處理速度比影象質量更重要,可以選用其他濾波器。這個方法在原圖上進行修改。如果使用者不想修改原圖,可以使用方法copy()拷貝一個影象。這個方法返回空。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
im.thumbnail((100,100))
Transform類
im.transform(size,method, data) ⇒ image
im.transform(size, method, data, filter) ⇒ image
使用給定的尺寸生成一張新的影象,與原圖有相同的模式,使用給定的轉換方式將原圖資料拷貝到新的影象中。在當前的PIL版本中,引數method為EXTENT(裁剪出一個矩形區域),AFFINE(仿射變換),QUAD(將正方形轉換為矩形),MESH(一個操作對映多個正方形)或者PERSPECTIVE。變數filter定義了對原始影象中畫素的濾波器。在當前的版本中,變數filter為NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者影象模式為“1”或者“P”,該變數設定為NEAREST。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.size)
imtra = im.transform((200, 200), Image.EXTENT, (0, 0, 500, 500))
print(imtra.size)
imtra.show()
im.transform(size,EXTENT, data) ⇒ image
im.transform(size, EXTENT, data, filter) ⇒ image
從影象中裁剪一個區域。變數data為指定輸入影象中兩個座標點的4元組(x0,y0,x1,y1)。輸出影象為這兩個座標點之間畫素的取樣結果。例如,如果輸入影象的(x0,y0)為輸出影象的(0,0)點,(x1,y1)則與變數size一樣。這個方法可以用於在當前影象中裁剪,放大,縮小或者映象一個任意的長方形。它比方法crop()稍慢,但是與resize操作一樣快。
im.transform(size, AFFINE, data) ⇒ image
im.transform(size, AFFINE,data, filter) ⇒ image
對當前的影象進行仿射變換,變換結果體現在給定尺寸的新影象中。變數data是一個6元組(a,b,c,d,e,f),包含一個仿射變換矩陣的第一個兩行。輸出影象中的每一個畫素(x,y),新值由輸入影象的位置(ax+by+c, dx+ey+f)的畫素產生,使用最接近的畫素進行近似。這個方法用於原始影象的縮放、轉換、旋轉和裁剪。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.size)
imtra = im.transform((200, 200), Image.AFFINE, (1,2,3,2,1,4))
print(imtra.size)
imtra.show()
im.transform(size,QUAD, data) ⇒ image
im.transform(size, QUAD, data, filter) ⇒ image
輸入影象的一個四邊形(通過四個角定義的區域)對映到給定尺寸的長方形。變數data是一個8元組(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四邊形的左上,左下,右下和右上四個角。
@zhangziju
from PIL import Image
im = Image.open("E:\mywife.jpg")
print(im.size)
imtra = im.transform((200, 200), Image.QUAD, (0,0,0,500,600,500,600,0))
print(imtra.size)
imtra.show()
im.transform(size,PERSPECTIVE, data) ⇒ image
im.transform(size, PERSPECTIVE, data, filter) ⇒ image
對當前影象進行透視變換,產生給定尺寸的新影象。變數data是一個8元組(a,b,c,d,e,f,g,h),包括一個透視變換的係數。對於輸出影象中的