Python基礎之PIL框架

一、PIL(Python Imaging Library)的基本概念:

PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、座標系統(coordinate system)、調色板(palette)、信息(info)和濾波器(filters)。

1、  通道

每張圖片都是由一個或者多個數據通道構成。PIL允許在單張圖片中合成相同維數和深度的多個通道。

以RGB圖像爲例,每張圖片都是由三個數據通道構成,分別爲R、G和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的真彩色)。

3、  尺寸

通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數。

4、  座標系統

PIL使用笛卡爾像素座標系統,座標(0,0)位於左上角。注意:座標值表示像素的角;位於座標(0,0)處的像素的中心實際上位於(0.5,0.5)。

座標經常用於二元組(x,y)。長方形則表示爲四元組,前面是左上角座標。例如,一個覆蓋800x600的像素圖像的長方形表示爲(0,0,800,600)。

5、  調色板

調色板模式 ("P")使用一個顏色調色板爲每個像素定義具體的顏色值

6、  信息

使用info屬性可以爲一張圖片添加一些輔助信息。這個是字典對象。加載和保存圖像文件時,多少信息需要處理取決於文件格式。

7、  濾波器

對於將多個輸入像素映射爲一個輸出像素的幾何操作,PIL提供了4個不同的採樣濾波器:

NEAREST:最近濾波。從輸入圖像中選取最近的像素作爲輸出像素。它忽略了所有其他的像素。
BILINEAR:雙線性濾波。在輸入圖像的2x2矩陣上進行線性插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
BICUBIC:雙立方濾波。在輸入圖像的4x4矩陣上進行立方插值。注意:PIL的當前版本,做下采樣時該濾波器使用了固定輸入模板。
ANTIALIAS:平滑濾波。這是PIL 1.1.3版本中新的濾波器。對所有可以影響輸出像素的輸入像素進行高質量的重採樣濾波,以計算輸出像素值。在當前的PIL版本中,這個濾波器只用於改變尺寸和縮略圖方法。

注意:在當前的PIL版本中,ANTIALIAS濾波器是下采樣(例如,將一個大的圖像轉換爲小圖)時唯一正確的濾波器。BILIEAR和BICUBIC濾波器使用固定的輸入模板,用於固定比例的幾何變換和上採樣是最好的。

二、程序案例演示

圖片的縮放:

from PIL import Image

img=Image.open('2.jpg')
img.show()
#縮放
w,h=img.size
img.thumbnail((w//2,h//2))
img.show()

執行程序結果:


圖片的旋轉:

from PIL import Image

img=Image.open('2.jpg')
img.show()
#旋轉
img=img.rotate(45)
img.show()

程序執行結果:


濾波器:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
img.show()
#濾波器
#EMBOSS浮雕
#img=img.filter(ImageFilter.EMBOSS)
#CONTOUR輪廓處理
# img=img.filter(ImageFilter.CONTOUR)
#BLUR模糊處理
#img=img.filter(ImageFilter.BLUR)
#DETAIL增強
img=img.filter(ImageFilter.DETAIL)
img.show()

程序依次的執行效果:

浮雕:


輪廓處理:


模糊處理:


增強:


查看通道數和圖像灰度化:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
img.show()
#查看圖像通道數
bands=img.getbands()
print(bands)
#圖像灰度化:RGB->L
img=img.convert('L')
img.show()
bands=img.getbands()
print(bands)
程序執行效果:



取某一個像素點的顏色的值:

from PIL import Image,ImageFilter

img=Image.open('2.jpg')
#取某一個像素點的顏色的值
#三通道像素點的值
pixels=img.getpixel((87,180))
print(pixels)
#單通道像素點的值
img=img.convert('L')
pixels=img.getpixel((87,180))
print(pixels)

程序執行結果:


返回圖片的像素直方圖和當前使用的顏色:

from PIL import Image
#返回圖片的像素直方圖
img=Image.open('2.jpg')
pr=img.histogram()
print(pr)
#返回圖片當前正在被使用的顏色
colors=img.getcolors()
print(colors)
colors=img.getcolors()
print(colors)

運行結果:


圖像的粘貼:

from PIL import Image
#圖像的粘貼
img1=Image.open('1.jpg')
img2=Image.open('2.jpg')
#把img1粘貼到img2上
img2.paste(img1,(120,100))
#保存粘貼後的img2
img2.save('test.jpg','jpeg')
img2.show()

程序執行結果:


使用PIL生成驗證碼:

from PIL import Image,ImageDraw,ImageFont
import random

#生成隨機字母
def rndChar():
    return  chr(random.randint(65,90))

#隨機顏色1
def rndColor1():
    return (random.randint(64,255)
            ,random.randint(64,255)
            , random.randint(64, 255)
            )

#隨機顏色2
def rndColor2():
    return (random.randint(32,127)
            ,random.randint(32,127)
            , random.randint(32, 127)
            )

#生成一個畫布,240*60
width=240
height=60
image=Image.new('RGB',(width,height),(255,255,255))
#創建Font對象,生成字體
font=ImageFont.truetype('arial.ttf',36)
#創建Draw對象
draw=ImageDraw.Draw(image)
#填充像素,背景干擾項
for x in range(width):
    for y in range(height):
        draw.point((x,y),fill=rndColor1())

#背景上輸出文字
for i in range(4):
    draw.text((60*i+10,10),rndChar(),font=font,fill=rndColor2())

image.show()

執行程序結果:


發佈了301 篇原創文章 · 獲贊 365 · 訪問量 159萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章