Python代码怎样进行图像处理 Python代码通过PIL库操作图片的示例

星夢妙者
发布: 2025-11-03 22:07:02
原创
817人浏览过
答案:Pillow是Python图像处理的核心库,支持图像读取、保存、裁剪、旋转、缩放、滤镜应用等操作,通过Image模块实现基础功能,ImageFilter模块提供模糊、锐化、边缘检测等内置滤镜,结合ImageDraw可添加文字水印,支持像素级操作与颜色模式转换;对于高性能需求或超大图像处理,其内存占用高、计算效率有限,可结合NumPy进行数组运算优化,或转向OpenCV(适用于实时处理与计算机视觉)与scikit-image(适用于科学图像分析)等更专业的库以突破局限。

python代码怎样进行图像处理 python代码通过pil库操作图片的示例

Python进行图像处理,最常用且功能强大的库之一是PIL(Pillow)。它提供了一系列工具,可以轻松实现图像的读取、保存、裁剪、旋转、调整大小、滤镜应用等操作,让开发者能够以代码的方式高效地操作图像文件。

解决方案

谈到Python里的图像处理,我脑子里首先浮现的就是Pillow库。它其实是PIL(Python Imaging Library)的一个友好分支,因为PIL本身已经停止更新很久了,而Pillow则完美地接棒,持续维护和发展。在我看来,它简直是Python处理图像的瑞士军刀,从最简单的图片打开、保存,到复杂的像素操作、滤镜应用,几乎都能胜任。

要开始使用Pillow,首先得安装它:

pip install Pillow
登录后复制

安装好之后,我们就可以开始玩转图片了。以下是一些核心操作的示例,你会发现它的API设计得非常直观。

立即学习Python免费学习笔记(深入)”;

1. 打开和显示图片

这是最基础的一步。Image.open() 方法会返回一个 Image 对象,代表了你的图片。

from PIL import Image

try:
    img = Image.open("example.jpg") # 确保当前目录下有这张图片
    print(f"图片格式: {img.format}, 尺寸: {img.size}, 模式: {img.mode}")
    img.show() # 在默认图片查看器中显示图片
except FileNotFoundError:
    print("错误:example.jpg 文件未找到。请确保图片存在。")
except Exception as e:
    print(f"打开图片时发生错误: {e}")
登录后复制

这里 img.format 会告诉你图片是JPEG、PNG还是其他格式,img.size 是一个元组 (width, height)img.mode 则是图片的像素模式,比如'RGB'(真彩色)、'L'(灰度图)等。

2. 保存图片

处理完图片后,通常需要保存下来。save() 方法非常灵活,你可以指定新的文件名和格式。

# 假设我们已经打开了一张图片 img
img.save("new_example.png") # 保存为PNG格式,Pillow会根据后缀自动识别
img.save("compressed_example.jpg", quality=80) # 保存为JPEG,并指定压缩质量(0-100)
print("图片已保存。")
登录后复制

3. 调整图片大小 (Resize)

这是我个人最常用到的功能之一,比如上传头像、生成缩略图。

# 假设 img 是一张图片
width, height = img.size
new_size = (width // 2, height // 2) # 缩小到原来的一半
resized_img = img.resize(new_size)
resized_img.save("resized_example.jpg")

# 也可以使用 thumbnail 方法,它会保持图片的宽高比,并且只在图片大于指定尺寸时缩小
img.thumbnail((128, 128)) # 如果图片大于128x128,则缩小到128x128,保持比例
img.save("thumbnail_example.jpg")
print("图片已调整大小。")
登录后复制

thumbnail 方法在处理缩略图时尤其方便,它不会拉伸图片,只会等比例缩小。

4. 裁剪图片 (Crop)

如果你只需要图片的一部分,裁剪功能就派上用场了。crop() 方法需要一个四元组 (left, upper, right, lower) 来定义裁剪区域。

# 裁剪图片,从左上角 (100, 100) 到右下角 (300, 300)
cropped_img = img.crop((100, 100, 300, 300))
cropped_img.save("cropped_example.jpg")
print("图片已裁剪。")
登录后复制

5. 旋转图片 (Rotate)

图片旋转也很常见,比如纠正照片方向。

rotated_img = img.rotate(90) # 顺时针旋转90度
rotated_img.save("rotated_90_example.jpg")

# 还可以进行翻转操作
flipped_horizontal_img = img.transpose(Image.FLIP_LEFT_RIGHT)
flipped_horizontal_img.save("flipped_h_example.jpg")
print("图片已旋转或翻转。")
登录后复制

6. 颜色模式转换

有时候我们需要将彩色图片转换为灰度图,或者反之。

grayscale_img = img.convert("L") # 转换为灰度图 (L代表Luminance)
grayscale_img.save("grayscale_example.jpg")

# 如果想转回RGB,可以这样做(虽然灰度图转回RGB不会恢复颜色)
rgb_img = grayscale_img.convert("RGB")
rgb_img.save("grayscale_to_rgb_example.jpg")
print("图片已转换颜色模式。")
登录后复制

这些只是Pillow库的冰山一角,但它们构成了日常图像处理的基石。掌握了这些,你会发现很多图像相关的自动化任务变得轻而易举。

代码小浣熊
代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

代码小浣熊 51
查看详情 代码小浣熊

Pillow库在图像处理中如何实现滤镜效果和高级操作?

当基础操作满足不了需求时,Pillow提供了一些内置的滤镜和更灵活的像素级操作,让我们能实现更高级的效果。我经常用到的就是它的ImageFilter模块,以及直接操作像素数据的能力。

1. 应用内置滤镜

Pillow自带了一些常用的图像滤镜,比如模糊、锐化、边缘检测等。这些滤镜通常封装在PIL.ImageFilter模块中,用起来非常方便。

from PIL import Image, ImageFilter

try:
    img = Image.open("example.jpg")

    # 应用模糊滤镜
    blurred_img = img.filter(ImageFilter.BLUR)
    blurred_img.save("blurred_example.jpg")

    # 应用边缘检测滤镜
    edge_detected_img = img.filter(ImageFilter.FIND_EDGES)
    edge_detected_img.save("edge_detected_example.jpg")

    # 应用锐化滤镜
    sharpened_img = img.filter(ImageFilter.SHARPEN)
    sharpened_img.save("sharpened_example.jpg")

    print("已应用多种内置滤镜。")

except FileNotFoundError:
    print("错误:example.jpg 文件未找到。")
except Exception as e:
    print(f"应用滤镜时发生错误: {e}")
登录后复制

ImageFilter里还有CONTOUR(轮廓)、EMBOSS(浮雕)、SMOOTH(平滑)等多种滤镜,可以根据需求尝试。

2. 图像合成与叠加

Pillow允许你将多张图片合成或叠加在一起,这在制作水印、海报或图片蒙版时非常有用。Image.alpha_composite()Image.paste()是两个核心方法。

from PIL import Image

try:
    base_img = Image.open("example.jpg").resize((400, 300)) # 调整大小方便演示
    # 创建一个半透明的水印图片
    watermark_text = Image.new("RGBA", (200, 100), (255, 255, 255, 0)) # 全透明背景
    from PIL import ImageDraw, ImageFont
    draw = ImageDraw.Draw(watermark_text)
    try:
        font = ImageFont.truetype("arial.ttf", 30) # 尝试加载字体,Windows系统一般有arial.ttf
    except IOError:
        font = ImageFont.load_default() # 如果找不到arial.ttf,则使用默认字体
        print("警告:未找到arial.ttf,使用默认字体。")

    draw.text((10, 20), "My Watermark", font=font, fill=(0, 0, 0, 128)) # 黑色半透明文字

    # 将水印粘贴到基础图片上
    # paste方法可以指定一个mask,实现透明度效果
    base_img.paste(watermark_text, (base_img.width - watermark_text.width - 10,
                                    base_img.height - watermark_text.height - 10),
                   watermark_text)
    base_img.save("watermarked_example.png")
    print("图片已添加水印。")

except FileNotFoundError:
    print("错误:example.jpg 文件未找到。")
except Exception as e:
    print(f"合成图片时发生错误: {e}")
登录后复制

这里用到了ImageDraw模块来在图片上绘制文本,这在生成动态图片或添加文字说明时非常实用。

3. 像素级操作

对于更精细的控制,你可以直接访问和修改图片的像素数据。Pillow提供了load()方法来获取像素访问对象,或者getpixel()putpixel()。不过,直接遍历像素通常效率不高,更推荐使用point()eval()方法配合函数来批量处理。

from PIL import Image

try:
    img = Image.open("example.jpg").convert("RGB") # 确保是RGB模式,方便操作
    pixels = img.load() # 获取像素访问对象

    # 将图片每个像素的R通道值加50 (简单示例,可能导致溢出)
    # 注意:直接修改像素在Python中通常较慢,尤其对于大图
    for i in range(img.width):
        for j in range(img.height):
            r, g, b = pixels[i, j]
            pixels[i, j] = (min(r + 50, 255), g, b) # 避免R值超过255

    img.save("pixel_manipulated_example.jpg")
    print("图片已进行像素级操作。")

    # 更高效的像素级操作:使用point()方法
    # 比如,反转颜色 (255 - pixel_value)
    inverted_img = img.point(lambda p: 255 - p)
    inverted_img.save("inverted_example.jpg")
    print("图片已反转颜色。")

except FileNotFoundError:
    print("错误:example.jpg 文件未找到。")
except Exception as e:
    print(f"像素操作时发生错误: {e}")
登录后复制

point()方法接收一个函数,这个函数会对图片每个通道的像素值进行操作,效率远高于手动遍历。这在进行一些简单的颜色调整或查找表(LUT)操作时非常有用。

处理大型图像或追求性能时,Pillow库有哪些局限与替代方案?

Pillow库无疑是Python图像处理的佼佼者,但任何工具都有其适用范围和局限性。在我实际工作中,尤其是在处理超大尺寸图片(比如几亿像素的卫星图)或者需要极高性能的场景(比如实时视频流处理)时,Pillow的某些方面可能就显得力不从心了。

Pillow的局限性主要体现在:

  1. 内存占用: Pillow在处理图像时,通常会将整个图像加载到内存中。对于MB级别甚至GB级别的超大图片,这可能会迅速耗尽系统内存,导致程序崩溃或运行缓慢。尽管它有一些分块处理的机制,但默认行为还是整体加载。
  2. 性能瓶颈: 尽管Pillow底层是用C语言实现的,对于大多数操作来说速度很快,但在进行复杂的像素级迭代操作时,由于Python解释器的开销,性能可能不如专门为高性能图像处理设计的库。例如,复杂的卷积运算、特征提取等,如果纯粹用Pillow的像素操作来实现,效率会比较低。
  3. 高级计算机视觉功能: Pillow主要专注于图像的IO、基本变换和一些滤镜。它不提供开箱即用的高级计算机视觉算法,比如目标检测、图像识别、深度学习模型推理等。这些功能需要更专业的库来支持。

那么,当Pillow遇到瓶颈时,我们有哪些替代方案或者辅助工具呢?

  1. OpenCV (Open Source Computer Vision Library):

    • 优点: 这是一个功能极其强大的计算机视觉库,用C++编写,并提供了Python接口。它在性能上远超Pillow,尤其擅长处理视频流、实时图像分析、特征提取、机器学习集成等。OpenCV对NumPy数组的支持非常好,这意味着你可以直接在NumPy数组上进行高效的数学运算。
    • 应用场景: 人脸识别、目标跟踪、图像拼接、三维重建、机器学习模型集成等。
    • 何时考虑: 当你需要进行高性能的实时处理、复杂的计算机视觉算法或者与深度学习框架结合时,OpenCV是首选。
  2. scikit-image:

    • 优点: 这是一个基于NumPy的图像处理库,专注于科学图像处理。它提供了大量的算法,包括图像分割、特征提取、几何变换、形态学操作等,并且API设计得非常“Pythonic”,与scikit-learn等科学计算库保持一致。
    • 应用场景: 科学研究、医学影像分析、图像测量、高级图像增强。
    • 何时考虑: 当你需要进行复杂的图像分析、测量,或者需要应用一些在计算机视觉领域较新的算法时,scikit-image是一个很好的选择。它与Pillow可以很好地配合使用,Pillow负责IO,scikit-image负责处理。
  3. NumPy (配合Pillow):

    • 优点: Pillow的Image对象可以方便地与NumPy数组进行转换(np.array(img)Image.fromarray(np_array))。这意味着你可以利用NumPy强大的数组操作能力进行高效的像素级处理,尤其是在进行颜色通道分离、数学运算、矩阵变换等方面。
    • 应用场景: 自定义滤镜、复杂的颜色空间转换、批量像素值调整。
    • 何时考虑: 当你需要对图像进行自定义的、基于数学运算的像素级处理,并且希望获得比Pillow内置point()方法更灵活、更高效的控制时。

总结一下我的看法:

Pillow是Python图像处理的绝佳起点,它简单易用,能够满足绝大部分日常需求。但如果你的项目涉及到:

  • 超大图片,导致内存不足。
  • 实时性要求高,Pillow的Python层开销过大。
  • 高级计算机视觉算法,Pillow没有直接支持。

那么,这时候就应该考虑引入OpenCV或scikit-image,甚至结合NumPy来发挥它们的专长。通常,我会在项目初期优先考虑Pillow,如果遇到性能瓶颈或者功能缺失,再逐步引入更专业的库,这样可以保持代码的简洁性和开发效率。

以上就是Python代码怎样进行图像处理 Python代码通过PIL库操作图片的示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号