1. 程式人生 > >PIL (Python Imaging Library) 教程

PIL (Python Imaging Library) 教程

簡介

PIL (Python Imaging Library)

Python影象處理庫,該庫支援多種檔案格式,提供強大的影象處理功能。

使用Image類

PIL中最重要的類是Image類,該類在Image模組中定義。

從檔案載入影象:

import Image
im = Image.open("lena.ppm")

如果成功,這個函式返回一個Image物件。現在你可以使用該物件的屬性來探索檔案的內容。

print im.format, im.size, im.mode
# PPM (512, 512) RGB

format屬性指定了影象檔案的格式,如果影象不是從檔案中載入的則為None


size屬性是一個2個元素的元組,包含影象寬度和高度(畫素)。
mode屬性定義了畫素格式,常用的畫素格式為:“L” (luminance) - 灰度圖, “RGB” , “CMYK”。

如果檔案開啟失敗, 將丟擲IOError異常。

一旦你擁有一個Image類的例項,你就可以用該類定義的方法操作影象。比如:顯示

im.show()

(show()的標準實現不是很有效率,因為它將影象儲存到一個臨時檔案,然後呼叫外部工具(比如系統的預設圖片檢視軟體)顯示影象。該函式將是一個非常方便的除錯和測試工具。)

接下來的部分展示了該庫提供的不同功能。

讀寫影象

PIL支援多種影象格式。從磁碟中讀取檔案,只需使用Image

模組中的open函式。不需要提供檔案的影象格式。PIL庫將根據檔案內容自動檢測。

如果要儲存到檔案,使用Image模組中的save函式。當儲存檔案時,檔名很重要,除非指定格式,否則PIL庫將根據檔案的副檔名來決定使用哪種格式儲存。

* 轉換檔案到JPEG *

import os, sys
import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            Image.open(infile).save(outfile)
        except
IOError: print "cannot convert", infile

save函式的第二個引數可以指定使用的檔案格式。如果檔名中使用了一個非標準的副檔名,則必須通過第二個引數來指定檔案格式。

* 建立JPEG縮圖 *

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for", infile

需要注意的是,PIL只有在需要的時候才載入畫素資料。當你開啟一個檔案時,PIL只是讀取檔案頭獲得檔案格式、影象模式、影象大小等屬性,而畫素資料只有在需要的時候才會載入。

這意味著開啟一個影象檔案是一個非常快的操作,不會受檔案大小和壓縮演算法型別的影響。

* 獲得影象資訊 *

import sys
import Image

for infile in sys.argv[1:]:
    try:
        im = Image.open(infile)
        print infile, im.format, "%dx%d" % im.size, im.mode
    except IOError:
        pass

剪下、貼上、合併影象

Image類提供了某些方法,可以操作影象的子區域。提取影象的某個子區域,使用crop()函式。

* 複製影象的子區域 *

box = (100, 100, 400, 400)
region = im.crop(box)

定義區域使用一個包含4個元素的元組,(left, upper, right, lower)。座標原點位於左上角。上面的例子提取的子區域包含300x300個畫素。

該區域可以做接下來的處理然後再貼上回去。

* 處理子區域然後貼上回去 *

region = region.transpose(Image.ROTATE_180)
im.paste(region, box)

當往回貼上時,區域的大小必須和引數匹配。另外區域不能超出影象的邊界。然而原影象和區域的顏色模式無需匹配。區域會自動轉換。

* 滾動影象 *

def roll(image, delta):
    "Roll an image sideways"

    xsize, ysize = image.size

    delta = delta % xsize
    if delta == 0: return image

    part1 = image.crop((0, 0, delta, ysize))
    part2 = image.crop((delta, 0, xsize, ysize))
    image.paste(part2, (0, 0, xsize-delta, ysize))
    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

paste()函式有個可選引數,接受一個掩碼影象。掩碼中255表示指定位置為不透明,0表示貼上的影象完全透明,中間的值表示不同級別的透明度。

