Python 圖像處理Pillow安裝、使用實(shí)戰(zhàn)應(yīng)用小結(jié)
一、前言:為什么選擇 Pillow?
在 Python 的圖像處理世界里,Pillow 是最經(jīng)典、最實(shí)用、也是最常用的基礎(chǔ)庫之一。
它是 Python Imaging Library (PIL) 的一個(gè)分支,經(jīng)過多年更新與維護(hù),如今已經(jīng)成為 Python 圖像處理的事實(shí)標(biāo)準(zhǔn)。
Pillow 能夠完成從基礎(chǔ)到高級(jí)的幾乎所有圖像任務(wù):
- 打開、顯示、保存各種圖像格式(JPEG、PNG、BMP、TIFF 等)
- 進(jìn)行圖像的縮放、裁剪、旋轉(zhuǎn)、翻轉(zhuǎn)、濾鏡和增強(qiáng)
- 添加文字、水印、幾何圖形
- 批量圖像處理
- 與 NumPy、OpenCV、TensorFlow 等配合做 AI 圖像預(yù)處理
本文將系統(tǒng)介紹 Pillow 的功能、核心模塊、使用技巧與進(jìn)階實(shí)踐。
無論你是初學(xué)者,還是圖像算法工程師,都能從中獲得啟發(fā)。
二、安裝與快速上手
1. 安裝 Pillow
在大多數(shù) Python 環(huán)境中,Pillow 可以直接通過 pip 安裝:
pip install pillow
驗(yàn)證是否安裝成功:
from PIL import Image print(Image.__version__)
如果能正常輸出版本號(hào),例如 10.2.0,說明 Pillow 已正確安裝。
2. 快速體驗(yàn)
我們從一個(gè)最簡(jiǎn)單的例子開始,打開并顯示一張圖片:
from PIL import Image
# 打開圖像
img = Image.open("example.jpg")
# 顯示圖像
img.show()
# 保存為另一種格式
img.save("example_converted.png")是不是很簡(jiǎn)單?
僅幾行代碼,你就能完成打開、顯示、格式轉(zhuǎn)換等操作。
三、圖像的基礎(chǔ)操作
1. 圖像的屬性
Pillow 的 Image 對(duì)象包含了大量信息:
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 表示左上角和右下角的坐標(biāo) (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)
# 順時(shí)針旋轉(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")
常用于人臉檢測(cè)、OCR 前的預(yù)處理。
四、像素級(jí)操作
Pillow 允許直接訪問像素進(jìn)行操作。
1. getpixel() 與 putpixel()
r, g, b = img.getpixel((10, 10)) print(r, g, b) img.putpixel((10, 10), (255, 0, 0))
可用于修改單個(gè)像素、繪制特定形狀。
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ù)處理。
五、圖像增強(qiáng)與濾鏡
Pillow 提供了多個(gè)增強(qiáng)模塊,可提升圖像質(zhì)量或增加特效。
1. 圖像增強(qiáng)模塊
from PIL import ImageEnhance enhancer = ImageEnhance.Brightness(img) bright = enhancer.enhance(1.5) # 提亮 50% bright.show()
常見增強(qiáng)類型:
| 模塊 | 功能 |
|---|---|
| ImageEnhance.Brightness | 亮度 |
| ImageEnhance.Contrast | 對(duì)比度 |
| ImageEnhance.Color | 飽和度 |
| ImageEnhance.Sharpness | 銳度 |
例如:
ImageEnhance.Contrast(img).enhance(2.0).show()
2. 圖像濾鏡
Pillow 提供了豐富的濾鏡功能:
from PIL import ImageFilter # 模糊 blurred = img.filter(ImageFilter.BLUR) # 邊緣增強(qiáng) edge = img.filter(ImageFilter.EDGE_ENHANCE) # 輪廓 contour = img.filter(ImageFilter.CONTOUR)
其他常用濾鏡包括:
ImageFilter.SHARPEN:銳化ImageFilter.EMBOSS:浮雕ImageFilter.FIND_EDGES:邊緣檢測(cè)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()可以用于生成水印、驗(yàn)證碼、封面圖等。
七、圖像通道與混合
1. 通道拆分與合并
r, g, b = img.split()
merged = Image.merge("RGB", (r, g, b))
可以單獨(dú)調(diào)整某個(gè)通道的亮度或?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. 批量處理示例
下面的腳本能自動(dòng)遍歷文件夾中的所有圖片并壓縮尺寸:
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")九、高級(jí)技巧與性能優(yōu)化
1. 懶加載機(jī)制
Image.open() 實(shí)際上不會(huì)立即讀取所有像素,而是延遲加載,直到需要時(shí)才讀取。
img = Image.open("large.jpg")
print(img.size) # 不會(huì)立即加載整個(gè)文件
這能有效節(jié)省內(nèi)存。
2. 壓縮與節(jié)省空間
img.save("compressed.jpg", quality=70, optimize=True)
quality控制壓縮率(1–95)optimize自動(dòng)優(yōu)化存儲(chǔ)結(jié)構(gòu)
3. 緩存優(yōu)化
在批量處理中,可以啟用線程池或使用 Image.thumbnail() 自動(dòng)生成縮略圖:
img.thumbnail((300, 300))
相比 resize(),thumbnail() 會(huì)保持縱橫比,并在原地修改。
十、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 在項(xiàng)目中的應(yīng)用場(chǎng)景
- Web 后端圖像服務(wù):用戶頭像上傳、壓縮、裁剪。
- 數(shù)據(jù)增強(qiáng):用于機(jī)器學(xué)習(xí)模型的訓(xùn)練樣本擴(kuò)展。
- 圖像內(nèi)容生成:自動(dòng)化生成海報(bào)、證件照、表情包。
- OCR 預(yù)處理:文字識(shí)別前的灰度化、二值化。
- 視頻幀處理:結(jié)合 OpenCV 對(duì)視頻幀進(jìn)行逐幀處理。
十二、實(shí)戰(zhàn)案例:自動(dòng)生成帶水印的縮略圖
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é)果:每張圖片都會(huì)自動(dòng)生成一個(gè)帶透明水印的縮略圖。
十三、Pillow 的局限與替代方案
雖然 Pillow 功能強(qiáng)大,但也有一些局限性:
| 局限 | 替代或補(bǔ)充 |
|---|---|
| 無 GPU 加速 | OpenCV / PyTorch Vision |
| 處理大圖性能不足 | NumPy + CuPy |
| 高級(jí)圖像分割 / 檢測(cè) | 需結(jié)合深度學(xué)習(xí)框架 |
但在輕量任務(wù)、Web 服務(wù)、腳本工具中,Pillow 的性能與穩(wěn)定性仍無可替代。
十四、總結(jié)與展望
Pillow 是 Python 圖像處理的“瑞士軍刀”,
它的優(yōu)勢(shì)在于:
- 簡(jiǎn)單易用,API 清晰
- 支持廣泛的格式與操作
- 可與 NumPy、OpenCV、AI 框架無縫結(jié)合
- 適合腳本、Web、AI 各類場(chǎng)景
未來,隨著圖像 AI 的發(fā)展,Pillow 仍將作為圖像預(yù)處理的基礎(chǔ)層存在。
它不會(huì)被取代,而是被融合到更高層次的智能圖像系統(tǒng)中。
? 結(jié)語
無論你是剛開始學(xué)習(xí) Python 圖像處理的學(xué)生,
還是正在開發(fā) AI 圖像識(shí)別系統(tǒng)的工程師,
掌握 Pillow 是你進(jìn)入圖像世界的第一步。
到此這篇關(guān)于Python 圖像處理利器:Pillow 深度詳解與實(shí)戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Python Pillow圖像處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)破解12306圖片驗(yàn)證碼的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)破解12306圖片驗(yàn)證碼的方法,涉及Python圖片截取、調(diào)用百度識(shí)圖及正則截取等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
python中關(guān)于對(duì)super()函數(shù)疑問解惑
Python中的super()是用于調(diào)用父類(或父類的父類...)方法的函數(shù),主要用于多繼承,單繼承問題不大,下面這篇文章主要給大家介紹了關(guān)于python中關(guān)于對(duì)super()函數(shù)疑問解惑的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python實(shí)現(xiàn)監(jiān)控屏幕界面內(nèi)容變化并發(fā)送通知
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)實(shí)時(shí)監(jiān)控屏幕上的信息是否發(fā)生變化并發(fā)送通知,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04
使用Python實(shí)現(xiàn)繪制地圖的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)繪制地圖相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

