本篇包含:一、Image類的屬性:1、Format 2、Mode 3、Size 4、Palette 5、Info
二、類的函數:1、New 2、Open 3、Blend 4、Composite 5、Eval 6、Frombuffer 7、Fromstring 8、Merge
三、Image類的方法:1、Convert 2、Copy 3、Crop 4、Draft 5、Filter 6、Fromstring 7、Getbands 8、Getbbox 9、Getcolors
10、Getdata 1 1、 Getextrema 12、Getpixel 13、Histogram 14、Load 15、Paste
一、PIL的基本概念:
PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、坐標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。
1、 通道
每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。
以RGB圖像為例,每張圖片都是由三個數據通道構成,分別為R、G和B通道。而對於灰度圖像,則只有一個通道。
對於一張圖片的通道數量和名稱,可以通過方法getbands()來獲取。方法getbands()是Image模塊的方法,它會返回一個字符串元組(tuple)。該元組將包括每一個通道的名稱。
Python的元組與列表類似,不同之處在於元組的元素不能修改,元組使用小括號,列表使用方括號,元組創建很簡單,只需要在括號中添加元素,並使用逗號隔開即可。
方法getbands()的使用如下:
from PIL import Image
im = Image.open("xiao.png")
print(im.getbands())
輸出:
('R', 'G', 'B')
2、 模式
圖像的模式定義了圖像的類型和像素的位寬。當前支持如下模式:
1:1位像素,表示黑和白,但是存儲的時候每個像素存儲為8bit。
L:8位像素,表示黑和白。
P:8位像素,使用調色板映射到其他模式。
RGB:3x8位像素,為真彩色。
RGBA:4x8位像素,有透明通道的真彩色。
CMYK:4x8位像素,顏色分離。
YCbCr:3x8位像素,彩色視頻格式。
I:32位整型像素。
F:32位浮點型像素。
PIL也支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)。
可以通過mode屬性讀取圖像的模式。其返回值是包括上述模式的字符串。
屬性mode的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.mode) 輸出: 'RGB'
3、 尺寸
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
屬性mode的使用如下:
from PIL import Image im = Image.open("xiao.png") print(im.size) 輸出:
(670, 502)
4、 坐標系統
PIL使用笛卡爾像素坐標系統,坐標(0,0)位於左上角。注意:坐標值表示像素的角;位於坐標(0,0)處的像素的中心實際上位於(0.5,0.5)。
坐標經常用於二元組(x,y)。長方形則表示為四元組,前面是左上角坐標。例如,一個覆蓋800x600的像素圖像的長方形表示為(0,0,800,600)。
5、 調色板
調色板模式 ("P")使用一個顏色調色板為每個像素定義具體的顏色值
6、 信息
使用info屬性可以為一張圖片添加一些輔助信息。這個是字典對象。加載和保存圖像文件時,多少信息需要處理取決於文件格式。
屬性info的使用如下:
from PIL import Image
im = Image.open("xiao.png") print(im.info)
輸出:
{}
7、 濾波器
對於將多個輸入像素映射為一個輸出像素的幾何操作,PIL提供了4個不同的采樣濾波器:
NEAREST:最近濾波。從輸入圖像中選取最近的像素作為輸出像素。它忽略了所有其他的像素。 BILINEAR:雙線性濾波。在輸入圖像的2x2矩陣上進行線性插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。 BICUBIC:雙立方濾波。在輸入圖像的4x4矩陣上進行立方插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。 ANTIALIAS:平滑濾波。這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重采樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。 注意:在當前的PIL版本中,ANTIALIAS濾波器是下采樣(例如,將一個大的圖像轉換為小圖)時唯一正確的濾波器。BILIEAR和BICUBIC濾波器使用固定的輸入模板,用於固定比例的幾何變換和上采樣是最好的。
Image模塊中的方法resize()和thumbnail()用到了濾波器。
方法resize()的使用如下:
方法resize()的定義為:resize(size, filter=None)=> image
from PIL import Image im = Image.open("xiao.png") print(im.size)
im_resize = im.resize((256,256))
print(im_resize.size)
輸出:
(670, 502)
(256,256)
對參數filter不賦值的話,方法resize()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
from PIL import Image im = Image.open("xiao.png") print(im.size) im_resize0 = im.resize((256,256), Image.BILINEAR) print(im_resize0.size)
im_resize1 = im.resize((256,256), Image.BICUBIC) print(im_resize1.size)
im_resize2 = im.resize((256,256), Image.ANTIALIAS) print(im_resize2.size) 輸出:
(670, 502)
(256,256)
(256,256)
(256,256)
二、Image模塊:
Image模塊是PIL中最重要的模塊,它有一個類叫做image,與模塊名稱相同。Image類有很多函數、方法及屬性,接下來將依次對image類的屬性、函數和方法進行介紹。
一、Image類的屬性
1、 Format
定義:im.format ⇒ string or None 含義:源文件的文件格式。如果是由PIL創建的圖像,則其文件格式為None。 例子: from PIL import Image im= Image.open("xiao.png") print(im.format) 輸出: 'png'
2、 Mode
定義:im.mode ⇒ string
含義:圖像的模式。這個字符串表明圖像所使用像素格式。該屬性典型的取值為“1”,“L”,“RGB”或“CMYK”。
3、 Size
定義:im.size ⇒ (width, height)
含義:圖像的尺寸,按照像素數計算。它的返回值為寬度和高度的二元組(width, height)。
4、 Palette
定義:im.palette ⇒ palette or None 含義:顏色調色板表格。如果圖像的模式是“P”,則返回ImagePalette類的實例;否則,將為None。 例子: from PIL import Image im = Image.open("jing.jpg") print(im.mode) print(im.palette) 輸出: RGB None
5、 Info
定義:im.info ⇒ dictionary
含義:存儲圖像相關數據的字典。文件句柄使用該字典傳遞從文件中讀取的各種非圖像信息。大多數方法在返回新的圖像時都會忽略這個字典;因為字典中的鍵並非標准化的,對於一個方法,它不能知道自己的操作如何影響這個字典。
如果用戶需要這些信息,需要在方法open()返回時保存這個字典。
二、類的函數:
1、 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。
這對向該圖像復制或繪制某些內容是有用的。 例子: from PIL import Image im= Image.new("RGB", (128, 128), "#FF0000") im.save("test1.png") #圖像im為128x128大小的紅色圖像。 im= Image.new("RGB", (128, 128)) #圖像im為128x128大小的黑色圖像,因為變量color不賦值的話,圖像內容被設置為0,即黑色。 im.save("test2.png")
im= Image.new("RGB", (128, 128), "red") #圖像im為128x128大小的紅色圖像。
im.save("test3.png")
2、 Open
定義:Image.open(file) ⇒ image Image.open(file, mode) ⇒ image 含義:打開並確認給定的圖像文件。這個是一個懶操作;該函數只會讀文件頭,而真實的圖像數據直到試圖處理該數據才會從文件讀取(調用load()方法將強行加載圖像數據)。如果變量mode被設置,那必須是“r”。 用戶可以使用一個字符串(表示文件名稱的字符串)或者文件對象作為變量file的值。文件對象必須實現read(),seek()和tell()方法,並且以二進制模式打開。 例子: from PIL import Image im = Image.open("xiao.png")
3、 Blend
定義:Image.blend(image1,image2, alpha) ⇒ image 含義:使用給定的兩張圖像及透明度變量alpha,插值出一張新的圖像。這兩張圖像必須有一樣的尺寸和模式。 合成公式為:out = image1 *(1.0 - alpha) + image2 * alpha 如果變量alpha為0.0,將返回第一張圖像的拷貝。如果變量alpha為1.0,將返回第二張圖像的拷貝。對變量alpha的值沒有限制。 例子: from PIL import Image im1 = Image.open("jing.jpg") im2 = Image.open("wu.jpg") im = Image.blend(im1,im2,0.5) im.save("he.jpg")
4、 Composite
定義:Image.composite(image1,image2, mask) ⇒ image 含義:使用給定的兩張圖像及mask圖像作為透明度,插值出一張新的圖像。變量mask圖像的模式可以為“1”,“L”或者“RGBA”。所有圖像必須有相同的尺寸。 例子: from PIL import Image im1 = Image.open("jing.jpg") im2 = Image.open("wu.jpg") r,g,b = im1.split() print(g.mode) im = Image.composite(im1,im2,b) im.save("he.jpg") b.save("he1.jpg")
5、 Eval
定義:Image.eval(image,function) ⇒ image 含義:使用變量function對應的函數(該函數應該有一個參數)處理變量image所代表圖像中的每一個像素點。如果變量image所代表圖像有多個通道,那變量function對應的函數作用於每一個通道。 注意:變量function對每個像素只處理一次,所以不能使用隨機組件和其他生成器。 例子: from PIL import Image im = Image.open("jing.jpg") def deffun(c): return c*0.89 #改變了亮度 im_eval = Image.eval(im,deffun) im_eval.save("gai.jpg")
注:圖像im_eval與im01比較,其像素值均為im01的一半,則其亮度自然也會比im01暗一些。
6、 Frombuffer
定義:Image.frombuffer(mode,size, data) ⇒ image Image.frombuffer(mode, size,data, decoder, parameters) ⇒ image 含義:(New in PIL 1.1.4)使用標准的“raw”解碼器,從字符串或者buffer對象中的像素數據產生一個圖像存儲。對於一些模式,這個圖像存儲與原始的buffer(這意味着對原始buffer對象的改變體現在圖像本身)共享內存。
並非所有的模式都可以共享內存;支持的模式有“L”,“RGBX”,“RGBA”和“CMYK”。對於其他模式,這個函數與fromstring()函數一致。 注意:版本1.1.6及其以下,這個函數的默認情況與函數fromstring()不同。這有可能在將來的版本中改變,所以為了最大的可移植性,當使用“raw”解碼器時,推薦用戶寫出所有的參數,如下所示: im =Image.frombuffer(mode, size, data, "raw", mode, 0, 1) 函數Image.frombuffer(mode,size, data, decoder, parameters)與函數fromstring()的調用一致。
7、 Fromstring
定義:Image.fromstring(mode,size, data) ⇒ image
Image.fromstring(mode, size,data, decoder, parameters) ⇒ image
含義:函數Image.fromstring(mode,size, data),使用標准的“raw”解碼器,從字符串中的像素數據產生一個圖像存儲。
函數Image.fromstring(mode,size, data, decoder, parameters)也一樣,但是允許用戶使用PIL支持的任何像素解碼器。更多信息可以參考:Writing YourOwn File Decoder.
注意:這個函數只對像素數據進行解碼,而不是整個圖像。如果用戶的字符串包含整個圖像,可以將該字符串包裹在StringIO對象中,使用函數open()來加載。
8、 Merge
定義:Image.merge(mode,bands) ⇒ image 含義:使用一些單通道圖像,創建一個新的圖像。變量bands為一個圖像的元組或者列表,每個通道的模式由變量mode描述。所有通道必須有相同的尺寸。 變量mode與變量bands的關系: len(ImageMode.getmode(mode).bands)= len(bands) 例子: from PIL import Image im1 = Image.open("jing.jpg") im2 = Image.open("wu.jpg") r1,g1,b1 = im1.split() r2,g2,b2 = im2.split() imgs =[r1,g2,b2] im_merge = Image.merge("RGB",imgs) im_merge.save("he.jpg")
三、Image類的方法
除非另作說明,Image類的所有方法都將返回一個Image類的新實例,這個實例對應於結果圖像。
1、 Convert
定義1:im.convert(mode)⇒ image 含義1:將當前圖像轉換為其他模式,並且返回新的圖像。 當從一個調色板圖像轉換時,這個方法通過這個調色板來轉換像素。如果不對變量mode賦值,該方法將會選擇一種模式,在沒有調色板的情況下,使得圖像和調色板中的所有信息都可以被表示出來。 當從一個顏色圖像轉換為黑白圖像時,PIL庫使用ITU-R601-2 luma轉換公式: L = R * 299/1000 + G * 587/1000 + B * 114/1000 當轉換為2位圖像(模式“1”)時,源圖像首先被轉換為黑白圖像。結果數據中大於127的值被設置為白色,其他的設置為黑色;這樣圖像會出現抖動。如果要使用其他閾值,更改閾值127,可以使用方法point()。
為了去掉圖像抖動現象,可以使用dither選項。
例子1: from PIL import Image im1 = Image.open("jing.jpg") print(im1.mode) im_c = im1.convert("1") im_c.save("he.jpg") print(im_c.mode) 輸出:
1 注:將“RGB”模式的im01圖像,轉換為“1”模式的im_c圖像。 定義2:im.convert(“P”,**options) ⇒ image 含義2:這個與第一個方法定義一樣,但是當“RGB”圖像轉換為8位調色板圖像時能更好的處理。可供選擇的選項為: Dither=. 控制顏色抖動。默認是FLOYDSTEINBERG,與鄰近的像素一起承擔錯誤。不使能該功能,則賦值為NONE。 Palette=. 控制調色板的產生。默認是WEB,這是標准的216色的“web palette”。要使用優化的調色板,則賦值為ADAPTIVE。 Colors=. 當選項palette為ADAPTIVE時,控制用於調色板的顏色數目。默認是最大值,即256種顏色。 定義3:im.convert(mode,matrix) ⇒ image 含義3:使用轉換矩陣將一個“RGB”圖像轉換為“L”或者“RGB”圖像。變量matrix為4或者16元組。 例子3:下面的例子將一個RGB圖像(根據ITU-R709線性校准,使用D65亮度)轉換到CIE XYZ顏色空間: from PIL import Image im1 = Image.open("jing.jpg") im1.mode rgb2xyz = ( 0.412453, 0.357580, 0.180423, 0, 0.212671, 0.715160, 0.072169, 0, 0.019334, 0.119193, 0.950227, 0 ) im_c3 = im1.convert("L", rgb2xyz) im_c3.save("he.jpg") print(im_c3.mode)
輸出:
L
2、 Copy
定義:im.copy() ⇒ image 含義:拷貝這個圖像。如果用戶想粘貼一些數據到這張圖,可以使用這個方法,但是原始圖像不會受到影響。 例子: from PIL import Image im1 = Image.open("jing.jpg") im2 = im1.copy() im2.save("he.jpg") 注:圖像im_copy和im01完全一樣。
3、 Crop
定義:im.crop(box) ⇒ image 含義:從當前的圖像中返回一個矩形區域的拷貝。變量box是一個四元組,定義了左、上、右和下的像素坐標。 這是一個懶操作。對源圖像的改變可能或者可能不體現在裁減下來的圖像中。為了獲取一個分離的拷貝,對裁剪的拷貝調用方法load()。 例子: from PIL import Image im1 = Image.open("jing.jpg") print(im1.size) box = [0,0,650,400] #650(長)400(高) im_crop = im1.crop(box) im_crop.save("he.jpg")
4、 Draft
定義:im.draft(mode,size) 含義:配置圖像文件加載器,使得返回一個與給定的模式和尺寸盡可能匹配的圖像的版本。例如,用戶可以使用這個方法,在加載一個彩色JPEG圖像時將其轉換為灰色圖像,或者從一個PCD文件中提取一個128x192的版本。 注意:這個方法會適時地修改圖像對象(精確地說,它會重新配置文件的讀取器)。如果圖像已經被加載,那這個方法就沒有作用了。 例子: from PIL import Image im1 = Image.open("jing.jpg") im_draft = im1.draft("L",(500,500)) print(im_draft.size) im_draft.save("he.jpg") 輸出: (650, 650)
5、 Filter
定義:im.filter(filter) ⇒ image 含義:返回一個使用給定濾波器處理過的圖像的拷貝。可用濾波器需要參考ImageFilter模塊。 例子: from PIL import Image,ImageFilter im1 = Image.open("jing.jpg") im_filter = im1.filter(ImageFilter.BLUR) im_filter.save("he.jpg") 注:圖像im_filter比im01變得有些模糊了。
6、 Fromstring
定義:im.fromstring(data)
im.fromstring(data, decoder,parameters)
含義:與函數fromstring()一樣,但是這個方法會將data加載到當前的圖像中。
7、 Getbands
定義:im.getbands()⇒ tuple of strings
含義:返回包括每個通道名稱的元組。例如,對於RGB圖像將返回(“R”,“G”,“B”)。
8、 Getbbox
定義:im.getbbox() ⇒ 4-tuple or None 含義:計算圖像非零區域的包圍盒。這個包圍盒是一個4元組,定義了左、上、右和下像素坐標。如果圖像是空的,這個方法將返回空。 例子: from PIL import Image im1 = Image.open("jing.jpg") print(im1.getbbox()) 輸出: (0, 0, 650, 650)
9、 Getcolors
定義:im.getcolors() ⇒ a list of(count, color) tuples or None im.getcolors(maxcolors) ⇒ a list of (count, color) tuples or None 含義:(New in 1.1.5)返回一個(count,color)元組的無序list,其中count是對應顏色在圖像中出現的次數。 如果變量maxcolors的值被超過,該方法將停止計算並返回空。變量maxcolors默認值為256。為了保證用戶可以獲取圖像中的所有顏色,you can pass in size[0]*size[1](請確保有足夠的內存做這件事)。 例子: from PIL import Image im1 = Image.open("test.png") print(im1.getcolors(8888888))
輸出:
[(2, (255, 255, 255, 233)), (9, (0, 0, 0, 136)), (1, (0, 0, 0, 64)), (2, (0, 0, 0, 24)), (5, (0, 0, 0, 56)).......
10、 Getdata
定義:im.getdata() ⇒ sequence 含義:以包含像素值的sequence對象形式返回圖像的內容。這個sequence對象是扁平的,以便第一行的值直接跟在第零行的值后面,等等。 注意:這個方法返回的sequence對象是PIL內部數據類型,它只支持某些sequence操作,包括迭代和基礎sequence訪問。使用list(im.getdata()),將它轉換為普通的sequence。 例子: from PIL import Image im1 = Image.open("jing.jpg") seq = im1.getdata() print(seq[0]) seq0 = list(seq) print(seq0[0]) print(len(seq0)) 輸出: (41, 183, 197) (41, 183, 197) 422500 #這個值是長和高之積 注:Sequence對象的每一個元素對應一個像素點的R、G和B三個值。
11、 Getextrema
定義:im.getextrema() ⇒ 2-tuple 含義:返回一個2元組,包括該圖像中的最小和最大值。 例子: from PIL import Image im1 = Image.open("jing.jpg") print(im1.getextrema()) 輸出: ((0, 255), (0,255), (0, 255)) 該方法返回了R/G/B三個通道的最小和最大值的2元組。
12、 Getpixel
定義:im.getpixel(xy) ⇒ value or tuple 含義:返回給定位置的像素值。如果圖像為多通道,則返回一個元組。 注意:該方法執行比較慢;如果用戶需要使用python處理圖像中較大部分數據,可以使用像素訪問對象(見load),或者方法getdata()。 例子: from PIL import Image im1 = Image.open("jing.jpg") print(im1.getpixel((1,1))) print(im1.getpixel((649,649))) 輸出: (41, 183, 197) (236, 210, 153)
注:im.getpixel(xy)中的X,Y表示坐標,從0開始。
13、 Histogram
定義1:im.histogram()⇒ list 含義1:返回一個圖像的直方圖。這個直方圖是關於像素數量的list,圖像中的每個象素值對應一個成員。如果圖像有多個通道,所有通道的直方圖會連接起來(例如,“RGB”圖像的直方圖有768個值)。 二值圖像(模式為“1”)當作灰度圖像(模式為“L”)處理。 例子1: from PIL import Image im1 = Image.open("jing.jpg") ls = im1.histogram() print(len(ls)) print(ls[767]) 輸出: 768 1471
14、 Load
定義:im.load() 含義:為圖像分配內存並從文件中加載它(或者從源圖像,對於懶操作)。正常情況下,用戶不需要調用這個方法,因為在第一次訪問圖像時,Image類會自動地加載打開的圖像。 (New in 1.1.6)在1.1.6及以后的版本,方法load()返回一個用於讀取和修改像素的像素訪問對象。這個訪問對象像一個二維隊列,如: pix = im.load() print pix[x, y] pix[x, y] =value 通過這個對象訪問比方法getpixel()和putpixel()快很多。 例子: from PIL import Image im1 = Image.open("jing.jpg") lm_load = im1.load() print(lm_load[649,649]) 輸出: (236, 210, 153)
15、 Paste
定義1:im.paste(image,box) 含義1:將一張圖粘貼到另一張圖像上。變量box或者是一個給定左上角的2元組,或者是定義了左,上,右和下像素坐標的4元組,或者為空(與(0,0)一樣)。如果給定4元組,被粘貼的圖像的尺寸必須與區域尺寸一樣。 如果模式不匹配,被粘貼的圖像將被轉換為當前圖像的模式。 例子1: from PIL import Image im1 = Image.open("jing.jpg") box = [0,0,200,200] im_crop = im1.crop(box) im1.paste(im_crop,(200,200,400,400)) #等價於im1.paste(im_crop,(200,200)) im1.save("he.jpg") 定義2:im.paste(colour,box) 含義2:它與定義1一樣,但是它使用同一種顏色填充變量box對應的區域。對於單通道圖像,變量colour為單個顏色值;對於多通道,則為一個元組。 例子2: from PIL import Image im1 = Image.open("jing.jpg") im1.paste((256,256,256),(200,100,500,200)) im1.save("he.jpg") 注:圖像im1的(200,100)位置將出現一個300x100的白色方塊,對於多通道的圖像,如果變量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 im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste(im_crop,(200,100,300,200),b) im1.save("he.jpg") 注:在圖像im1的(0,0)位置將出現一個半透明的100x100的方塊。 定義4:im.paste(colour,box, mask) 含義4:與定義3一樣,只是使用變量colour對應的單色來填充區域。
例子4: from PIL import Image im1 = Image.open("jing.jpg") box = [100,100,200,200] im_crop = im1.crop(box) r,g,b = im_crop.split() im1.paste((0,256,0),(200,100,300,200),b) im1.save("he.jpg") 注:在圖像im1的(0,0)位置將出現一個100x100的綠色方塊。