Python使用Pillow与OpenCV进行图像处理实战

 更新时间:2026年05月27日 08:54:21   作者:生当鼎食死封侯  
本文详细介绍了Python图像处理的两大工具Pillow与OpenCV的基本概念、功能及使用技巧,涵盖图像读写、处理、滤镜、颜色调整等目标检测等,并并对比了两者的优势与应用场景,助你轻松应对各种图像处理需求,需要的朋友可以参考下

前言

在日常开发中,图像处理是一个非常实用的技能。无论是给照片加水印、批量调整图片尺寸,还是做人脸识别、图像分类,Python 都有对应的工具库。

Python 图像处理主要有两大工具:

对比维度PillowOpenCV
定位通用图像处理计算机视觉
优势简单易用、功能丰富高性能、算法丰富
安装pip install pillowpip install opencv-python
颜色顺序RGBBGR (注意!)
视频支持
GPU加速
学习难度中高

本文将从 Pillow 开始,循序渐进地介绍图像处理的方方面面。

第一章:Pillow —— Python 图像处理入门

1.1 Pillow 是什么

Pillow 是 Python Imaging Library (PIL) 的一个活跃分支。PIL 原版已经停止维护,Pillow 继承了 PIL 的所有功能并持续更新。

Pillow 支持:

  • 读写 30+ 种图像格式(PNG、JPEG、BMP、GIF、TIFF、WebP 等)
  • 图像缩放、旋转、裁剪、翻转
  • 色彩模式转换(RGB、RGBA、灰度、L、1 等)
  • 滤镜效果(模糊、锐化、边缘检测、浮雕等)
  • 图像增强(亮度、对比度、色彩饱和度)
  • 在图像上绘制文字和图形
  • 图像合成与叠加
pip install pillow
from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageEnhance

1.2 图像基础概念

在学习图像处理之前,需要理解几个核心概念:

像素(Pixel)

像素是图像的最小单位。每张图片都是由大量像素排列组成的网格:

颜色模式

模式说明每像素字节数用途
1黑白(1-bit)1/8位图
L灰度1黑白照片
RGB红绿蓝三通道3彩色 图片
RGBARGB + 透明度4需要透明的图片
CMYK印刷四色4印刷输出
P调色板模式1GIF 动画

图像尺寸与分辨率

# 图片尺寸 = 宽 × 高 (单位:像素)
# 1920 × 1080 = 2,073,600 像素 (约200万像素,即 2MP)

# DPI (Dots Per Inch) = 每英寸的像素数
# 72 DPI: 屏幕显示标准
# 150 DPI: 普通打印
# 300 DPI: 高质量打印

1.3 图像的打开与创建

打开已有图片

from PIL import Image

# 打开图片
img = Image.open('photo.jpg')

# 查看图片信息
print(f"格式: {img.format}")      # JPEG, PNG 等
print(f"模式: {img.mode}")        # RGB, RGBA, L 等
print(f"尺寸: {img.size}")        # (宽度, 高度)
print(f"宽度: {img.width} 像素")
print(f"高度: {img.height} 像素")

# 查看 EXIF 信息(相机参数等)
exif = img._getexif()
if exif:
    for tag_id, value in exif.items():
        print(f"  {tag_id}: {value}")

创建新图片

# 创建空白图片
img = Image.new('RGB', (800, 400), color='#2c3e50')

# 创建透明图片
img = Image.new('RGBA', (400, 300), (0, 0, 0, 0))

# 从像素数据创建
pixels = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
img = Image.new('RGB', (3, 1))
img.putdata(pixels)

运行效果 —— 创建自定义图形:

1.4 图像的保存与格式转换

Pillow 支持在不同格式之间自由转换:

img = Image.open('source.png')

# 保存为不同格式
img.save('output.jpg', 'JPEG', quality=95)   # JPEG, 质量95%
img.save('output.bmp', 'BMP')                # BMP 无损
img.save('output.webp', 'WEBP')              # WebP 现代格式
img.save('output.gif', 'GIF')                # GIF
img.save('output.tiff', 'TIFF')              # TIFF 专业格式

各格式的文件大小对比(同一张图片):

格式测试输出:
  PNG: .png → 1.9 KB     ← 无损压缩,体积中等
  JPEG: .jpg → 6.5 KB    ← 有损压缩,体积较大
  BMP: .bmp → 351.6 KB   ← 无压缩,体积巨大
  WEBP: .webp → 0.9 KB   ← 新一代格式,体积最小
