当前位置: 代码网 > it编程>前端脚本>Python > Python进行图像处理的入门指南

Python进行图像处理的入门指南

2026年05月13日 Python 我要评论
前言大家好,最近我在学习 python 图像处理。相比纯算法理论,图像处理最有意思的地方是:代码运行之后马上就能看到效果,一张图片经过裁剪、缩放、灰度化、滤波、边缘检测之后,变化非常直观。这篇文章面向

前言

大家好,最近我在学习 python 图像处理。相比纯算法理论,图像处理最有意思的地方是:代码运行之后马上就能看到效果,一张图片经过裁剪、缩放、灰度化、滤波、边缘检测之后,变化非常直观。

这篇文章面向 python 初学者,按照“基础概念 → 环境搭建 → 常用操作 → 实战案例 → 完整代码”的路线,带大家从零开始完成一次 python 图像处理入门实践。

本文主要使用两个常见库:

  • pillow:适合图片打开、保存、缩放、裁剪、格式转换等基础处理
  • opencv:适合图像增强、滤波、边缘检测、轮廓识别等计算机视觉任务

一、图像处理基础

1.1 什么是图像处理

图像处理就是使用程序对图片进行读取、分析、修改和保存。常见任务包括:

  • 图片格式转换:例如 png 转 jpg
  • 图片尺寸调整:例如生成缩略图
  • 图片裁剪:截取指定区域
  • 灰度处理:把彩色 图转换为黑白图
  • 图像增强:调整亮度、对比度、锐化
  • 边缘检测:提取物体轮廓
  • 批量处理:一次性处理多个图片文件

1.2 图像在程序中的表示

一张图片在计算机里本质上是像素矩阵。

彩色 图片通常由三个通道组成:

  • r:红色通道
  • g:绿色通道
  • b:蓝色通道

在 opencv 中,默认通道顺序是 bgr,不是常见的 rgb,这是初学者非常容易踩坑的地方。

import cv2

image = cv2.imread("demo.jpg")
print(image.shape)

如果输出:

(600, 800, 3)

表示图片高度为 600,宽度为 800,有 3 个颜色通道。

二、环境搭建

2.1 安装依赖库

在命令提示符或 powershell 中执行:

pip install pillow opencv-python numpy matplotlib

各库作用如下:

  • pillow:基础图像读写和处理
  • opencv-python:计算机视觉处理
  • numpy:矩阵计算
  • matplotlib:显示图片和绘图

2.2 准备测试图片

建议准备一张普通图片,例如:

demo.jpg

把图片和 python 脚本放在同一个文件夹中,方便后续读取。

目录结构可以这样:

image_demo/
├── demo.jpg
└── image_processing_demo.py

三、使用 pillow 进行基础操作

3.1 打开和保存图片

from pil import image

image = image.open("demo.jpg")
print(image.size)
print(image.mode)

image.save("output_copy.jpg")

说明:

  • image.size:图片尺寸,返回 (宽度, 高度)
  • image.mode:图片模式,例如 rgbrgbal
  • save():保存图片

3.2 图片缩放

from pil import image

image = image.open("demo.jpg")
resized = image.resize((400, 300))
resized.save("output_resized.jpg")

如果想按比例缩放,可以这样写:

from pil import image

image = image.open("demo.jpg")
width, height = image.size

new_width = 400
new_height = int(height * new_width / width)

resized = image.resize((new_width, new_height))
resized.save("output_keep_ratio.jpg")

3.3 图片裁剪

from pil import image

image = image.open("demo.jpg")

box = (100, 100, 500, 400)
cropped = image.crop(box)

cropped.save("output_cropped.jpg")

crop() 的参数是一个四元组:

(左, 上, 右, 下)

3.4 灰度转换

from pil import image

image = image.open("demo.jpg")
gray = image.convert("l")
gray.save("output_gray.jpg")

l 表示灰度模式,每个像素只保留亮度信息。

四、使用 opencv 进行图像处理

4.1 读取和显示图片

import cv2

image = cv2.imread("demo.jpg")

cv2.imshow("image", image)
cv2.waitkey(0)
cv2.destroyallwindows()

