1. 程式人生 > >【筆記】PIL 中的 Image 模塊

【筆記】PIL 中的 Image 模塊

字符串 camera eva 透明度 line 傳遞 濾波 將不 pad

Image 模塊提供了一個同名類(Image),也提供了一些工廠函數,包括從文件中載入圖片和創建新圖片。例如,以下的腳本先載入一幅圖片,將它旋轉 45 度角,並顯示出來:

1 >>>from PIL import Image
2 >>>im = Image.open("j.jpg")
3 >>>im.rotate(45).show()

下面這個腳本則創建了當前目錄下所有以 .jpg 結尾的圖片的縮略圖。

技術分享Create thumbnail

Image 類中的函數

0. new : 這個函數創建一幅給定模式(mode)和尺寸(size)的圖片。如果省略 color 參數,則創建的圖片被黑色填充滿,如果 color 參數是 None 值,則圖片還沒初始化。

技術分享new

1. open : 打開並識別所提供的圖像文件。不過,使用這函數的時候,真正的圖像數據在你進行數據處理之前並沒有被讀取出來。可使用 load 函數進行強制加載。 mode 參數可以省略,但它只能是 "r" 值。

技術分享open

2. blend : 使用兩幅給出的圖片和一個常量 alpha 創建新的圖片。兩幅圖片必須是同樣的 size 和 mode 。

技術分享blend

3. composite : 使用兩幅給出的圖片和一個與 alpha 參數相似用法的 mask 參數,其值可為:"1", "L", "RGBA" 。兩幅圖片的 size 必須相同。

技術分享composite

4. eval : 使用帶一個參數的函數作用於給定圖片的每一個像素。如果給定的圖片有超過一個的 頻段(band),則該函數也會作用於每一個頻段。註意,該函數是每一個像素計算一次,所以不能使用一些隨機組件或其他的生成器。

技術分享eval

5. frombuffer : (PIL 1.1.4 中新添加的)使用標準 "raw" 解碼器在像素數據或是對象緩存中創建一個圖像副本。不是所有的模式都支持這種用法。支持的 mode 有"L", "RGBX", "RGBA", "CMYK"。

技術分享frombuffer

6. fromstring : 註意,這個函數只對像素數據進行解碼,而不是一整張圖片。如果你有一整張字符串格式的圖片,使用 StringIO 對其進行包裝並用 open 函數載入它。

技術分享fromstring

7. merge : 使用一系列單一頻段(band)的圖像來創建新的一幅圖像。頻段是以一些圖像組成的元組或列表,所有的 band 必須有相同大小的 size 。

技術分享merge

Image 類中的方法

0. convert : 返回一個轉換後的圖像的副本。

技術分享convert

下面是一個例子:轉換 RGB 為 XYZ 。

技術分享RGB2XYZ

1. copy : 復制圖像。如果你希望粘貼一些東西進圖像裏面的話可以使用這個方法,但仍然會保留原圖像。

技術分享copy

2. crop : 返回圖像某個給定區域。box 是一個 4 元素元組,定義了 left, upper, right, lower 像素坐標。使用這個方法的時候,如果改變原始圖像,可能會,也可能不會改變裁剪生成的圖像。創建一個完全的復制,裁剪復制的時候使用 load 方法。

技術分享crop

3. draft : 按給出的 mode 和 size 進行配置。可以使用這個方法將彩色JPEG圖片轉為灰度圖。

技術分享draft

4. filter : 返回圖像使用濾波器後的副本。可以看 這裏 獲取更多有用的濾波器。

技術分享filter

5. fromstring : 和前面的函數是一樣的功能,不過這個方法是將數據載入到當前圖像。

技術分享fromstring

6. getbands : 返回一個元組,包含每一個 band 的名字,比如,在一幅 RGB 格式的圖像上使用 getbands 則返回("R", "G", "B")。

技術分享getbands

7. getbbox : 計算圖像邊框值,返回一個 4-元組 ,值為(左,上,右,下)。

技術分享getbbox

8. 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。

技術分享getcolors

9. getdata : 返回一個圖像內容的像素值序列。不過,這個返回值是 PIL 內部的數據類型,只支持確切的序列操作符,包括叠代器和基本序列方法。我們可以通過 list(im.getdata()) 為其生成普通的序列。

技術分享getdata

10. getextrema : 返回一個 2-元組 ,值為圖像的最小最大值。在當前PIL版本中,僅支持單一頻段(single-band)的圖像。

技術分享getextreme

11. getpixel : 返回指定位置的像素,如果所打開的圖像是多層次的圖片,那這個方法就返回一個元組。

技術分享getpixel

12. histogram : 返回圖像直方圖,值為像素計數組成的列表。如果有參數 mask ,則返回圖像所有部分的直方圖。

技術分享histogram

13. load : 版本 1.1.6 新添加的。load 返回對象的像素值,可以用來修改像素值。

技術分享load

14. paste : 1). 粘貼新圖片至圖片中,box 參數可以為 2-元組(upper, left)或是 4-元組(left, upper, right, lower),或者是 None(0, 0)。2). 功能同上。不過是將指定位置填充為某種顏色。

技術分享paste

15. 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 模塊