Python 图像处理:Pillow / OpenCV / pyautogui 完整实战
Introduction
Python 图像处理三个常用库:Pillow(图片缩放/格式转换)、OpenCV(计算机视觉)、pyautogui(自动化 GUI 操作)。本文用实战案例讲解三个库的核心用法。
---
Pillow:图片基础处理
pip install Pillow
from PIL import Image, ImageFilter, ImageEnhance
# 打开图片
img = Image.open('photo.jpg')
print(f"尺寸: {img.size}, 格式: {img.format}, 模式: {img.mode}")
# 缩放和裁剪
img.thumbnail((800, 600)) # 等比例缩放到 800x600 以内
img.crop((100, 100, 500, 400)) # 裁剪 (左, 上, 右, 下)
# 格式转换
img.convert('L').save('photo_gray.jpg') # 彩色转灰度
img.convert('RGB').save('photo_webp.webp', quality=85)
# 滤镜
img.filter(ImageFilter.GaussianBlur(radius=5)) # 高斯模糊
img.filter(ImageFilter.EDGE_ENHANCE) # 边缘增强
# 调整亮度和对比度
enhancer = ImageEnhance.Brightness(img)
img_bright = enhancer.enhance(1.5) # 1.5倍亮度
enhancer = ImageEnhance.Contrast(img)
img_contrast = enhancer.enhance(1.3) # 1.3倍对比度
# 文字水印
from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 36)
draw.text((img.width-200, img.height-50), 'SHAODA.NET', fill='white', font=font)
img.save('watermarked.jpg')
OpenCV:计算机视觉
pip install opencv-python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('photo.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR → RGB
# 调整大小
resized = cv2.resize(img, (640, 480))
# 灰度和阈值
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 边缘检测
edges = cv2.Canny(gray, 50, 150)
# 人脸检测
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imwrite('faces_detected.jpg', img)
# 实时摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret: break
cv2.imshow('Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
pyautogui:GUI 自动化
pip install pyautogui
import pyautogui, time
# 获取屏幕尺寸
print(pyautogui.size()) # (1920, 1080)
# 鼠标移动和点击
pyautogui.moveTo(500, 300, duration=1) # 1秒移动到坐标
pyautogui.click(500, 300) # 单击
pyautogui.doubleClick(500, 300) # 双击
pyautogui.rightClick(500, 300) # 右键
# 截图和定位
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')
# 在屏幕找图(点击某个按钮)
button_pos = pyautogui.locateOnScreen('button.png')
if button_pos:
pyautogui.click(pyautogui.center(button_pos))
# 键盘操作
pyautogui.write('Hello, World!', interval=0.1) # 打字
pyautogui.press('enter') # 按键
pyautogui.hotkey('ctrl', 'c') # 组合键
pyautogui.hotkey('alt', 'tab') # 切换窗口
# 警告弹窗
pyautogui.alert(text='操作完成', title='提示', button='OK')
批量图片处理脚本
#!/usr/bin/env python3
import os
from PIL import Image
input_dir = 'raw_photos'
output_dir = 'processed'
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if not filename.lower().endswith(('.jpg', '.png')):
continue
img = Image.open(os.path.join(input_dir, filename))
img.thumbnail((1200, 1200))
# 锐化和加边框
img.filter(ImageFilter.SHARPEN)
new_name = os.path.splitext(filename)[0] + '_web.jpg'
img.save(os.path.join(output_dir, new_name), quality=85, optimize=True)
print(f'处理完成: {filename} -> {new_name}')
常见问题
Q1: OpenCV 读取中文路径图片?用 cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR)。
Q2: pyautogui 在多显示器上工作吗?只支持主显示器。可以设置 pyautogui.onScreen(x, y) 检查坐标是否在屏幕范围内。
Q3: 图片处理后文件太大?用 Pillow 的 optimize=True 保存,配合适当 quality(如 85),可压缩 50-80% 而画质损失不大。
延伸阅读
- OpenCV 人脸识别进阶
- Python 验证码识别
- PIL ImageDraw 绘图教程
---
作者:小马 | 绍大技术网 shaoda.net