注意:

  • cv2.imread() 读取图片
  • cv2.imshow() 显示图片
  • cv2.waitkey(0) 等待键盘输入
  • cv2.destroyallwindows() 关闭窗口

4.2 bgr 转 rgb

opencv 默认使用 bgr。如果要用 matplotlib 显示,需要转换为 rgb。

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("demo.jpg")
rgb_image = cv2.cvtcolor(image, cv2.color_bgr2rgb)

plt.imshow(rgb_image)
plt.axis("off")
plt.show()

4.3 灰度图

import cv2

image = cv2.imread("demo.jpg")
gray = cv2.cvtcolor(image, cv2.color_bgr2gray)

cv2.imwrite("opencv_gray.jpg", gray)

4.4 高斯模糊

高斯模糊常用于降噪,让图片变得更平滑。

import cv2

image = cv2.imread("demo.jpg")
blurred = cv2.gaussianblur(image, (7, 7), 0)

cv2.imwrite("opencv_blur.jpg", blurred)

参数 (7, 7) 是卷积核大小,必须是正奇数。

4.5 边缘检测

canny 边缘检测可以提取图片中的轮廓线。

import cv2

image = cv2.imread("demo.jpg")
gray = cv2.cvtcolor(image, cv2.color_bgr2gray)
edges = cv2.canny(gray, 100, 200)

cv2.imwrite("opencv_edges.jpg", edges)

其中 100200 是两个阈值,阈值不同,边缘检测结果也会不同。

五、实战项目一:批量生成缩略图

很多网站或后台系统都需要生成缩略图。下面用 pillow 批量处理一个文件夹中的图片。

from pathlib import path
from pil import image


def create_thumbnails(input_dir, output_dir, size=(300, 300)):
    input_path = path(input_dir)
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    image_exts = [".jpg", ".jpeg", ".png", ".bmp"]

    for file_path in input_path.iterdir():
        if file_path.suffix.lower() not in image_exts:
            continue

        image = image.open(file_path)
        image.thumbnail(size)

        save_path = output_path / f"{file_path.stem}_thumb.jpg"
        image.convert("rgb").save(save_path, quality=90)
        print(f"已生成缩略图:{save_path}")


create_thumbnails("images", "thumbnails")

thumbnail() 会保持原始比例,不会强行拉伸图片。

六、实战项目二:批量添加文字水印

在图片右下角添加文字水印,是非常常见的批处理需求。

from pathlib import path
from pil import image, imagedraw, imagefont


def add_text_watermark(image_path, output_path, text):
    image = image.open(image_path).convert("rgba")
    watermark_layer = image.new("rgba", image.size, (255, 255, 255, 0))
    draw = imagedraw.draw(watermark_layer)

    font = imagefont.truetype("arial.ttf", 32)
    text_box = draw.textbbox((0, 0), text, font=font)
    text_width = text_box[2] - text_box[0]
    text_height = text_box[3] - text_box[1]

    x = image.width - text_width - 30
    y = image.height - text_height - 30

    draw.text((x, y), text, font=font, fill=(255, 255, 255, 160))

    result = image.alpha_composite(image, watermark_layer)
    result.convert("rgb").save(output_path, quality=95)


def batch_add_watermark(input_dir, output_dir, text):
    input_path = path(input_dir)
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    for file_path in input_path.glob("*.*"):
        if file_path.suffix.lower() not in [".jpg", ".jpeg", ".png"]:
            continue

        save_path = output_path / f"{file_path.stem}_watermark.jpg"
        add_text_watermark(file_path, save_path, text)
        print(f"已添加水印:{save_path}")


batch_add_watermark("images", "watermarked", "python image")

如果 arial.ttf 找不到,可以换成 windows 常见字体路径:

font = imagefont.truetype("c:/windows/fonts/msyh.ttc", 32)

七、实战项目三:图像边缘检测工具

下面做一个完整的小工具:读取图片、灰度化、模糊降噪、边缘检测,并把每一步结果保存下来。

from pathlib import path

import cv2