格式特点适用场景透明支持
PNG无损压缩网页图标、截图支持
JPEG有损压缩、高压缩率照片存储不支持
BMP无压缩、原始数据需要无损的场景不支持
WebP高压缩率、现代格式网页优化支持
GIF动画、256色限制表情包、动画支持
TIFF无损、多页印刷、医疗影像支持

1.5 图像裁剪与缩放

运行效果:

裁剪

img = Image.open('photo.jpg')

# 裁剪区域: (左, 上, 右, 下)
cropped = img.crop((100, 50, 500, 350))
cropped.save('cropped.jpg')

裁剪坐标示意:

缩放

# 指定尺寸缩放(可能变形)
resized = img.resize((400, 300))

# 高质量缩放(使用 LANCZOS 滤波器)
resized = img.resize((400, 300), Image.LANCZOS)

# 等比缩放(保持宽高比)
img.thumbnail((800, 800))  # 最大边不超过800

# 放大 2 倍
enlarged = img.resize((img.width * 2, img.height * 2), Image.LANCZOS)

缩放质量对比:

方法说明速度质量
NEAREST最近邻插值最快最差(锯齿)
BILINEAR双线性插值较快一般
BICUBIC双三次插值较慢较好
LANCZOSLanczos 重采样最慢最好

1.6 旋转与翻转

运行效果:

img = Image.open('photo.jpg')

# 旋转
rotated_45 = img.rotate(45)                    # 逆时针旋转45度
rotated_90 = img.rotate(90, expand=True)       # 旋转90度,扩展画布
rotated_free = img.rotate(30, expand=True, fillcolor='#2c3e50')  # 自定义背景色

# 翻转
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)  # 水平翻转
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)  # 垂直翻转

1.7 绘图与文字

Pillow 提供了 ImageDraw 模块,可以在图片上绘制各种图形和文字:

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGB', (800, 400), '#ecf0f1')
draw = ImageDraw.Draw(img)

# 绘制矩形
draw.rectangle([50, 50, 200, 200], fill='#e74c3c', outline='white', width=3)

# 绘制椭圆
draw.ellipse([250, 50, 400, 200], fill='#3498db', outline='white', width=3)

# 绘制三角形
draw.polygon([(500, 200), (450, 50), (550, 50)], fill='#2ecc71', outline='white')

# 绘制圆角矩形
draw.rounded_rectangle([600, 50, 750, 200], radius=20, fill='#f39c12')

# 绘制线条
draw.line([(50, 250), (750, 250)], fill='#2c3e50', width=3)

# 绘制文字
font = ImageFont.truetype("msyh.ttc", 36)  # 微软雅黑36号
draw.text((200, 300), 'Hello Pillow!', fill='#2c3e50', font=font)

绘制函数速查:

方法说明参数
rectangle(xy, fill, outline, width)矩形(左,上,右,下)
ellipse(xy, fill, outline, width)椭圆/圆(左,上,右,下)
polygon(points, fill, outline)多边形[(x1,y1), (x2,y2), ...]
line(xy, fill, width)线段(x1,y1,x2,y2)
text(xy, text, fill, font)文字(x,y), 文本, 字体
arc(xy, start, end, fill, width)弧线角度(度)
chord(xy, start, end, fill, outline)角度
pieslice(xy, start, end, fill)扇形角度
rounded_rectangle圆角矩形半径参数

1.8 滤镜效果大全

运行效果:

Pillow 内置了多种滤镜:

from PIL import ImageFilter

img = Image.open('photo.jpg')

# 模糊
img_blur = img.filter(ImageFilter.GaussianBlur(radius=5))
img_blur = img.filter(ImageFilter.BLUR)           # 默认模糊

# 锐化
img_sharpen = img.filter(ImageFilter.SHARPEN)
img_sharpen = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150))

# 边缘检测
img_edges = img.filter(ImageFilter.FIND_EDGES)

# 浮雕
img_emboss = img.filter(ImageFilter.EMBOSS)

# 轮廓
img_contour = img.filter(ImageFilter.CONTOUR)

# 细节增强
img_detail = img.filter(ImageFilter.DETAIL)

# 平滑
img_smooth = img.filter(ImageFilter.SMOOTH)
img_smooth_more = img.filter(ImageFilter.SMOOTH_MORE)

# 多重滤镜叠加
result = img.filter(ImageFilter.GaussianBlur(2)).filter(ImageFilter.SHARPEN)

