【筆記】PIL 中的 Image 模塊
Image 模塊提供了一個同名類(Image),也提供了一些工廠函數,包括從文件中載入圖片和創建新圖片。例如,以下的腳本先載入一幅圖片,將它旋轉 45 度角,並顯示出來:
1 >>>from PIL import Image2 >>>im = Image.open("j.jpg")
3 >>>im.rotate(45).show()
下面這個腳本則創建了當前目錄下所有以 .jpg 結尾的圖片的縮略圖。
Create thumbnailImage 類中的函數。
0. new : 這個函數創建一幅給定模式(mode)和尺寸(size)的圖片。如果省略 color 參數,則創建的圖片被黑色填充滿,如果 color 參數是 None 值,則圖片還沒初始化。
1. open : 打開並識別所提供的圖像文件。不過,使用這函數的時候,真正的圖像數據在你進行數據處理之前並沒有被讀取出來。可使用 load 函數進行強制加載。 mode 參數可以省略,但它只能是 "r" 值。
open2. blend : 使用兩幅給出的圖片和一個常量 alpha 創建新的圖片。兩幅圖片必須是同樣的 size 和 mode 。
blend3. composite : 使用兩幅給出的圖片和一個與 alpha 參數相似用法的 mask 參數,其值可為:"1", "L", "RGBA" 。兩幅圖片的 size 必須相同。
composite4. eval : 使用帶一個參數的函數作用於給定圖片的每一個像素。如果給定的圖片有超過一個的 頻段(band),則該函數也會作用於每一個頻段。註意,該函數是每一個像素計算一次,所以不能使用一些隨機組件或其他的生成器。
5. frombuffer : (PIL 1.1.4 中新添加的)使用標準 "raw" 解碼器在像素數據或是對象緩存中創建一個圖像副本。不是所有的模式都支持這種用法。支持的 mode 有"L", "RGBX", "RGBA", "CMYK"。
frombuffer6. fromstring : 註意,這個函數只對像素數據進行解碼,而不是一整張圖片。如果你有一整張字符串格式的圖片,使用 StringIO 對其進行包裝並用 open 函數載入它。
fromstring7. merge : 使用一系列單一頻段(band)的圖像來創建新的一幅圖像。頻段是以一些圖像組成的元組或列表,所有的 band 必須有相同大小的 size 。
Image 類中的方法:
0. convert : 返回一個轉換後的圖像的副本。
convert下面是一個例子:轉換 RGB 為 XYZ 。
RGB2XYZ1. copy : 復制圖像。如果你希望粘貼一些東西進圖像裏面的話可以使用這個方法,但仍然會保留原圖像。
copy2. crop : 返回圖像某個給定區域。box 是一個 4 元素元組,定義了 left, upper, right, lower 像素坐標。使用這個方法的時候,如果改變原始圖像,可能會,也可能不會改變裁剪生成的圖像。創建一個完全的復制,裁剪復制的時候使用 load 方法。
crop3. draft : 按給出的 mode 和 size 進行配置。可以使用這個方法將彩色JPEG圖片轉為灰度圖。
draft4. filter : 返回圖像使用濾波器後的副本。可以看 這裏 獲取更多有用的濾波器。
filter5. fromstring : 和前面的函數是一樣的功能,不過這個方法是將數據載入到當前圖像。
fromstring6. getbands : 返回一個元組,包含每一個 band 的名字,比如,在一幅 RGB 格式的圖像上使用 getbands 則返回("R", "G", "B")。
getbands7. getbbox : 計算圖像邊框值,返回一個 4-元組 ,值為(左,上,右,下)。
getbbox8. getcolors : 在 1.1.5 版本中新添加的。返回一個未排序列表,其元素是元組(count, color)。the count is the number of times the corresponding color occurs in the image 。If the maxcolors value is exceeded, the method stops counting and returns None。
getcolors9. getdata : 返回一個圖像內容的像素值序列。不過,這個返回值是 PIL 內部的數據類型,只支持確切的序列操作符,包括叠代器和基本序列方法。我們可以通過 list(im.getdata()) 為其生成普通的序列。
getdata10. getextrema : 返回一個 2-元組 ,值為圖像的最小最大值。在當前PIL版本中,僅支持單一頻段(single-band)的圖像。
getextreme11. getpixel : 返回指定位置的像素,如果所打開的圖像是多層次的圖片,那這個方法就返回一個元組。
getpixel12. histogram : 返回圖像直方圖,值為像素計數組成的列表。如果有參數 mask ,則返回圖像所有部分的直方圖。
histogram13. load : 版本 1.1.6 新添加的。load 返回對象的像素值,可以用來修改像素值。
load14. paste : 1). 粘貼新圖片至圖片中,box 參數可以為 2-元組(upper, left)或是 4-元組(left, upper, right, lower),或者是 None(0, 0)。2). 功能同上。不過是將指定位置填充為某種顏色。
paste15. point :
point------------
Python圖像處理庫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(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.getbands()
(‘R‘, ‘G‘, ‘B‘)
>>>im_bands = im.getbands()
>>>len(im_bands)
3
>>>print im_bands[0]
R
>>>print im_bands[1]
G
>>>print im_bands[2]
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 importImage
>>> im =Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>> im.mode
‘RGB‘
>>> md = im.mode
>>> print md
RGB
3、 尺寸
通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。
屬性mode的使用如下:
>>> from PIL importImage
>>> im =Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im_size = im.size
>>>print im_size[0]
800
>>>print im_size[1]
450
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(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>>im_info = im.info
>>>im_info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>>print im_info[‘jfif_version‘]
(1, 1)
>>>print im_info[‘jfif‘]
257
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(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im_resize = im.resize((256,256))
>>> im_resize.size
(256, 256)
對參數filter不賦值的話,方法resize()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
>>>im_resize0 = im.resize((256,256), Image.BILINEAR)
>>>im_resize0.size
(256, 256)
>>>im_resize1 = im.resize((256,256), Image.BICUBIC)
>>>im_resize1.size
(256, 256)
>>>im_resize2 = im.resize((256,256), Image.ANTIALIAS)
>>>im_resize2.size
(256, 256)
方法thumbnail ()的使用如下:
方法thumbnail ()的定義為:im.thumbnail(size, filter=None)
>>>from PIL import Image
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im.thumbnail((200,200))
>>>im.size
(200,112)
這裏需要說明的是,方法thumbnail()需要保持寬高比,對於size=(200,200)的輸入參數,其最終的縮略圖尺寸為(200, 112)。
對參數filter不賦值的話,方法thumbnail()默認使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現:
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200),Image.BILINEAR)
>>> im.size
(200, 112)
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200), Image.BICUBIC)
>>> im.size
(200, 112)
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200), Image.ANTIALIAS)
>>> im.size
(200, 112)
IMAGE模塊0x1
Image模塊是PIL中最重要的模塊,它有一個類叫做image,與模塊名稱相同。Image類有很多函數、方法及屬性,接下來將依次對image類的屬性、函數和方法進行介紹。
一、Image類的屬性
1、 Format
定義:im.format ? string or None
含義:源文件的文件格式。如果是由PIL創建的圖像,則其文件格式為None。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.format
‘JPEG‘
註:test.jpg是JPEG圖像,所以其文件格式為JPEG。
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>>im.format
‘GIF‘
註:test.gif為GIF文件,所以其文件格式為GIF。
2、 Mode
定義:im.mode ? string
含義:圖像的模式。這個字符串表明圖像所使用像素格式。該屬性典型的取值為“1”,“L”,“RGB”或“CMYK”。對於圖像模式的介紹,可以參考我的blog“Python圖像處理庫PIL的基本概念介紹”。
例子:
>>>from PIL import Image
>>> im = Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>> im.mode
‘RGB‘
>>> im = Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.mode
‘P‘
3、 Size
定義:im.size ? (width, height)
含義:圖像的尺寸,按照像素數計算。它的返回值為寬度和高度的二元組(width, height)。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.size
(800, 450)
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.size
(400, 220)
4、 Palette
定義:im.palette ? palette or None
含義:顏色調色板表格。如果圖像的模式是“P”,則返回ImagePalette類的實例;否則,將為None。
例子:
>>> from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>> im.mode
‘RGB‘
>>>im.palette
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.mode
‘P‘
>>>im.palette
<PIL.ImagePalette.ImagePaletteobject at 0x035E7AD0>
>>> pl= im.palette
Pl為ImagePalette類的實例。
5、 Info
定義:im.info ? dictionary
含義:存儲圖像相關數據的字典。文件句柄使用該字典傳遞從文件中讀取的各種非圖像信息。大多數方法在返回新的圖像時都會忽略這個字典;因為字典中的鍵並非標準化的,對於一個方法,它不能知道自己的操作如何影響這個字典。如果用戶需要這些信息,需要在方法open()返回時保存這個字典。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>>im.info
{‘duration‘:100, ‘version‘: ‘GIF89a‘, ‘extension‘: (‘NETSCAPE2.0‘, 795L), ‘background‘: 0,‘loop‘: 0}
IMAGE模塊0x1
二、Image類的函數
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.show()
圖像im為128x128大小的紅色圖像。
>>> im= Image.new("RGB", (128, 128))
>>>im.show()
圖像im為128x128大小的黑色圖像,因為變量color不賦值的話,圖像內容被設置為0,即黑色。
>>> im= Image.new("RGB", (128, 128), "red")
>>>im.show
圖像im為128x128大小的紅色圖像。
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("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.show()
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg", "r")
>>>im.show()
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
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>> im =Image.blend(im01, im02, 0.3)
>>> im.show()
Test01.jpg和test02.jpg兩張圖像size都為1024x768,mode為“RGB”。它們按照第一張70%的透明度,第二張30%的透明度,合成為一張。
4、 Composite
定義:Image.composite(image1,image2, mask) ? image
含義:使用給定的兩張圖像及mask圖像作為透明度,插值出一張新的圖像。變量mask圖像的模式可以為“1”,“L”或者“RGBA”。所有圖像必須有相同的尺寸。
例子:
>>>from PIL import Image
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>>r,g,b = im01.split()
>>> g.mode
‘L‘
>>> g.size
(1024, 768)
>>> im= Image.composite(im01, im02, g)
>>>im.show()
5、 Eval
定義:Image.eval(image,function) ? image
含義:使用變量function對應的函數(該函數應該有一個參數)處理變量image所代表圖像中的每一個像素點。如果變量image所代表圖像有多個通道,那變量function對應的函數作用於每一個通道。註意:變量function對每個像素只處理一次,所以不能使用隨機組件和其他生成器。
例子:
>>>from PIL import Image
>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> deffun(x):
return x * 0.5
>>>im_eval = Image.eval(im01, fun)
>>>im_eval.show()
>>>im01.show()
圖像im01如下圖:
圖像im_eval如下圖:
圖像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
>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im02 = Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>>r1,g1,b1 = im01.split()
>>>r2,g2,b2 = im02.split()
>>>r1.mode
‘L‘
>>>r1.size
(1024, 768)
>>>g1.mode
‘L‘
>>>g1.size
(1024, 768)
>>>r2.mode
‘L‘
>>>g2.size
(1024, 768)
>>>imgs=[r1,g2,b2]
>>>len(ImageMode.getmode("RGB").bands)
3
>>>len(imgs)
3
>>>im_merge = Image.merge("RGB", imgs)
>>>im_merge.show()
圖像im_merge如下所示:
IMAGE模塊0x1
【筆記】PIL 中的 Image 模塊