def detect_edges(image_path, output_dir):
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    image = cv2.imread(str(image_path))
    if image is none:
        raise filenotfounderror(f"图片读取失败:{image_path}")

    gray = cv2.cvtcolor(image, cv2.color_bgr2gray)
    blurred = cv2.gaussianblur(gray, (5, 5), 0)
    edges = cv2.canny(blurred, 80, 180)

    cv2.imwrite(str(output_path / "01_gray.jpg"), gray)
    cv2.imwrite(str(output_path / "02_blurred.jpg"), blurred)
    cv2.imwrite(str(output_path / "03_edges.jpg"), edges)

    print("处理完成,结果已保存。")


detect_edges("demo.jpg", "edge_output")

这个流程适合用来理解很多视觉任务的前处理步骤。

八、完整代码演示

下面是一份完整代码,整合了图片信息读取、缩放、裁剪、灰度化、模糊、边缘检测、批量缩略图和水印功能。

保存为 image_processing_demo.py

from pathlib import path

import cv2
from pil import image, imagedraw, imagefont


image_exts = [".jpg", ".jpeg", ".png", ".bmp"]


def show_image_info(image_path):
    image = image.open(image_path)
    print("图片路径:", image_path)
    print("图片尺寸:", image.size)
    print("图片模式:", image.mode)
    print("图片格式:", image.format)


def resize_keep_ratio(image_path, output_path, new_width=500):
    image = image.open(image_path)
    width, height = image.size
    new_height = int(height * new_width / width)
    resized = image.resize((new_width, new_height))
    resized.save(output_path)


def crop_center(image_path, output_path, crop_width=400, crop_height=300):
    image = image.open(image_path)
    width, height = image.size

    left = (width - crop_width) // 2
    top = (height - crop_height) // 2
    right = left + crop_width
    bottom = top + crop_height

    cropped = image.crop((left, top, right, bottom))
    cropped.save(output_path)


def convert_to_gray(image_path, output_path):
    image = image.open(image_path)
    gray = image.convert("l")
    gray.save(output_path)


def opencv_blur_and_edges(image_path, output_dir):
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    image = cv2.imread(str(image_path))
    if image is none:
        raise filenotfounderror(f"图片读取失败:{image_path}")

    gray = cv2.cvtcolor(image, cv2.color_bgr2gray)
    blurred = cv2.gaussianblur(gray, (5, 5), 0)
    edges = cv2.canny(blurred, 80, 180)

    cv2.imwrite(str(output_path / "gray.jpg"), gray)
    cv2.imwrite(str(output_path / "blurred.jpg"), blurred)
    cv2.imwrite(str(output_path / "edges.jpg"), edges)


def create_thumbnails(input_dir, output_dir, size=(300, 300)):
    input_path = path(input_dir)
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    for file_path in input_path.iterdir():
        if file_path.suffix.lower() not in image_exts:
            continue

        image = image.open(file_path)
        image.thumbnail(size)

        save_path = output_path / f"{file_path.stem}_thumb.jpg"
        image.convert("rgb").save(save_path, quality=90)
        print(f"缩略图已保存:{save_path}")


def load_font(size):
    font_candidates = [
        "c:/windows/fonts/msyh.ttc",
        "c:/windows/fonts/simhei.ttf",
        "arial.ttf"
    ]

    for font_path in font_candidates:
        if path(font_path).exists():
            return imagefont.truetype(font_path, size)

    return imagefont.load_default()


def add_text_watermark(image_path, output_path, text):
    image = image.open(image_path).convert("rgba")
    watermark_layer = image.new("rgba", image.size, (255, 255, 255, 0))
    draw = imagedraw.draw(watermark_layer)

    font = load_font(32)
    text_box = draw.textbbox((0, 0), text, font=font)
    text_width = text_box[2] - text_box[0]
    text_height = text_box[3] - text_box[1]

    x = image.width - text_width - 30
    y = image.height - text_height - 30

    draw.text((x, y), text, font=font, fill=(255, 255, 255, 160))

    result = image.alpha_composite(image, watermark_layer)
    result.convert("rgb").save(output_path, quality=95)