所有内置滤镜一览:

滤镜效果适用场景
BLUR模糊背景虚化、隐私保护
CONTOUR轮廓素描效果
DETAIL细节增强照片锐化
EDGE_ENHANCE边缘增强图像增强
EDGE_ENHANCE_MORE强边缘增强更强的增强
EMBOSS浮雕艺术效果
FIND_EDGES边缘检测图像分析
SHARPEN锐化照片修复
SMOOTH平滑降噪
SMOOTH_MORE更强平滑更强降噪
GaussianBlur(n)高斯模糊可控模糊程度
UnsharpMask反锐化蒙版专业锐化

1.9 颜色调整与增强

运行效果:

from PIL import ImageEnhance

img = Image.open('photo.jpg')

# 亮度调整 (1.0=原始, >1增强, <1减弱)
enhancer = ImageEnhance.Brightness(img)
bright = enhancer.enhance(1.5)  # 亮度提高50%

# 对比度调整
enhancer = ImageEnhance.Contrast(img)
contrast = enhancer.enhance(1.8)  # 对比度提高80%

# 色彩饱和度调整
enhancer = ImageEnhance.Color(img)
color = enhancer.enhance(2.0)  # 饱和度翻倍

# 锐度调整
enhancer = ImageEnhance.Sharpness(img)
sharp = enhancer.enhance(2.0)  # 锐度翻倍

# 综合调整
from PIL import ImageOps
img_auto = ImageOps.autocontrast(img)    # 自动对比度
img_equalize = ImageOps.equalize(img)    # 直方图均衡化
img_invert = ImageOps.invert(img.convert('RGB'))  # 反色
img_gray = ImageOps.grayscale(img)       # 转灰度

颜色调整效果表:

方法调整值范围效果典型值
Brightness0.0 ~ ∞明暗1.2~1.5
Contrast0.0 ~ ∞对比1.3~1.8
Color0.0 ~ ∞饱和度1.5~2.5
Sharpness0.0 ~ ∞清晰度1.5~3.0

1.10 水印与合成

运行效果:

文字水印

from PIL import Image, ImageDraw, ImageFont