PIL允許分別操作多通道影象的每個通道,比如RGB影象。split()函式建立一個影象集合,每個影象包含一個通道。merge()函式接受一個顏色模式和一個影象元組,然後將它們合併為一個新的影象。接下來的例子交換了一個RGB影象的三個通道。

* 分離和合並影象通道 *

r, g, b = im.split()
im = Image.merge("RGB", (b, g, r));

對於單通道影象,split()函式返回影象本身。如果想處理各個顏色通道,你可能需要先將影象轉為RGB模式。

幾何變換

resize()函式接受一個元組,指定影象的新大小。
rotate()函式接受一個角度值,逆時針旋轉。

* 基本幾何變換 *

out = im.resize((128, 128))
out = im.rotate(45) # degrees counter-clockwise

影象旋轉90度也可以使用transpose()函式。transpose()函式也可以水平或垂直翻轉影象。

* transpose *

out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)

transpose()rotate()函式在效能和結果上沒有區別。

更通用的影象變換函式為transform()

顏色模式變換

PIL可以轉換影象的畫素模式。

* 轉換顏色模式 *

im = Image.open("lena.ppm").convert("L")

PIL庫支援從其他模式轉為“L”或“RGB”模式,其他模式之間轉換,則需要使用一箇中間影象,通常是“RGB”影象。

影象增強(Image Enhancement)

過濾器

ImageFilter模組包含多個預定義的影象增強過濾器用於filter()函式。

* 應用過濾器 *

import ImageFilter
out = im.filter(ImageFilter.DETAIL)

點操作

point()函式用於操作影象的畫素值。該函式通常需要傳入一個函式物件,用於操作影象的每個畫素:

* 應用點操作 *

# 每個畫素值乘以1.2
out = im.point(lambda i: i * 1.2)

使用以上技術可以快速地對影象畫素應用任何簡單的表示式。可以結合point()函式和paste函式修改影象。

* 處理影象的各個通道 *

# split the image into individual bands
source = im.split()

R, G, B = 0, 1, 2

# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)

# process the green band
out = source[G].point(lambda i: i * 0.7)

# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)

# build a new multiband image
im = Image.merge(im.mode, source)

注意用於建立掩碼影象的語法:

imout = im.point(lambda i: expression and 255)

Python計算邏輯表示式採用短路方式,即:如果and運算子左側為false,就不再計算and右側的表示式,而且返回結果是表示式的結果。比如a and b如果a為false則返回a,如果a為true則返回b,詳見Python語法。

增強

對於更多高階的影象增強功能,可以使用ImageEnhance模組中的類。

可以調整影象對比度、亮度、色彩平衡、銳度等。

* 增強影象 *

import ImageEnhance

enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")

影象序列

PIL庫包含對影象序列(動畫格式)的基本支援。支援的序列格式包括FLI/FLCGIF和一些實驗性的格式。TIFF檔案也可以包含多個幀。

當開啟一個序列檔案時,PIL庫自動載入第一幀。你可以使用seek()函式tell()函式在不同幀之間移動。

* 讀取序列 *

import Image

im = Image.open("animation.gif")
im.seek(1) # skip to the second frame

try:
    while 1:
        im.seek(im.tell() + 1)
        # do something to im
except EOFError:
    pass # end of sequence

如例子中展示的,當序列到達結尾時,將丟擲EOFError異常。

注意當前版本的庫中多數底層驅動只允許seek到下一幀。如果想回到前面的幀,只能重新開啟影象。

以下迭代器類允許在for語句中迴圈遍歷序列:

* 一個序列迭代器類 *

class ImageSequence:
    def __init__(self, im):
        self.im = im
    def __getitem__(self, ix):
        try:
            if ix:
                self.im.seek(ix)
            return self.im
        except EOFError:
            raise IndexError # end of sequence

for frame in ImageSequence(im):
    # ...do something to frame...

Postscript列印

PIL庫包含一些函式用於將影象、文字列印到Postscript印表機。以下是一個簡單的例子。

