Python 圖像處理Pillow安裝、使用實戰(zhàn)應(yīng)用小結(jié)
一、前言:為什么選擇 Pillow?
在 Python 的圖像處理世界里,Pillow 是最經(jīng)典、最實用、也是最常用的基礎(chǔ)庫之一。
它是 Python Imaging Library (PIL) 的一個分支,經(jīng)過多年更新與維護,如今已經(jīng)成為 Python 圖像處理的事實標準。
Pillow 能夠完成從基礎(chǔ)到高級的幾乎所有圖像任務(wù):
- 打開、顯示、保存各種圖像格式(JPEG、PNG、BMP、TIFF 等)
- 進行圖像的縮放、裁剪、旋轉(zhuǎn)、翻轉(zhuǎn)、濾鏡和增強
- 添加文字、水印、幾何圖形
- 批量圖像處理
- 與 NumPy、OpenCV、TensorFlow 等配合做 AI 圖像預(yù)處理
本文將系統(tǒng)介紹 Pillow 的功能、核心模塊、使用技巧與進階實踐。
無論你是初學(xué)者,還是圖像算法工程師,都能從中獲得啟發(fā)。
二、安裝與快速上手
1. 安裝 Pillow
在大多數(shù) Python 環(huán)境中,Pillow 可以直接通過 pip 安裝:
pip install pillow
驗證是否安裝成功:
from PIL import Image print(Image.__version__)
如果能正常輸出版本號,例如 10.2.0,說明 Pillow 已正確安裝。
2. 快速體驗
我們從一個最簡單的例子開始,打開并顯示一張圖片:
from PIL import Image
# 打開圖像
img = Image.open("example.jpg")
# 顯示圖像
img.show()
# 保存為另一種格式
img.save("example_converted.png")是不是很簡單?
僅幾行代碼,你就能完成打開、顯示、格式轉(zhuǎn)換等操作。
三、圖像的基礎(chǔ)操作
1. 圖像的屬性
Pillow 的 Image 對象包含了大量信息:
img = Image.open("example.jpg")
print(img.format) # 圖像格式,如 JPEG
print(img.size) # (寬, 高)
print(img.mode) # 模式,如 RGB、RGBA、L、CMYK
常見模式說明:
| 模式 | 含義 | 通道數(shù) |
|---|---|---|
| 1 | 黑白(二值) | 1 |
| L | 灰度圖像 | 1 |
| RGB | 彩色圖像 | 3 |
| RGBA | 含透明度通道的彩色圖像 | 4 |
| CMYK | 印刷常用顏色空間 | 4 |
2. 圖像的裁剪與縮放
(1)裁剪
box = (100, 100, 400, 400) region = img.crop(box) region.show()
box 表示左上角和右下角的坐標 (left, upper, right, lower)。
(2)縮放
resized = img.resize((200, 200)) resized.show()
可以選擇不同的插值算法:
from PIL import Image img.resize((200, 200), Image.Resampling.LANCZOS)
3. 旋轉(zhuǎn)與翻轉(zhuǎn)
# 順時針旋轉(zhuǎn)45度 rotated = img.rotate(45) # 水平翻轉(zhuǎn) flipped = img.transpose(Image.FLIP_LEFT_RIGHT) # 垂直翻轉(zhuǎn) flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)
4. 顏色模式轉(zhuǎn)換
gray = img.convert("L") # 轉(zhuǎn)灰度
rgba = img.convert("RGBA")
常用于人臉檢測、OCR 前的預(yù)處理。
四、像素級操作
Pillow 允許直接訪問像素進行操作。
1. getpixel() 與 putpixel()
r, g, b = img.getpixel((10, 10)) print(r, g, b) img.putpixel((10, 10), (255, 0, 0))
可用于修改單個像素、繪制特定形狀。
2. 使用 NumPy 操作像素
與 NumPy 結(jié)合可以極大提高效率:
import numpy as np
from PIL import Image
img = Image.open("example.jpg")
arr = np.array(img)
# 反轉(zhuǎn)顏色
arr = 255 - arr
Image.fromarray(arr).show()NumPy 讓 Pillow 具備了更高的靈活性,常用于 AI 模型前的圖像預(yù)處理。
五、圖像增強與濾鏡
Pillow 提供了多個增強模塊,可提升圖像質(zhì)量或增加特效。
1. 圖像增強模塊
from PIL import ImageEnhance enhancer = ImageEnhance.Brightness(img) bright = enhancer.enhance(1.5) # 提亮 50% bright.show()
常見增強類型:
| 模塊 | 功能 |
|---|---|
| ImageEnhance.Brightness | 亮度 |
| ImageEnhance.Contrast | 對比度 |
| ImageEnhance.Color | 飽和度 |
| ImageEnhance.Sharpness | 銳度 |
例如:
ImageEnhance.Contrast(img).enhance(2.0).show()
2. 圖像濾鏡
Pillow 提供了豐富的濾鏡功能:
from PIL import ImageFilter # 模糊 blurred = img.filter(ImageFilter.BLUR) # 邊緣增強 edge = img.filter(ImageFilter.EDGE_ENHANCE) # 輪廓 contour = img.filter(ImageFilter.CONTOUR)
其他常用濾鏡包括:
ImageFilter.SHARPEN:銳化ImageFilter.EMBOSS:浮雕ImageFilter.FIND_EDGES:邊緣檢測ImageFilter.SMOOTH:平滑
六、繪圖與文字處理
Pillow 自帶 ImageDraw 模塊,可以在圖片上繪制文字與幾何圖形。
1. 繪制幾何圖形
from PIL import ImageDraw draw = ImageDraw.Draw(img) draw.rectangle((50, 50, 200, 200), outline="red", width=3) draw.ellipse((100, 100, 180, 180), fill="blue") draw.line((0, 0, 300, 300), fill="green", width=2)
2. 繪制文字
from PIL import ImageFont, ImageDraw
font = ImageFont.truetype("arial.ttf", 36)
draw = ImageDraw.Draw(img)
draw.text((50, 50), "Hello Pillow!", fill="yellow", font=font)
img.show()可以用于生成水印、驗證碼、封面圖等。
七、圖像通道與混合
1. 通道拆分與合并
r, g, b = img.split()
merged = Image.merge("RGB", (r, g, b))
可以單獨調(diào)整某個通道的亮度或?qū)Ρ榷取?/p>
2. 圖像混合與透明度控制
from PIL import Image
img1 = Image.open("a.jpg")
img2 = Image.open("b.jpg").resize(img1.size)
blended = Image.blend(img1, img2, alpha=0.5)
blended.show()八、圖像格式與批處理
1. 圖像格式轉(zhuǎn)換
Pillow 支持大量格式(JPEG、PNG、BMP、TIFF、ICO、WEBP 等):
img.save("output.webp", "WEBP", quality=90)
2. 批量處理示例
下面的腳本能自動遍歷文件夾中的所有圖片并壓縮尺寸:
import os
from PIL import Image
def batch_resize(input_dir, output_dir, size=(512, 512)):
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.endswith(('.jpg', '.png')):
path = os.path.join(input_dir, file)
img = Image.open(path)
img = img.resize(size)
img.save(os.path.join(output_dir, file))
print("? 批量處理完成!")
batch_resize("images", "resized")九、高級技巧與性能優(yōu)化
1. 懶加載機制
Image.open() 實際上不會立即讀取所有像素,而是延遲加載,直到需要時才讀取。
img = Image.open("large.jpg")
print(img.size) # 不會立即加載整個文件
這能有效節(jié)省內(nèi)存。
2. 壓縮與節(jié)省空間
img.save("compressed.jpg", quality=70, optimize=True)
quality控制壓縮率(1–95)optimize自動優(yōu)化存儲結(jié)構(gòu)
3. 緩存優(yōu)化
在批量處理中,可以啟用線程池或使用 Image.thumbnail() 自動生成縮略圖:
img.thumbnail((300, 300))
相比 resize(),thumbnail() 會保持縱橫比,并在原地修改。
十、Pillow + AI 圖像預(yù)處理
在 AI 模型訓(xùn)練前,圖像預(yù)處理是關(guān)鍵環(huán)節(jié)。
Pillow 與 NumPy 結(jié)合,可以輕松完成:
from PIL import Image
import numpy as np
def preprocess_image(path):
img = Image.open(path).convert("RGB").resize((224, 224))
arr = np.array(img) / 255.0
return arr配合 PyTorch 或 TensorFlow:
import torch
tensor = torch.tensor(preprocess_image("cat.jpg")).permute(2, 0, 1).unsqueeze(0)
十一、Pillow 在項目中的應(yīng)用場景
- Web 后端圖像服務(wù):用戶頭像上傳、壓縮、裁剪。
- 數(shù)據(jù)增強:用于機器學(xué)習(xí)模型的訓(xùn)練樣本擴展。
- 圖像內(nèi)容生成:自動化生成海報、證件照、表情包。
- OCR 預(yù)處理:文字識別前的灰度化、二值化。
- 視頻幀處理:結(jié)合 OpenCV 對視頻幀進行逐幀處理。
十二、實戰(zhàn)案例:自動生成帶水印的縮略圖
from PIL import Image, ImageDraw, ImageFont
import os
def watermark_and_resize(input_path, output_path, watermark_text="? MySite"):
img = Image.open(input_path).convert("RGBA")
img.thumbnail((400, 400))
watermark = Image.new("RGBA", img.size, (0,0,0,0))
draw = ImageDraw.Draw(watermark)
font = ImageFont.truetype("arial.ttf", 20)
draw.text((10, img.size[1]-30), watermark_text, fill=(255,255,255,128), font=font)
combined = Image.alpha_composite(img, watermark)
combined.save(output_path, "PNG")
for file in os.listdir("images"):
if file.endswith(".jpg"):
watermark_and_resize(f"images/{file}", f"output/{file}")結(jié)果:每張圖片都會自動生成一個帶透明水印的縮略圖。
十三、Pillow 的局限與替代方案
雖然 Pillow 功能強大,但也有一些局限性:
| 局限 | 替代或補充 |
|---|---|
| 無 GPU 加速 | OpenCV / PyTorch Vision |
| 處理大圖性能不足 | NumPy + CuPy |
| 高級圖像分割 / 檢測 | 需結(jié)合深度學(xué)習(xí)框架 |
但在輕量任務(wù)、Web 服務(wù)、腳本工具中,Pillow 的性能與穩(wěn)定性仍無可替代。
十四、總結(jié)與展望
Pillow 是 Python 圖像處理的“瑞士軍刀”,
它的優(yōu)勢在于:
- 簡單易用,API 清晰
- 支持廣泛的格式與操作
- 可與 NumPy、OpenCV、AI 框架無縫結(jié)合
- 適合腳本、Web、AI 各類場景
未來,隨著圖像 AI 的發(fā)展,Pillow 仍將作為圖像預(yù)處理的基礎(chǔ)層存在。
它不會被取代,而是被融合到更高層次的智能圖像系統(tǒng)中。
? 結(jié)語
無論你是剛開始學(xué)習(xí) Python 圖像處理的學(xué)生,
還是正在開發(fā) AI 圖像識別系統(tǒng)的工程師,
掌握 Pillow 是你進入圖像世界的第一步。
到此這篇關(guān)于Python 圖像處理利器:Pillow 深度詳解與實戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Python Pillow圖像處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)破解12306圖片驗證碼的方法分析
這篇文章主要介紹了Python實現(xiàn)破解12306圖片驗證碼的方法,涉及Python圖片截取、調(diào)用百度識圖及正則截取等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
python中關(guān)于對super()函數(shù)疑問解惑
Python中的super()是用于調(diào)用父類(或父類的父類...)方法的函數(shù),主要用于多繼承,單繼承問題不大,下面這篇文章主要給大家介紹了關(guān)于python中關(guān)于對super()函數(shù)疑問解惑的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python實現(xiàn)監(jiān)控屏幕界面內(nèi)容變化并發(fā)送通知
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)實時監(jiān)控屏幕上的信息是否發(fā)生變化并發(fā)送通知,文中的示例代碼講解詳細,感興趣的可以了解一下2023-04-04