def add_text_watermark(image_path, text, output_path, opacity=128):
    img = Image.open(image_path).convert('RGBA')
    watermark = Image.new('RGBA', img.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(watermark)

    font = ImageFont.truetype("msyh.ttc", 36)
    # 在右下角添加水印
    bbox = draw.textbbox((0, 0), text, font=font)
    x = img.width - bbox[2] - 20
    y = img.height - bbox[3] - 20
    draw.text((x, y), text, fill=(128, 128, 128, opacity), font=font)

    result = Image.alpha_composite(img, watermark)
    result.convert('RGB').save(output_path)

图片水印

def add_image_watermark(image_path, watermark_path, output_path, position='bottom-right'):
    img = Image.open(image_path).convert('RGBA')
    watermark = Image.open(watermark_path).convert('RGBA')

    # 缩放水印
    wm_size = (img.width // 5, img.height // 5)
    watermark = watermark.resize(wm_size, Image.LANCZOS)

    # 计算位置
    if position == 'bottom-right':
        x = img.width - wm_size[0] - 20
        y = img.height - wm_size[1] - 20
    elif position == 'center':
        x = (img.width - wm_size[0]) // 2
        y = (img.height - wm_size[1]) // 2

    # 调整透明度
    watermark.putalpha(watermark.split()[3])

    # 合成
    img.paste(watermark, (x, y), watermark)
    img.convert('RGB').save(output_path)

图片拼接

def combine_images(images, cols=2, padding=10, bg_color='#2c3e50'):
    rows_count = (len(images) + cols - 1) // cols
    max_w = max(img.width for img in images)
    max_h = max(img.height for img in images)

    combined_w = cols * max_w + (cols + 1) * padding
    combined_h = rows_count * max_h + (rows_count + 1) * padding

    combined = Image.new('RGB', (combined_w, combined_h), bg_color)

    for i, img in enumerate(images):
        row = i // cols
        col = i % cols
        x = padding + col * (max_w + padding)
        y = padding + row * (max_h + padding)
        combined.paste(img, (x, y))

    return combined

1.11 实战案例:批量处理图片

将前面学的技术组合起来,做一个实用的批量处理脚本:

"""
批量处理图片:调整大小 + 加水印 + 转换格式
"""
from PIL import Image, ImageDraw, ImageFont, ImageEnhance, ImageFilter
import os

def batch_process(input_dir, output_dir, max_size=(1920, 1080),
                  watermark_text=None, output_format='JPEG'):
    """批量处理图片"""
    os.makedirs(output_dir, exist_ok=True)

    supported = {'.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff'}

    for filename in os.listdir(input_dir):
        ext = os.path.splitext(filename)[1].lower()
        if ext not in supported:
            continue

        filepath = os.path.join(input_dir, filename)
        try:
            img = Image.open(filepath)
        except Exception:
            print(f"跳过无法打开的文件: {filename}")
            continue

        # 1. 转为 RGB(去除透明通道)
        if img.mode in ('RGBA', 'P'):
            img = img.convert('RGB')

        # 2. 缩放到最大尺寸
        img.thumbnail(max_size, Image.LANCZOS)

        # 3. 轻微锐化
        img = img.filter(ImageFilter.SHARPEN)

        # 4. 自动对比度
        from PIL import ImageOps
        img = ImageOps.autocontrast(img)

        # 5. 添加水印
        if watermark_text:
            draw = ImageDraw.Draw(img)
            try:
                font = ImageFont.truetype("msyh.ttc", max(20, img.width // 30))
            except:
                font = ImageFont.load_default()
            text = watermark_text
            bbox = draw.textbbox((0, 0), text, font=font)
            x = img.width - (bbox[2] - bbox[0]) - 20
            y = img.height - (bbox[3] - bbox[1]) - 20
            draw.text((x, y), text, fill=(255, 255, 255), font=font)

        # 6. 保存
        name = os.path.splitext(filename)[0]
        output_path = os.path.join(output_dir, f"{name}.{output_format.lower()}")
        img.save(output_path, output_format, quality=90)
        print(f"已处理: {filename} → {output_path}")

# 使用
batch_process(
    input_dir='./photos',
    output_dir='./photos_processed',
    max_size=(1920, 1080),
    watermark_text='© 2025 MyBlog'
)

第二章:OpenCV —— 计算机视觉利器

2.1 OpenCV 简介

OpenCV(Open Source Computer Vision Library)是世界上最大的计算机视觉库,支持 2500+ 种算法,覆盖图像处理、物体检测、人脸识别、OCR、姿态估计等领域。

pip install opencv-python
pip install opencv-contrib-python  # 包含额外模块
import cv2
import numpy as np

重要区别:OpenCV 使用 BGR 顺序(蓝-绿-红),而不是 PIL 的 RGB 顺序。这是一个常见的坑!

2.2 图像读取与基本操作

import cv2

# 读取图片 (BGR 格式)
img = cv2.imread('photo.jpg')
img_color = cv2.imread('photo.jpg', cv2.IMREAD_COLOR)     # 彩色(默认)
img_gray = cv2.imread('photo.jpg', cv2.IMREAD_GRAYSCALE)  # 灰度

# 查看信息
print(f"形状: {img.shape}")       # (高度, 宽度, 通道数)
print(f"数据类型: {img.dtype}")   # uint8
print(f"像素总数: {img.size}")    # 高 × 宽 × 通道

# 显示图片
cv2.imshow('Image', img)
cv2.waitKey(0)       # 按任意键关闭
cv2.destroyAllWindows()

# 保存图片
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])

像素操作

# 读取单个像素 (BGR)
pixel = img[100, 200]    # [B, G, R] 值

# 修改像素
img[100, 200] = [255, 0, 0]  # 蓝色

# ROI(感兴趣区域)
roi = img[50:200, 100:300]   # (y1:y2, x1:x2)
img[50:200, 100:300] = 0     # 将该区域涂黑

# 使用掩码
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask[50:200, 100:300] = 255
result = cv2.bitwise_and(img, img, mask=mask)

2.3 图像变换

import cv2
import numpy as np

img = cv2.imread('photo.jpg')

# 缩放
resized = cv2.resize(img, (400, 300))                    # 指定尺寸
scaled = cv2.resize(img, None, fx=0.5, fy=0.5)           # 按比例

# 旋转
h, w = img.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, angle=45, scale=1.0)
rotated = cv2.warpAffine(img, matrix, (w, h))

# 仿射变换
pts1 = np.float32([[0, 0], [w-1, 0], [0, h-1]])     # 原始3个点
pts2 = np.float32([[0, 0], [w-1, 0], [int(w*0.33), h-1]])  # 目标3个点
matrix = cv2.getAffineTransform(pts1, pts2)
warped = cv2.warpAffine(img, matrix, (w, h))

# 透视变换
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
perspective = cv2.warpPerspective(img, matrix, (300, 300))

2.4 图像滤波

img = cv2.imread('photo.jpg')

# 均值模糊
blur = cv2.blur(img, (5, 5))

# 高斯模糊(更自然的模糊效果)
gaussian = cv2.GaussianBlur(img, (5, 5), 0)

# 中值滤波(去除椒盐噪声效果最好)
median = cv2.medianBlur(img, 5)

# 双边滤波(保边去噪)
bilateral = cv2.bilateralFilter(img, 9, 75, 75)

滤波效果对比:

方法效果噪声类型边缘保留
均值模糊整体模糊高斯噪声
高斯模糊平滑模糊高斯噪声一般
中值滤波清晰保留细节椒盐噪声
双边滤波边缘清晰所有噪声最好

2.5 边缘检测

img = cv2.imread('photo.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Canny 边缘检测(最常用)
edges = cv2.Canny(gray, threshold1=50, threshold2=150)

# Sobel 算子
sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
sobel = cv2.magnitude(sobel_x, sobel_y)

# Laplacian 算子
laplacian = cv2.Laplacian(gray, cv2.CV_64F)

# 边缘检测 + 二值化
_, binary = cv2.threshold(edges, 127, 255, cv2.THRESH_BINARY)

Canny 边缘检测的两个阈值参数:

  • threshold1: 低阈值 —— 弱边缘
  • threshold2: 高阈值 —— 强边缘
  • 两者之间的像素如果与强边缘相连,也会被保留

2.6 颜色空间转换

img = cv2.imread('photo.jpg')

# BGR → 灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR → RGB(与PIL互转时需要)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# BGR → HSV(色相-饱和度-明度,颜色分割常用)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR → LAB(感知均匀的颜色空间)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

# HSV 颜色分割示例
lower_red = np.array([0, 100, 100])
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)
red_only = cv2.bitwise_and(img, img, mask=mask)

常用颜色空间:

颜色空间组成优势适用场景
BGR蓝-绿-红OpenCV 默认通用
RGB红-绿-蓝通用标准PIL/Web 互转
HSV色相-饱和度-明值颜色分割方便颜色检测
Grayscale灰度单通道、计算快边缘检测、OCR
LAB明度-红绿-蓝黄感知均匀颜色对比
YCrCb亮度-红差-蓝差肤色检测人脸识别

2.7 形态学操作

形态学操作基于数学形态学理论,常用于二值图像处理:

import cv2
import numpy as np

# 先二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 也可用圆形: cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))

# 腐蚀 —— 收缩白色区域
eroded = cv2.erode(binary, kernel, iterations=1)

# 膨胀 —— 扩张白色区域
dilated = cv2.dilate(binary, kernel, iterations=1)

# 开运算 —— 先腐蚀后膨胀(去噪点)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# 闭运算 —— 先膨胀后腐蚀(填孔洞)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

# 形态学梯度 —— 膨胀 - 腐蚀(提取边缘)
gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)

# 顶帽 —— 原图 - 开运算(提取小亮区域)
tophat = cv2.morphologyEx(binary, cv2.MORPH_TOPHAT, kernel)

# 黑帽 —— 闭运算 - 原图(提取小暗区域)
blackhat = cv2.morphologyEx(binary, cv2.MORPH_BLACKHAT, kernel)

形态学操作效果图解:

2.8 轮廓检测

import cv2

img = cv2.imread('shapes.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE,
                                         cv2.CHAIN_APPROX_SIMPLE)

# 绘制所有轮廓
result = img.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)

# 分析每个轮廓
for i, contour in enumerate(contours):
    # 面积
    area = cv2.contourArea(contour)
    # 周长
    perimeter = cv2.arcLength(contour, True)
    # 多边形近似
    epsilon = 0.02 * perimeter
    approx = cv2.approxPolyDP(contour, epsilon, True)
    # 外接矩形
    x, y, w, h = cv2.boundingRect(contour)
    # 外接圆
    (cx, cy), radius = cv2.minEnclosingCircle(contour)

    print(f"轮廓 {i}: 面积={area:.0f}, 周长={perimeter:.0f}, "
          f"顶点数={len(approx)}, 类形={'矩形' if len(approx)==4 else '其他'}")

    # 绘制外接矩形和圆
    cv2.rectangle(result, (x, y), (x+w, y+h), (255, 0, 0), 2)
    cv2.circle(result, (int(cx), int(cy)), int(radius), (0, 0, 255), 2)