* 列印到Postscript *

import Image
import PSDraw

im = Image.open("lena.ppm")
title = "lena"
box = (1*72, 2*72, 7*72, 10*72) # in points

ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)

# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)

# draw centered title
ps.setfont("HelveticaNarrow-Bold", 36)
w, h, b = ps.textsize(title)
ps.text((4*72-w/2, 1*72-h), title)

ps.end_document()

讀取影象進階

如前所述,可以使用open()函式開啟影象檔案,通常傳入一個檔名作為引數:

im = Image.open("lena.ppm")

如果開啟成功,返回一個Image物件,否則丟擲IOError異常。

也可以使用一個file-like object代替檔名(暫可以理解為檔案控制代碼)。該物件必須實現read,seek,tell函式,必須以二進位制模式開啟。

* 從檔案控制代碼開啟影象 *

fp = open("lena.ppm", "rb")
im = Image.open(fp)

如果從字串資料中讀取影象,使用StringIO類:

* 從字串中讀取 *

import StringIO

im = Image.open(StringIO.StringIO(buffer))

如果影象檔案內嵌在一個大檔案裡,比如tar檔案中。可以使用ContainerIO或TarIO模組來訪問。

* 從tar文件中讀取 *

import TarIO

fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
im = Image.open(fp)

控制解碼器

* 該小節不太理解,請參考原文 *

有些解碼器允許當讀取檔案時操作影象。通常用於在建立縮圖時加速解碼(當速度比質量重要時)和輸出一個灰度圖到鐳射印表機時。

draft()函式。

* Reading in draft mode *

im = Image.open(file)
print "original = ", im.mode, im.size

im.draft("L", (100, 100))
print "draft = ", im.mode, im.size

輸出類似以下內容:

original = RGB (512, 512)
draft = L (128, 128) 

注意結果影象可能不會和請求的模式和大小匹配。如果要確保影象不大於指定的大小,請使用thumbnail函式。

擴充套件閱讀

相關推薦

PIL (Python Imaging Library) 教程

簡介 PIL (Python Imaging Library) Python影象處理庫,該庫支援多種檔案格式,提供強大的影象處理功能。 使用Image類 PIL中最重要的類是Image類,該類在Image模組中定義。 從檔案載入影象:

Python】安裝PIL (Python Imaging Library )

安裝成功PIL,並非指令pip install PIL,而是pip install Pillow以下轉自原博文:python 安裝PIL (Python Imaging Library ) 提示Could not find a version that satisfies t

(Python問題一)python 安裝PIL (Python Imaging Library )

python 安裝PIL (Python Imaging Library ) 提示 Could not find a version that satisfies the requirement PIL (from versions: ) No matching dist

Python Imaging Library (PIL) v.1.1.7 全平臺安裝指南

PIL使你的Python直譯器具有強大的影象處理功能,同時本庫支援多種檔案格式。 極簡安裝: $ tar xvfz Imaging-1.1.7.tar.gz $ cd Imaging-1.1.7 $ Python setup.py install 指令的解釋見

如何安裝Python圖型處理庫Python Imaging Library(PIL)

在Python中對圖片的處理採用了PIL庫,這個庫可用於圖片的一些常用操作,如改變尺寸、格式、色彩、旋轉等處理。 首先要先安裝Python(在這裡不做介紹)。 安裝完Python後,安裝PIL庫就非常簡單了,只需按如下步驟進行 2、解壓縮包 tar -zxvf Imagin

Python入門系列教程(二)

字符 小寫 無符號 bsp div width raw_input abc body 字符串 1.字符串輸出 name = ‘xiaoming‘ print("姓名:%s"%name) 2.字符串輸入 userName = raw_input(‘請輸

Python入門系列教程(五)函數

st3 python入門 test print 缺省 .com 教程 技術 log 全局變量 修改全局變量 a=100 def test(): global a a=200 print a 多個返回值 缺省參數 d

Python基礎入門教程Python學習路線圖

第一天 字符 語法 知識 國內 排序 inux 跟著 最好的 給大家整理的這套python學習路線圖,按照此教程一步步的學習來,肯定會對python有更深刻的認識。或許可以喜歡上python這個易學,精簡,開源的語言。此套教程,不但有視頻教程,還有源碼分享,讓大家能真正

最新的python視頻教程推薦

視頻教程 python 據IEEE Spectrum研究組調查,Python成為2017年世界上最受歡迎的語言,而C語言和Java分別占第二和第三位。越來越多的人對Python感興趣,如果你也在找python視頻教程推薦,來這裏就對了!在此小編附上鏈接了。Python基礎教程:http://pan.b

Python機器學習教程百度雲全集

doc sina com gin .com p s l口 shuf www vl握換猶2n竊春8http://www.docin.com/sina_6264039129 6aq韶06壞s雷鼗6mchttp://huiyi.docin.com/sina_6263958852

Python視頻教程學習筆記

學習筆記1.Python安裝 1.1 Linux安裝python centos 6.5版本默認安裝python 2.6.6,安裝2.7版本需要使用wget下載源碼包,下載完進行解壓並在解壓文件夾 中進行安裝操作,安裝完成進入python 1.2 windows安裝python 官

Pycharm及python安裝詳細教程

nbsp exe www. center project 完成 查詢 win window 首先我們來安裝python 1、首先進入網站下載:點擊打開鏈接(或自己輸入網址https://www.python.org/downloads/),進入之後如下圖,選擇圖中紅色圈中區

Python Kivy 中文教程:安裝(Windows)

速度 超越 入門 ret 加速 平臺 ads 運行 打包工具 Kivy 是一套用於跨平臺快速應用開發的開源框架,只需編寫一套代碼,便可運行於各大桌面及移動平臺上(包括 Linux, Windows, OS X, Android, iOS, 以及 Raspberry Pi)

Python Standard Library

pos 介紹 win .net let keyword xpath imp 9.4 出自:http://blog.csdn.net/qiqll/article/details/39339319 0.1. 關於本書 0.2. 代碼約定 0.3. 關於例

白月黑羽Python在線教程

itl 聊天 信息 發現 技能 body lan 如果 需要 推薦白月黑羽Python在線教程 白月黑羽 站在初學者的角度為大家安排了Python學習教程,幫助大家迅速掌握程序開發技能。 http://www.python3.vip/doc/tutorial/pytho

最詳細的python 操作 mongodb教程!看完這篇還學不會隨時找我!

條件 cnblogs 江蘇 。。 location flag pre del 修改字段 準備 我的本機環境是: Python3.6 mongodb3.4.3 IDE: PyCharm Professional 因為要使用Python來操作數

Python從入門到精通之30天快速學Python視頻教程

utils python類 執行 遞歸函數 入門到精通 風格 模塊 技術 類型 課程目錄python入門教程-1-Python編程語言歷史及特性.mkv python入門教程-2-Python編程語言初接觸.mkv python入門教程-3-Python程

Python終級教程!語音識別!大四學生實現語音識別技能!吊的不行

脫機 sta col ace with 如果 教程 響應 hone ▌語言識別工作原理概述語音識別源於 20 世紀 50 年代早期在貝爾實驗室所做的研究。早期語音識別系統僅能識別單個講話者以及只有約十幾個單詞的詞匯量。現代語音識別系統已經取得了很大進步,可以識別多個講話者,

Python數據分析基礎與實踐 Python數據分析實踐課程 Python視頻教程

forum thread 課程簡介 數據處理 www com 數據抓取 python安裝 amp 課程簡介: Python數據分析基礎與實踐 Python數據分析實踐課程 Python視頻教程----------------------課程目錄------------

Python數據分析基礎與實踐 超具實戰意義的Python數據分析實踐課程 Python視頻教程

tex 實踐 基礎 text 下載 size .com php 連接 ===============課程目錄=============== ├data.csv├<章節1Python概況>│ └python2.mp4├<章節2Python安裝>│