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