轮廓分析速查:

函数说明返回值
contourArea(c)轮廓面积float
arcLength(c, True)轮廓周长float
approxPolyDP(c, e, True)多边形近似顶点数组
boundingRect(c)外接矩形(x, y, w, h)
minEnclosingCircle(c)外接圆(center, radius)
moments(c)图像矩字典
isContourConvex(c)是否凸多边形bool

选择指南

你的需求推荐工具原因
给图片加水印Pillow简单几行代码
批量调整图片大小PillowAPI 简洁、速度快
图片格式转换Pillow支持 30+ 格式
给图片加文字/图形PillowImageDraw 完美支持
图片加滤镜效果Pillow内置丰富滤镜
人脸识别/检测OpenCV内置 Haar/DNN 模型
实时视频处理OpenCVVideoCapture 支持
边缘检测/轮廓OpenCVCanny/轮廓检测算法
图像分类/目标检测OpenCV + 深度学习DNN 模块支持模型推理
OCR 文字识别OpenCV + Tesseract预处理 + OCR

两者互转

在实际项目中,经常需要在 Pillow 和 OpenCV 之间转换:

from PIL import Image
import cv2
import numpy as np

# Pillow → OpenCV
pil_img = Image.open('photo.jpg')
cv_img = np.array(pil_img)[:, :, ::-1]  # RGB → BGR

# OpenCV → Pillow
cv_img = cv2.imread('photo.jpg')
pil_img = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))

以上就是Python使用Pillow与OpenCV进行图像处理实战的详细内容,更多关于Python Pillow与OpenCV图像处理的资料请关注脚本之家其它相关文章!

相关文章

  • python依赖包安装冲突解决方法总结

    python依赖包安装冲突解决方法总结

    Python依赖包管理是开发Python项目时的一个重要环节,它涉及到依赖包的记录、安装、版本控制和环境隔离等方面,这篇文章主要介绍了python依赖包安装冲突解决方法的相关资料,需要的朋友可以参考下
    2025-09-09
  • Windows环境下创建并激活Python虚拟环境venv

    Windows环境下创建并激活Python虚拟环境venv

    Python虚拟环境venv是管理项目依赖的强大工具,通过创建、激活和使用虚拟环境,你可以轻松隔离和管理项目依赖,避免依赖冲突,提高开发效率和项目的可移植性,这篇文章主要介绍了Windows环境下创建并激活Python虚拟环境venv的相关资料,需要的朋友可以参考下
    2026-03-03
  • Python 计算机视觉编程进阶之图像特效处理篇

    Python 计算机视觉编程进阶之图像特效处理篇

    计算机视觉这种技术可以将静止图像或视频数据转换为一种决策或新的表示。所有这样的转换都是为了完成某种特定的目的而进行的,本篇我们来学习下如何对图像进行特效处理
    2021-11-11
  • 简单介绍Python中的len()函数的使用

    简单介绍Python中的len()函数的使用

    这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下
    2015-04-04
  • 利用Python画ROC曲线和AUC值计算

    利用Python画ROC曲线和AUC值计算

    这篇文章给大家介绍了如何利用Python画ROC曲线,以及AUC值的计算,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • 使用IPython来操作Docker容器的入门指引

    使用IPython来操作Docker容器的入门指引

    这篇文章主要介绍了使用IPython来操作Docker容器的方法,包括一些基本的搭建和连接,主要依靠docker-py模块,需要的朋友可以参考下
    2015-04-04
  • Tensorflow tensor 数学运算和逻辑运算方式

    Tensorflow tensor 数学运算和逻辑运算方式

    这篇文章主要介绍了Tensorflow tensor 数学运算和逻辑运算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 十分钟搞定pandas(入门教程)

    十分钟搞定pandas(入门教程)

    这篇文章主要介绍了十分钟搞定pandas(入门教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Pygame实战练习之炸弹人学院游戏

    Pygame实战练习之炸弹人学院游戏

    炸弹人学院想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用python写一个简单的炸弹人学院小游戏的相关资料,需要的朋友可以参考下
    2021-09-09
  • Python3 全自动更新已安装的模块实现

    Python3 全自动更新已安装的模块实现

    这篇文章主要介绍了Python3 全自动更新已安装的模块实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论