一、PIL庫學習筆記:
PIL(Python Image Library)庫是Python語言的第三方庫,需要通過pip工具安裝。(安裝::\>pip install pillow # 或者 pip3 install pillow)支持圖像存儲、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對圖像的縮放、剪裁、疊加以及向圖像添加線條、圖像和文字等操作。
PIL庫的基本操作:
1、圖像歸檔(Image Archives)。圖像歸檔以及圖像的批處理任務。可以使用PIL創建縮略圖,轉換圖像格式,打印圖像等等。
2、圖像展示(Image Display)。
3、圖像處理(Image Processing)。PIL包括了基礎的圖像處理函數,包括對點的處理,使用眾多的卷積核(convolution kernels)做過濾(filter)、顏色空間的轉換、圖像的大小轉換、圖像旋轉,以及任意的仿射變換。PIL還有一些直方圖的方法,可以展示圖像的一些統計特性,可以用來實現圖像的自動對比度增強,還有全局的統計分析等。
PIL庫Image類解析:
在PIL中,任何一個圖像文件都可以用Image對象表示Image類的圖像讀取和創建方法。
方法 |
描述 |
Image.open(filename) |
根據參數加載圖像文件 |
Image.new(mode, size, color) |
根據給定參數創建一個新的圖像 |
Image.open(StringIO.StringIO(buffer)) |
從字符串中獲取圖像 |
Image.frombytes(mode, size, data) |
根據像素點data創建圖像 |
Image.verify() |
對圖像文件完整性進行檢查,返回異常 |
Image類還有4個處理圖片的常用屬性
屬性 |
描述 |
Image.format |
標識圖像格式或來源,如果圖像不是從文件讀取,值是None |
Image.mode |
圖像的色彩模式,"L"灰度圖像、"RGB"真彩色圖像、"CMYK"出版圖像 |
Image.size |
圖像寬度和高度,單位是像素(px),返回值是二元元組(tuple) |
Image.palette |
調色板屬性,返回一個ImagePalette類型 |
Image類的圖像轉換和保存方法如表所示。
方法 |
描述 |
Image.save(filename, format) |
將圖像保存為filename文件名,format是圖片格式 |
Image.convert(mode) |
使用不同的參數,轉換圖像為新的模式 |
Image.thumbnail(size) |
創建圖像的縮略圖,size是縮略圖尺寸的二元元組 |
Image類可以縮放和旋轉圖像,其中,rotate()方法以逆時針旋轉的角度值作為參數來旋轉圖像。
方法 |
描述 |
Image.resize(size) |
按size大小調整圖像,生成副本 |
Image.rotate(angle) |
按angle角度旋轉圖像,生成副本 |
Image類能夠對每個像素點或者一幅RGB圖像的每個通道單獨進行操作,split()方法能夠將RGB圖像各顏色通道提取出來,merge()方法能夠將各獨立通道再合成一幅新的圖像。
方法 |
描述 |
Image.point(func) |
根據函數func功能對每個元素進行運算,返回圖像副本 |
Image.split() |
提取RGB圖像的每個顏色通道,返回圖像副本 |
Image.merge(mode,bands) |
合並通道 ,采用mode色彩,bands是新色的色彩通道 |
Image.blend(im1,im2,alpha) |
將兩幅圖片im1和im2按照如下公式插值后生成新的圖像: im1 * (1.0-alpha) + im2 * alpha |
圖像的過濾和增強,PIL庫的ImageFilter類和ImageEnhance類提供了過濾圖像和增強圖像的方法,共10種
方法表示 |
描述 |
ImageFilter.BLUR |
圖像的模糊效果 |
ImageFilter.CONTOUR |
圖像的輪廓效果 |
ImageFilter.DETAIL |
圖像的細節效果 |
ImageFilter.EDGE_ENHANCE |
圖像的邊界加強效果 |
ImageFilter.EDGE_ENHANCE_MORE |
圖像的閾值邊界加強效果 |
ImageFilter.EMBOSS |
圖像的浮雕效果 |
ImageFilter.FIND_EDGES |
圖像的邊界效果 |
ImageFilter.SMOOTH |
圖像的平滑效果 |
ImageFilter.SMOOTH_MORE |
圖像的閾值平滑效果 |
ImageFilter.SHARPEN |
圖像的銳化效果 |
ImageEnhance類提供了更高級的圖像增強需求,它提供調整色彩度、亮度、對比度、銳化等功能。
方法 |
描述 |
ImageEnhance.enhance(factor) |
對選擇屬性的數值增強factor倍 |
ImageEnhance.Color(im) |
調整圖像的顏色平衡 |
ImageEnhance.Contrast(im) |
調整圖像的對比度 |
ImageEnhance.Brightness(im) |
調整圖像的亮度 |
ImageEnhance.Sharpness(im) |
調整圖像的銳度 |
(例)加載一個圖片:
>>>from PIL import Image >>>im = Image.open("D:\\pycodes\\birdnest.jpg")
(例)對一個GIF格式動態文件,提取其中各幀圖像,並保存為文件。
from PIL import Image
im = Image.open('pybit.gif') # 讀入一個GIF文件
try: im.save('picframe{:02d}.png'.format(im.tell())) while True: im.seek(im.tell()+1) im.save('picframe{:02d}.png'.format(im.tell())) except: print("處理結束")
(例)生成"birdnest.jpg"圖像的縮略圖,其中(128,128)是縮略圖的尺寸。
>>>im.thumbnail((128, 128))
>>>im.save("birdnestTN","JPEG")
(例)交換圖像中的顏色。可以通過分離RGB圖片的三個顏色通道實現顏色交換
from PIL import Image
im = Image.open('birdnest.jpg') r, g, b = im.split() om = Image.merge("RGB", (b, g, r)) om.save('birdnestBGR.jpg')
(例)操作圖像的每個像素點需要通過函數實現,采用lambda函數和point()方法搭配使用
>>>im = Image.open('D:\\pycodes\\birdnest.jpg') #打開鳥巢文件 >>>r, g, b = im.split() #獲得RGB通道數據 >>>newg = g.point(lambda i: i * 0.9) # 將G通道顏色值變為原來的0.9倍 >>>newb = b.point(lambda i: i < 100) # 選擇B通道值低於100的像素點 >>>om = Image.merge(im.mode, (r, newg, newb)) # 將3個通道合形成新圖像 >>>om.save('D:\\pycodes\\birdnestMerge.jpg') #輸出圖片
(例)利用Image類的filter()方法可以使用ImageFilter類,如:Image.filter(ImageFilter.fuction) 圖像的輪廓獲取。獲取圖像的輪廓,北京鳥巢變得更加抽象、更具想象空間。
from PIL import Image
from PIL import ImageFilter im = Image.open('birdnest.jpg') om = im.filter(ImageFilter.CONTOUR) om.save('birdnestContour.jpg')
(例)圖像的對比度增強。增強圖像的對比度為初始的20倍。
from PIL import Image
from PIL import ImageEnhance im = Image.open('birdnest.jpg') om = ImageEnhance.Contrast(im) om.enhance(20).save('birdnestEnContrast.jpg')
二、處理兩張圖片:
圖片一:“me.jpg” 圖片二:“touxiang.jpg”
(1)a.生成縮略圖(壓縮后小於10k):
from PIL import Image im = Image.open("me.jpg") im.thumbnail((50, 50)) im.save('smallme','PNG')
運行結果:
from PIL import Image im = Image.open("touxiang.jpg") im.thumbnail((50, 50)) im.save('smalltouxiang.png','PNG')
運行結果:
b.改變顏色:
from PIL import Image im = Image.open("me.jpg") r, g, b = im.split() om = Image.merge("RGB", (b, g, r)) om.save('colorme.jpg')
運行結果:
from PIL import Image
im = Image.open("touxiang.jpg")
r, g, b = im.split()
om = Image.merge("RGB", (g, r,b))
om.save('colortouxiang.jpg')
運行結果:
c.改變輪廓:
from PIL import Image from PIL import ImageFilter im = Image.open('touxiang.jpg') om = im.filter(ImageFilter.FIND_EDGES) om.save('lunkuotouxiang.jpg')
運行結果:
d.浮雕效果:
from PIL import Image from PIL import ImageFilter im = Image.open('touxiang.jpg') om = im.filter(ImageFilter.EMBOSS) om.save('fudiaotouxiang.jpg')
運行結果:
三、做一張字符畫:
from PIL import Image IMG='xin.jpg' WIDTH=60 HEIGHT=45 ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") def get_char(r,g,b,alpha=256): if alpha==0: return ' ' length=len(ascii_char) gray=int(0.2126*r+0.7152*g+0.0722*b) unit=(256.0+1)/length return ascii_char[int(gray/unit)] if __name__=='__main__': im=Image.open(IMG) im=im.resize((WIDTH,HEIGHT),Image.NEAREST) txt="" for i in range(HEIGHT): for j in range(WIDTH): txt+=get_char(*im.getpixel((j,i))) txt+='\n' print (txt) with open("output.txt",'w') as f: f.write(txt)
運行結果: