好玩的Python圖像PIL庫實訓項目


 

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

運行結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM