Python 進階必備:圖像庫 pillow

2021-02-19 Python作業輔導員
1. 關於 PIL 和 pillow 的關係PIL 是 Python Imaging Library 的簡寫,意為 Python 圖像庫。它不是 Python 的標準庫,但在很長一段時期內,PIL 幾乎就是 Python 的御用圖像庫。印象中大約是2015年前後(網上檢索不到這一段歷史),PIL 不再有更新,取而代之的,則是 PIL 的嫡傳分支 pillow —— 完全繼承了 PIL 的 API,且支持 py3 的圖像庫。儘管我們在提到圖像處理時經常會提到 PIL,但一般情況下是指 pillow。pillow 的官網寫著:If you have ever worried or wondered about the future of PIL, please stop.2. 模塊介紹pillow 庫提供了廣泛的文件格式支持、高效的內部表示和非常強大的圖像處理功能,包含了大約 25 個子模塊,其中的核心是 Image 模塊。Image 模塊是為了快速訪問以下幾種基本像素格式存儲的數據而設計的,為一般的圖像處理工具提供了一個堅實的基礎。下表是 pillow 庫中最常用的3個子模塊(圖像處理、編輯、截屏)和3個輔助模塊(過濾器、顏色、字體)。子模塊說明ImageImage模塊提供了一個同名的類,用來表示PIL圖像。該模塊還提供了許多工廠功能,包括從文件加載圖像和創建新圖像的功能。ImageDrawImageDraw模塊為圖像對象提供了簡單的2D圖形。您可以使用此模塊創建新圖像、注釋或修改現有圖像,以及動態生成圖形以供web使用。ImageGrabImageGrab模塊可用於將屏幕或剪貼板的內容複製到PIL圖像內存。ImageFilterImageFilter模塊包含一組預定義的濾鏡,可以與Image.filter()方法一起使用。ImageColorImageColor模塊包含顏色表和從css3風格的顏色說明符到RGB元組的轉換器。這個模塊由PIL.Image.new()和ImageDraw等模塊使用。ImageFontImageFont模塊定義了一個同名的類。該類的實例存儲位圖字體,並與PIL.ImageDraw.Draw.text()方法一起使用。

處理圖像需要理解圖像模式。所謂圖像模式就是把色彩分解成部分顏色組件,對顏色組件不同的分類就形成了不同的色彩模式,不同的色彩模式可以影響圖像的通道數目和文件大小。pillow 支持以下圖像模式:

圖像模式說明1黑白,每個像素用1位表示,但存儲時每個像素佔用1個字節L黑白,每個像素用1個字節表示P調色板映射,每個像素用1個字節表示RGB紅綠藍,3通道,每個像素用1個字節表示RGBA紅綠藍和透明,4通道,每個像素用1個字節表示CMYK顏色隔離模式,4通道,每個像素用1個字節表示YCbCr亮度藍色差紅色差,3通道,每個像素用1個字節表示I每個像素用4個字節整型表示F每個像素用4個字節浮點型表示3. 常用功能

在日常應用過程中,使用最多的是 pillow 提供的 Image 模塊,其提供了包括圖像存儲、變換以及一系列的相關處理功能。pillow 模塊中的 ImageDraw 類提供了一系列繪圖方法,ImageGrab 模塊則提供了將屏幕或剪貼板的內容複製到 PIL 圖像內存的功能。通常,使用下面的方法,導入 pillow 的一個或多個子模塊如下:

from PIL import Image, ImageDraw, ImageGrab 

假定我們需要的子模塊均已經導入,下面我們來演示一下這三個模塊的基本用法。

3.1 打開圖像文件

>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.show() # show()方法會自動調用系統默認的圖像查看工具顯示圖像


>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.save(r'D:\CSDN\python_counselor.bmp') # 讀出.jpg文件,可以直接保存為.bmp文件

3.3 創建空白圖像

>>> im = Image.new("RGBA", (320, 240), color=(0,255,255,128)) # 新建320x240的半透明青色背景的圖片
>>> im.show()


>>> im = Image.open(r'D:\CSDN\python_counselor.jpg')
>>> im.mode # 查看圖像模式
'RGB'
>>> im_gray = im.convert('L') # 將RGB彩色模式轉為灰度模式
>>> im_gray.show()


3.5 通道合併與拆分

>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.mode # # png格式的圖像有4個通道
'RGBA'
>>> im_rgb = im.convert('RGB') # 固然可以使用convert()將RGBA模式轉換為RGB模式
>>> r,g,b,a = im.split() # 還可以將RBGA圖像拆分成獨立的4個通道
>>> im_rgb = Image.merge("RGB",(r,g,b)) # 在按照需要合併成目標模式
>>> im_rgb.show()

>>> im_rgb = Image.merge("RGB",(b,g,r)) # 如果把紅藍通道交換,則會得到下圖的效果
>>> im_rgb.show()

>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.size # 查看圖像大小
(400, 400)
>>> im_100 = im.resize((100,100)) # 改變圖像大小(無需保持比例),返會新的Image對象
>>> im_100.size
(100, 100)
>>> im_100.show()
>>> im.thumbnail((128,128)) # 生成縮略圖,但不會返回新的Image對象,而是直接改變了原對象的大小
>>> im.show()


3.7 圖像旋轉

Image.rotate(angle, =0, expand=0, center=None, translate=None)

angle – 單位度(°),逆時針方向為正

resample – 可選的重採樣過濾器,選項:Image.NEAREST,Image.BILINEAR,Image.BICUBIC

expand – 可選的擴展標記。如果為真,則展開輸出圖像,使其足夠大以容納整個旋轉後的圖像。如果為假或省略,使輸出圖像的大小與輸入圖像相同。請注意,擴展標誌假定是圍繞中心旋轉的,沒有平移

center – 可選的旋轉中心(2元組),默認是圖像的中心

translate – 一個可選的旋轉後轉換(2元組)

>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im_rotate = im.rotate(-50)
>>> im_rotate.show() # 下圖左是以圖片中心為基點順時針旋轉50度的效果
>>> im_rotate = im.rotate(-50, expand=True, center=(100,100), translate=(100,00))
>>> im_rotate.show() # 下圖右是以(100,100)為基點順時針旋轉50度後右移100像素的效果

>>> im_bg = Image.open(r'D:\CSDN\python_op.png')
>>> im_bg.size
(800, 404)
>>> im_bg.show()
>>> im = Image.open(r'D:\CSDN\Transp400.png')
>>> im.size
(400, 400)
>>> im_box = im.crop((50,50,250,250)) # 圖像裁切位置:左上(50,50),右下(250,250)
>>> im_box.size
(200, 200)
>>> im_copy = im_box.copy() # 圖像複製
>>> im_bg.paste(im_copy, (400,0)) # 圖像粘貼,位置(400,0)
>>> im_bg.paste(im, (0,0)) # 圖像粘貼,位置(0,0)
>>> im_bg.show()

3.9 使用濾鏡ImageFilter模塊包含一組預定義的濾鏡,可以與Image.filter()方法一起使用。這些濾鏡包括:

BLUR

CONTOUR

DETAIL

EDGE_ENHANCE

EDGE_ENHANCE_MORE

EMBOSS

FIND_EDGES

SHARPEN

SMOOTH

SMOOTH_MORE

>>> im = Image.open(r'D:\CSDN\hello.jpg')
>>> im.show() # 下圖左上
>>> im.filter(ImageFilter.BLUR).show() # 下圖右上
>>> im.filter(ImageFilter.FIND_EDGES).show() # 下圖左下
>>> im.filter(ImageFilter.CONTOUR).show() # 下圖右下

>>> im_bg = Image.open(r'D:\CSDN\python_op.png')
>>> font = ImageFont.truetype("arial.ttf", 32)
>>> draw = ImageDraw.Draw(im_bg)
>>> draw.line((0, im.size[1], im.size[0], 0), fill=(255, 255, 255, 255)) # 繪製值線,[(x, y), (x, y), ...] or [x, y, x, y, ...]
>>> draw.arc([60,60,200,200], 0, 270, fill='red') # 繪製圓弧,box, start angle, end angle, fill color
>>> draw.rectangle([300,300,500,400], fill='red', outline='white') # 繪製矩形
>>> draw.point([60,60,62,60,64,60,66,60,68,60,70,60],fill='white') # 繪製點, [x, y, x, y, x, y]
>>> draw.text([400, 300], "Hello, world", font=font) # 繪製文字
>>> im_bg.show()

>>> im = ImageGrab.grab((1200,600,1920,1080)) # 截取屏幕範圍:左上角(1200,600),右下角(1920,1080)
>>> im.show()


相關焦點

  • Python學習:mac電腦安裝python教程
    與python2.7 共存2 下載安裝包進入官方安裝包下載頁面,https://www.python.org/downloads/mac-osx/找到合適的安裝包,基本上mac電腦都是64位的系統,因此選擇64位的安裝包進行下載
  • python黑知識:python本體
    講述python的實現本體,版本,構建時間,構建工具和構建參數python的實現有很多種,如果想研究一下它語言本身一些機制的實現,可能需要看原始碼,那麼,就需要找到相應的實現,分支和版本。目前使用的python實現,根據python實現存在有這幾種CPython, Stackless Python, MicroPython, CLPython, Cython, IronPython, Jython, Pyjs, PyPy, Numba, Shed Skin Nuitka ,可以說是讓人眼花繚亂。
  • python基礎學習教程:Python基礎語法
    >>> '''在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170群裡有不錯的學習教程、開發工具與電子書籍。與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。'''Window 上在安裝 Python 時已經安裝了交互式編程客戶端,提示窗口如下:
  • Python圖像處理庫:Pillow 初級教程
    文 | way_testlifePillow由PIL而來,所以該導入該庫使用import PIL本文相關的代碼:https://github.com/445141126/pillow_exampleImage類Pillow中最重要的類就是Image,該類存在於同名的模塊中。
  • Python生成一維碼,二維碼
    我們的生活已完全離不開一維碼和二維碼,本文會簡單的介紹如果通過python的方法來生成它們
  • 有趣且鮮為人知的 Python 特性,火了!
    項目地址為:https://github.com/leisurelicht/wtfpython-cn來體會一些難以理解和反人類直覺的Python特性吧!引用自 https://docs.python.org/3/c-api/long.html可以再看看這個案例:>>> id(256)10922528>>> a = 256>>> b = 256>>> id(a)10922528>&
  • Python可視化:Seaborn庫熱力圖使用進階
    前言在日常工作中,經常可以見到各種各種精美的熱力圖,熱力圖的應用非常廣泛
  • Python詞雲:Windows安裝Wordcloud報錯解決辦法
    首先,先看清楚你的python版本,以及搞清楚你的python是基於32位系統還是64位系統。具體操作方法:1、 在左下角搜索windows搜索框裡輸入cmd,打開命令行窗口;2、 輸入python;3、 這裡可以看到python的版本是3.8.2,基於32位系統。
  • Python炫技操作:花式導包的八種方法
    /os.pyc'>>>> myos.getcwd()'/home/wangbm'從 python 3 開始,內建的 reload 函數被移到了 imp 模塊中。語法如下:execfile(filename[, globals[, locals]])參數有這麼幾個:>>> execfile("/usr/lib64/python2.7/os.py")>>> >>> getcwd()'/home/wangbm'
  • 《流暢的Python》微信抽獎程序
    看看誰中獎啦:❯ python mp.py 輸入幸運數字❯ 85如下5位同學獲得《流暢的Python》:用戶: Mr.Ran    樓層: 254   參與時間: 2017-06-06 00:43:21  評論內容:人生苦短,我學Python 85用戶: 木木杉       樓層: 184
  • Python的數據可視化:對比7種工具包
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • 嬛嬛的進階之路: 嬪妃等級大起底
    《甄嬛傳》宮鬥情節讓人看的酣暢淋漓,同時它也完整地揭示了一個女人在後宮的進階之路。   甄嬛晉封時誤穿純元皇后的吉服,皇上大怒,禁足了甄嬛,未封成莞妃。  皇上讓甄嬛回宮,封為熹妃,賜鈕秙祿大姓,用半副皇后的儀仗迎甄嬛回宮。  甄嬛誕下一對龍鳳胎,弘瞻和靈犀,皇上龍顏大悅,晉甄嬛為熹貴妃。
  • 詞彙進階:抗擊新冠肺炎疫情中英對照,共600條詞彙!
    詞彙進階:-ble / -aunt詞彙進階:超活躍後綴ate詞彙進階:後綴 -acious/-taneous/-age詞彙進階:-nounce詞彙進階:liter-/liber-/ad- 詞彙精講詞彙進階:-sist詞彙進階:學科詞彙-logy/-ics詞彙進階:學科詞彙進階
  • Python 炫技操作:模塊重載的五種方法
    >>> from foo import barsuccessful to be imported>>> from foo import bar>>>重載模塊方法一 如果你使用的 python2(記得前面在 foo 文件夾下加一個 __init__.py),有一個 reload 的方法可以直接使用
  • Python 炫技操作:五種 Python 轉義表示法
    舉個例子>>> msg = "hello\013world\013hello\013python">>> print(msg)hello     world          hello               python>>> 是不是有點神奇
  • 一日一技:Python裡面的//並不是做了除法以後取整
    這個原因可以參看Python PEP-238的規範:ttps://www.python.org/dev/peps/pep-0238/#semantics-of-floor-divisionexcept that the result type will be the common type into which a and b are coerced before the
  • Python 情人節告白特技:隱藏在聊天記錄裡的珍貴禮物
    用記事本打開—文件—另存為—編碼改為UTF-8即可當然你還可以用正則表達式去除以下內容不過我覺得這些也是必要的聊天信息之一,留著也無妨,因此在這裡就不加入進去啦,有需要的同學可以百度搜索python記得運行前要安裝jieba分詞包,默認你已經安裝了python3,如果沒有請查閱這個文檔:https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624windows打開CMD / macOS系統打開Terminal 輸入:
  • VBA進階 | 數組基礎06: 與數組相關的函數——Array函數與IsArray函數
    例如,下面的代碼段檢查變量myArray是否為數組,若不是則退出:If NotIsArray(myArray) Then Exit Sub  相關連結:VBA進階 | 數組基礎01: 用最淺顯的介紹來幫助你認識數組VBA進階 | 數組基礎
  • 【狩獵進階】勇者的遊戲,狩獵有多險?(上篇)
    北美狩獵微信號:NorthAmericaHunting (←長按複製)【狩獵進階】狩獵第一常識,看狩獵進階!
  • Python爬蟲實戰:爬取天氣數據的實例詳解
    在本篇文章裡小編給大家整理的是一篇關於python爬取天氣數據的實例詳解內容,有興趣的朋友們學習下。