python 包之 Pillow 圖像處理教程
一、安裝
-
被認為是python官方圖像處理庫
-
PIL非常適合於圖像歸檔以及圖像的批處理任務。可以使用PIL創建縮略圖,轉換圖像格式,打印圖像等等
-
PIL支持眾多的GUI框架接口,可以用於圖像展示
-
PIL庫同樣支持圖像的大小轉換,圖像旋轉,以及任意的仿射變換
pip install Pillow
二、打開圖片
from PIL import Image
im = Image.open("picture.jpg")
im.show()
三、轉換格式並保存
from PIL import Image
im = Image.open("picture.jpg")
im.save("result.png")
四、創建縮略圖
from PIL import Image
im = Image.open("picture.jpg")
im.thumbnail((128, 128))
im.save("result.jpg")
五、獲取圖片屬性
-
獲取圖像的來源,如果圖像不是從文件讀取它的值就是None。
from PIL import Image
im = Image.open("picture.jpg")
print(im.format)
六、圖片信息
from PIL import Image
im = Image.open("picture.jpg")
print(im.info)
七、調色板
-
如果圖像的模式是「P」,則返回Image Palette類的實例;否則,將為None
from PIL import Image
im = Image.open("picture.jpg")
print(im.palette)
八、畫板
-
使用給定的變量mode和size生成畫板
from PIL import Image
im= Image.new("RGB", (128, 128), "#FF0000")
im.show()
九、圖片模式
-
圖像的模式,常見如下
-
L:8位像素,黑白
-
P:9位像素,使用調色板映射到任何其他模式
-
1:1位像素,黑白圖像,存成8位像素
-
RGB:3*8位像素,真彩
-
RGBA:4*8位像素,真彩+透明通道
-
CMYK:4*8位像素,印刷四色模式或彩色印刷模式
-
YCbCr:3*8位像素,色彩視頻格式
-
I:32位整型像素
-
F:33位浮點型像素
from PIL import Image
im = Image.open("picture.jpg")
print(im.mode)
十、模式轉換
-
將當前圖像轉換為其他模式,並且返回新的圖像
from PIL import Image
im = Image.open("picture.jpg")
new_im = im.convert('L')
print(new_im.mode)
new_im.show()
十一、矩陣模式轉換
-
使用轉換矩陣將一個「RGB」圖像轉換為「L」或者「RGB」圖像
from PIL import Image
im = Image.open("picture.jpg")
print(im.mode)
matrix = (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", matrix)
print(new_im.mode)
new_im.show()
十二、圖片尺寸
-
獲取圖像的尺寸,按照像素數計算,它的返回值為寬度和高度的二元組
from PIL import Image
im = Image.open("picture.jpg")
print(im.size)
十三、通道分離
-
返回當前圖像各個通道組成的一個元組
-
分離一個 RGB 圖像將產生三個新的圖像
-
分別對應原始圖像的每個通道紅、綠、藍三張圖片
from PIL import Image
im = Image.open("picture.jpg")
r,g,b = im.split()
print(r.mode)
print(r.size)
print(im.size)
十四、複製、裁剪、粘貼、合併
from PIL import Image
im = Image.open("picture.jpg")
# 複製
im.copy()
# 裁剪
im.crop((100, 100, 400, 400))
# 將一張圖粘貼到另一張圖像上
im.paste(im.transpose(Image.ROTATE_180),im)
# 合併類使用一些單通道圖像,創建一個新的圖像
Image.merge("RGB", im.split())
十五、幾何變換
-
Image類有resize()、rotate()和transpose()、transform()方法進行幾何變換
from PIL import Image
im = Image.open("picture.jpg")
# 修改尺寸
im.resize((128, 128))
# 角度旋轉
im.rotate(45)
# 返回當前圖像的翻轉或者旋轉的拷貝
# 值為:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,ROTATE_270
im.transpose(Image.ROTATE_90)
# 用給定的尺寸生成一張新的圖像,與原圖有相同的模式
im.transform((200, 200), Image.EXTENT, (0, 0, 300, 300))
十六、高級圖片處理
-
使用ImageEnhance對象就能快速地進行設置。 可以調整對比度、亮度、色平衡和銳利度
from PIL import Image
from PIL import ImageEnhance
im = Image.open("picture.jpg")
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
十七、濾波器處理
from PIL import Image
from PIL import ImageFilter
im = Image.open("picture.jpg")
# 均值濾波
im1 = im.filter(ImageFilter.BLUR)
# 找輪廓
im2 = im.filter(ImageFilter.CONTOUR)
# 邊緣檢測
im3 = im.filter(ImageFilter.FIND_EDGES)
im.show()
im1.show()
im2.show()
im3.show()
十八、設置透明度合成兩張圖
-
使用給定的兩張圖像及透明度變量alpha,生成一張新的圖像
-
變量alpha值在0和1之間
-
若變量alpha為0.0,返回第一張圖像的拷貝。若變量alpha為1.0,將返回第二張圖像的拷貝。
from PIL import Image
im1 = Image.open("picture1.jpg")
im2 = Image.open("picture2.jpg")
im = Image.blend(im1, im2, 0.30)
im.show()
十九、設置模式合成兩張圖
-
使用給定的兩張圖像及mask圖像作為透明度,生成一張新的圖像
-
圖像的模式可以為「1」,「L」或者「RGBA」
-
所有圖像必須有相同的尺寸
from PIL import Image
im1 = Image.open("picture1.jpg")
im2 = Image.open("picture2.jpg")
im = Image.composite(im1, im2, 'L')
im.show()
二十、草稿模式
-
速度要求比質量高的場合
-
允許在不讀取文件內容的情況下儘可能(可能不會完全等於給定的參數)地將圖片轉成給定模式和大小,這在生成縮略圖的時候非常有效
from PIL import Image
im = Image.open("picture.jpg")
print(im.size,im.mode)
new_im = im.draft("L", (200,200))
print(new_im.size,new_im.mode)
new_im.show()
二十一、獲取通道名稱
-
返回包括每個通道名稱的元組
-
例如,對於RGB圖像將返回(「R」,「G」,「B」)
from PIL import Image
im = Image.open("picture.jpg")
print(im.getbands())
二十二、獲取包圍盒
-
計算圖像非零區域的包圍盒
-
這個包圍盒是一個4元組,定義了左、上、右和下像素坐標
-
如果圖像是空的,這個方法將返回空
from PIL import Image
im = Image.open("picture.jpg")
print(im.getbbox())
二十三、獲取像素值
from PIL import Image
im = Image.open("picture.jpg")
print(im.getdata())
二十四、獲取圖片極值
-
返回一個2元組
-
包括該圖像中的最小和最大值
from PIL import Image
im = Image.open("picture.jpg")
print(im.getextrema())
二十五、指定位置像素值
from PIL import Image
im = Image.open("picture.jpg")
print(im.getpixel((10,0)))
二十六、獲取圖像直方圖
from PIL import Image
im = Image.open("picture.jpg")
im_histogram = im.histogram()
print(im_histogram[0])
二十七、內存分配
-
為圖像分配內存並從文件中加載它
-
返回一個用於讀取和修改像素的像素訪問對象
from PIL import Image
im = Image.open("picture.jpg")
pix = im.load()
print(pix[0,2])
二十八、查找指定的幀
-
給定的動態圖中查找指定的幀
-
如果查找超越了序列的末尾,則產生一個EOFError異常
-
當文件被打開時,PIL庫自動指定到第0幀上
from PIL import Image
im_gif = Image.open("loading.gif")
print(im_gif.mode)
# 默認打開時是第0幀
im_gif.show()
im_gif.seek(1)
im_gif.show()
im_gif.seek(3)
im_gif.show()
二十九、獲取當前幀位置
from PIL import Image
im_gif = Image.open("loading.gif")
print(im_gif.tell())
im_gif.seek(3)
print(im_gif.tell())