天天看點

python pil_python中PIL子產品

Image子產品

Image子產品是在Python PIL圖像進行中常見的子產品,對圖像進行基礎操作的功能基本都包含于此子產品内。如open、save、conver、show…等功能。

open類

Image.open(file) ⇒ image

Image.open(file, mode) ⇒ image

要從檔案加載圖像,使用 open() 函數, 在 Image 子產品:

from PIL import Image ##調用庫

im = Image.open("E:\mywife.jpg") ##檔案存在的路徑

im.show()

Save類

im.save(outfile,options…)

im.save(outfile, format, options…)

若要儲存檔案,則使用 Image 類的 save() 方法,此時儲存檔案的檔案名就變得十分重要了,除非指定格式,否則這個庫将會以檔案名的擴充名作為格式儲存。使用給定的檔案名儲存圖像。如果變量format預設,如果可能的話,則從檔案名稱的擴充名判斷檔案的格式。該方法傳回為空。關鍵字options為檔案編寫器提供一些額外的指令。如果編寫器不能識别某個選項,它将忽略它。使用者可以使用檔案對象代替檔案名稱。在這種情況下,使用者必須指定檔案格式。檔案對象必須實作了seek()、tell()和write()方法,且其以二進制模式打開。如果方法save()因為某些原因失敗,這個方法将産生一個異常(通常為IOError異常)。如果發生了異常,該方法也有可能已經建立了檔案,并向檔案寫入了一些資料。如果需要的話,使用者的應用程式可以删除這個不完整的檔案。

from PIL import Image

im = Image.open("D:\mywife.jpg")

print(im)

im.save("D:\mywife.png") # 将"E:\mywife.jpg"儲存為"D:\mywife.png"

im = Image.open("D:\mywife.png") ##打開新的png圖檔

print(im.format, im.size, im.mode)

format類

這個屬性辨別了圖像來源,如果圖像不是從檔案讀取它的值就是None。

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.format) ## 列印出格式資訊

im.show()

Mode類

圖像的模式,常見的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位浮點型像素

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.mode) ## 列印出模式資訊

im.show()

convert類

将目前圖像轉換為其他模式,并且傳回新的圖像。當從一個調色闆圖像轉換時,這個方法通過這個調色闆來轉換像素。如果不對變量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()

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)。

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.size) ## 列印出尺寸資訊

im.show()

Palette類

顔色調色闆表格。如果圖像的模式是“P”,則傳回ImagePalette類的執行個體;否則,将為None。

如下為對非“P”模式下的圖像進行palette資訊顯示。

from PIL import Image

im = Image.open("E:\mywife.jpg")

print(im.palette)

對圖像進行convert操作,轉換成“P”模式

from PIL import Image

im = Image.open("E:\mywife.jpg")

new_im = im.convert('P')

print(new_im.mode)

print(new_im.palette)

Info類

存儲圖像相關資料的字典。檔案句柄使用該字典傳遞從檔案中讀取的各種非圖像資訊。大多數方法在傳回新的圖像時都會忽略這個字典;因為字典中的鍵并非标準化的,對于一個方法,它不能知道自己的操作如何影響這個字典。如果使用者需要這些資訊,需要在方法open()傳回時儲存這個字典。

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大小的紅色圖像。

from PIL import Image

im = Image.open("E:\mywife.jpg")

n_im= Image.new("RGB", (128, 128), "#FF0000")

n_im.show()

如下圖像為128x128大小的黑色圖像,因為變量color不指派的話,圖像内容被設定為0,即黑色。

from PIL import Image

im = Image.open("E:\mywife.jpg")

n_im= Image.new("RGB", (128, 128))

n_im.show()

Copy類

拷貝這個圖像。如果使用者想粘貼一些資料到這張圖,可以使用這個方法,但是原始圖像不會受到影響。

from PIL import Image

im = Image.open("E:\mywife.jpg")

im_copy = im.copy()

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()

Paste類

im.paste(image,box)

将一張圖粘貼到另一張圖像上。變量box或者是一個給定左上角的2元組,或者是定義了左,上,右和下像素坐标的4元組,或者為空(與(0,0)一樣)。如果給定4元組,被粘貼的圖像的尺寸必須與區域尺寸一樣。如果模式不比對,被粘貼的圖像将被轉換為目前圖像的模式。

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()

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邊緣檢測,使用該子產品時,需先導入。

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()

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

im = Image.open("jing.png")

im_point = im.point(lambda x:x*1.3+5)

im_point.save("he.png")

注:圖像im_point_fun比原圖im01亮度增加了很多;因為lambda表達式中對原圖的每個像素點的值都做了增加操作。

定義2:

im.point(table,mode) ⇒ image

im.point(function, mode) ⇒ image

含義2:與定義1一樣,但是它會為輸出圖像指定一個新的模式。這個方法可以一步将模式為“L”和“P”的圖像轉換為模式為“1”的圖像。

例子2:

from PIL import Image

im = Image.open("jing.png")

r,g,b = im.split()

im_point1 = r.point(lambda x:x*1.3+5,"1")

print(im_point1.getpixel((0,0)))

im_point1.save("he1.png")

im_point2 = r.point(lambda x:0,"1")

im_point2.save("he2.png")

print(im_point2.getpixel((10,10)))

輸出為:

圖像im_point1為全白圖

圖像im_point2為全黑圖

split類

定義:im.split() ⇒ sequence

含義:傳回目前圖像各個通道組成的一個元組。例如,分離一個“RGB”圖像将産生三個新的圖像,分别對應原始圖像的每個通道(紅,綠,藍)。

例子:

from PIL import Image

im = Image.open("jing.png")

r,g,b = im.split()

b.save("he.png")

print(b.getpixel((1,3)))