def batch_add_watermark(input_dir, output_dir, text):
    input_path = path(input_dir)
    output_path = path(output_dir)
    output_path.mkdir(parents=true, exist_ok=true)

    for file_path in input_path.iterdir():
        if file_path.suffix.lower() not in [".jpg", ".jpeg", ".png"]:
            continue

        save_path = output_path / f"{file_path.stem}_watermark.jpg"
        add_text_watermark(file_path, save_path, text)
        print(f"水印图片已保存:{save_path}")


def main():
    demo_image = path("demo.jpg")

    if not demo_image.exists():
        print("请先在当前目录准备一张 demo.jpg 测试图片。")
        return

    path("output").mkdir(exist_ok=true)

    show_image_info(demo_image)

    resize_keep_ratio(demo_image, "output/resized.jpg", new_width=500)
    crop_center(demo_image, "output/cropped.jpg", crop_width=400, crop_height=300)
    convert_to_gray(demo_image, "output/gray.jpg")
    opencv_blur_and_edges(demo_image, "output/opencv")
    add_text_watermark(demo_image, "output/watermark.jpg", "python image")

    print("基础图像处理完成,结果在 output 文件夹中。")

    if path("images").exists():
        create_thumbnails("images", "output/thumbnails")
        batch_add_watermark("images", "output/watermarked", "python image")
    else:
        print("如果需要批量处理,请创建 images 文件夹并放入图片。")


if __name__ == "__main__":
    main()

九、运行说明

9.1 安装依赖

pip install pillow opencv-python numpy matplotlib

9.2 准备图片

把一张测试图片命名为:

demo.jpg

并和代码文件放在同一个目录。

9.3 运行程序

python image_processing_demo.py

运行后会生成:

output/
├── resized.jpg
├── cropped.jpg
├── gray.jpg
├── watermark.jpg
└── opencv/
    ├── gray.jpg
    ├── blurred.jpg
    └── edges.jpg

如果你创建了 images 文件夹并放入多张图片,程序还会批量生成缩略图和水印图。

十、常见问题与解决方案

10.1 cv2.imread 读取结果是 none

常见原因:

  • 图片路径写错
  • 文件名不存在
  • 路径中包含特殊字符
  • 图片文件损坏

建议先用 path.exists() 判断文件是否存在。

10.2 opencv 显示颜色不对

opencv 默认是 bgr,matplotlib 默认按 rgb 显示,所以需要转换:

rgb_image = cv2.cvtcolor(image, cv2.color_bgr2rgb)

10.3 水印中文乱码或不显示

通常是字体不支持中文。windows 下可以使用:

font = imagefont.truetype("c:/windows/fonts/msyh.ttc", 32)

10.4 保存 jpg 时报错

如果图片是 rgba 模式,直接保存为 jpg 可能报错,需要先转换为 rgb

image.convert("rgb").save("output.jpg")

十一、图像处理的应用场景

python 图像处理可以应用在很多实际场景中:

  • 电商图片批量压缩、裁剪、水印
  • 证件照背景处理
  • 文档扫描件增强
  • ocr 文字识别前处理
  • 医学影像预处理
  • 工业缺陷检测
  • 视频帧分析
  • 机器学习数据集清洗和增强

如果继续深入,可以学习:

  • opencv 轮廓检测
  • 图像阈值分割
  • 形态学操作
  • 模板匹配
  • 人脸检测
  • 图像分类
  • 目标检测

十二、总结

python 图像处理是一个非常适合通过实践学习的方向。入门阶段建议先掌握 pillow 和 opencv 的基础用法:

  • 使用 pillow 完成图片打开、保存、缩放、裁剪、灰度转换和水印
  • 使用 opencv 完成灰度化、模糊、边缘检测等视觉处理
  • 使用 pathlib 管理文件路径
  • 把单张图片处理扩展为批量图片处理

从学习路径上看,可以先做小工具,再做完整项目。比如先写一个图片缩放脚本,再扩展成批量压缩工具;先做边缘检测,再扩展成轮廓提取和目标识别。

保持学习,保持输出。图像处理并不是只能停留在理论里,只要多动手写代码,一张普通图片也可以变成很好的练习素材。

以上就是python进行图像处理的入门指南的详细内容,更多关于python进行图像处理的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com