查看: 110|回复: 3

Python Pillow图像处理教程:滤镜缩放与验证码生成

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
PIL(Python Imaging Library)是Python早期常用的图像处理库,目前已停止维护,实际开发中一般改用它的分支Pillow。Pillow支持更多图像格式,并对原有接口做了改进。安装命令如下:
  1. pip install Pillow
复制代码

安装完成后,导入时仍然使用PIL这个包名:
  1. from PIL import Image
复制代码

下面围绕Pillow的常用函数,按“打开与查看—保存—色彩模式—滤镜—增强—综合应用”的顺序整理一套可直接落地的写法。

一、打开图片、查看格式并显示

Image.open()用于读取图片,参数是图片路径;show()会调用系统默认看图工具把图片展示出来。
  1. from PIL import Image
  2. a = Image.open("F:\\Pictures\\wallhaven-3klw69.jpg")
  3. a.show()
复制代码

打开后可以通过format属性读取图像格式信息,例如JPEG:
  1. from PIL import Image
  2. a = Image.open("F:\\Pictures\\wallhaven-3klw69.jpg")
  3. print(a.format)
  4. a.show()
复制代码

在Windows路径中,反斜杠容易被当成转义符,建议写成双反斜杠,或者使用原始字符串r"F:\Pictures\..."。路径写错或文件不存在时,open()会直接抛出异常,这是排查图片读取失败时首先要确认的地方。

二、save()保存图片及常用参数

save()把图片写到指定路径,最基本的用法是传入目标文件名,格式通常由扩展名推断:
  1. from PIL import Image
  2. a = Image.open(ImgFile)
  3. a.save("D:\\1.jpg")
复制代码

save()还支持一组与格式相关的参数,实际使用时按目标格式选择:

format:指定保存格式,如JPEG、PNG、GIF;不指定时根据文件扩展名自动推断。
quality:用于JPEG,指定图像质量,取值范围为1-95。
optimize:对GIF等格式设置为True,可优化保存后的文件大小。
progressive:用于JPEG,设置为True时生成渐进式JPEG。
compress_level:用于PNG等格式,指定压缩级别,取值0-9,0表示不压缩,9表示最高压缩。
subsampling:用于JPEG,指定色度子采样方式,0表示4:4:4无子采样,1表示4:2:2水平子采样,2表示4:2:0水平和垂直子采样。
dpi:设置图像的DPI,可以传单个整数,也可以传表示水平和垂直DPI的元组。
icc_profile:指定ICC配置文件的路径。
append_images:用于GIF,传入一个图像列表,附加到原始图像之后。
save_all:用于GIF,指定是否保存所有图像帧,默认为False。
loop:用于GIF,指定循环播放次数,传0表示无限循环。
duration:用于GIF,指定每帧之间的显示时间,单位为毫秒。

如果保存时既没有写扩展名,也没有显式传format,就容易出现无法推断格式的问题。压缩级别、quality、optimize这些参数会同时影响文件体积和保存耗时,批量处理时可以先在小样本上确认参数,再应用到全量图片。

三、convert()切换色彩模式

convert()用于把图像转换成指定色彩模式,常见模式如下:
  1. image.convert('1')     # 一位像素,黑白
  2. image.convert('L')     # 8位像素,黑白
  3. image.convert('P')     # 使用调色板的像素模式
  4. image.convert('RGB')   # 3*8位像素,真彩色
  5. image.convert('RGBA')  # 4*8位像素,带透明度掩膜的真彩色
  6. image.convert('YCbCr') # 3*8位像素,彩色视频格式
  7. image.convert('I')     # 32位有符号整数像素
  8. image.convert('F')     # 32位浮点像素
复制代码

不同模式会影响后续处理和保存结果。例如做视频相关的颜色空间转换时可用YCbCr,需要透明通道时用RGBA,只做黑白处理时用L或1。

四、filter()调用ImageFilter滤镜

ImageFilter模块提供了多种内置滤镜,直接传给filter()即可:
  1. from PIL import Image, ImageFilter
  2. im = Image.open("F:\\Pictures\\wallhaven-3klw69.jpg")
  3. im = im.filter(ImageFilter.GaussianBlur)  # 高斯模糊
  4. im = im.filter(ImageFilter.BLUR)          # 普通模糊
  5. im = im.filter(ImageFilter.EDGE_ENHANCE)  # 边缘增强
  6. im = im.filter(ImageFilter.FIND_EDGES)    # 找到边缘
  7. im = im.filter(ImageFilter.CONTOUR)       # 轮廓
  8. im = im.filter(ImageFilter.DETAIL)        # 细节
复制代码

这类滤镜适合做轮廓提取、边缘检测、模糊降噪等预处理。注意每次filter()都会返回新的图像对象,需要重新赋值才能保留处理结果。

五、查看直方图

histogram()返回图像的像素分布统计结果,打印出来是一长串整数,可以用于分析图像各灰度级或通道的像素数量:
  1. print(im.histogram())
复制代码

六、转换图像文件格式

下面这段脚本先判断文件路径是否为字符串、后缀是否属于bmp、gif、png,然后打开图片,转成YCbCr并另存为jpg。文件名通过切片去掉原后缀,再拼接“00.jpg”:
  1. from PIL import Image, ImageFilter
  2. imgFile = "test.gif"
  3. if type(imgFile) == str and imgFile.endswith(('.bmp', '.gif', '.png')):
  4.     im = Image.open(imgFile)
  5.     im.convert('YCbCr').save(imgFile[0:-4] + '00.jpg')
复制代码

这里的后缀判断决定了脚本的适用范围,如果要处理jpg等格式,需要把对应后缀加入判断条件,否则代码不会进入转换分支。

七、屏幕截图

ImageGrab.grab()可以截取屏幕。传入四元组时截取指定区域,不传参数时截取全屏:
  1. from PIL import ImageGrab
  2. im = ImageGrab.grab((0, 0, 800, 200))  # 截取区域:横向0-800,纵向0-200
  3. tm = ImageGrab.grab()                  # 截取全屏
  4. im.show()
  5. tm.show()
复制代码

八、图像缩放

resize()接收目标宽高组成的元组,返回缩放后的新图像:
  1. a = a.resize((2560, 1440))
复制代码

缩放会改变图像尺寸,大图处理时要注意内存占用;如果需要保持比例,应在调用前自行计算目标宽高。

九、ImageEnhance做亮度、色度、对比度和锐度增强

ImageEnhance中的Brightness、Color、Contrast、Sharpness分别对应亮度、色度、对比度和锐度增强。enhance()的参数是增强因子:
  1. from PIL import Image, ImageEnhance
  2. image = Image.open("F:\\Pictures\\won.jpg")
  3. image.show()
  4. # 增强亮度
  5. enh = ImageEnhance.Brightness(image)
  6. brightness = 2
  7. image1 = enh.enhance(brightness)
  8. image1.show()
  9. # 色度增强
  10. enh = ImageEnhance.Color(image)
  11. col = 2
  12. image1 = enh.enhance(col)
  13. image1.show()
  14. # 对比度增强
  15. enh = ImageEnhance.Contrast(image)
  16. con = 2
  17. image1 = enh.enhance(con)
  18. image1.show()
  19. # 锐度增强
  20. enh = ImageEnhance.Sharpness(image)
  21. sha = 2
  22. image1 = enh.enhance(sha)
  23. image1.show()
复制代码

增强因子为2表示在原有基础上加强,实际调参时可以从较小值开始逐步调整,避免图像过曝或失真。

十、综合应用:轮廓处理、纯色图与随机验证码图

轮廓处理可以直接复用CONTOUR滤镜:
  1. from PIL import Image, ImageFilter
  2. image = Image.open("F:\\Pictures\\won.jpg")
  3. image = image.filter(ImageFilter.CONTOUR)
  4. image.show()
复制代码

生成固定尺寸、固定颜色的图片,使用Image.new()新建RGB图像,颜色由随机函数生成:
  1. from PIL import Image
  2. import random
  3. def GetColo():
  4.     a = random.randint(0, 255)
  5.     b = random.randint(0, 255)
  6.     c = random.randint(0, 255)
  7.     return (a, b, c)
  8. image = Image.new('RGB', (150, 50), GetColo())
  9. image = image.save(open("test.png", 'wb'), 'png')
复制代码

生成随机字符串、随机颜色的验证码图片,需要组合ImageDraw和ImageFont:
  1. from PIL import Image, ImageDraw, ImageFont
  2. import random
  3. def GetColor():
  4.     a = random.randint(0, 255)
  5.     b = random.randint(0, 255)
  6.     c = random.randint(0, 255)
  7.     return (a, b, c)
  8. def GetRandom():
  9.     random_num = str(random.randint(0, 9))
  10.     random_low = chr(random.randint(97, 122))  # 小写字母
  11.     random_upp = chr(random.randint(65, 90))   # 大写字母
  12.     random_chr = random.choice([random_upp, random_low, random_num])
  13.     return random_chr
  14. image = Image.new('RGB', (150, 30), GetColor())
  15. draw = ImageDraw.Draw(image)
  16. font = ImageFont.truetype('Sophia Script Free Demo.ttf', 26)
  17. for i in range(5):
  18.     random_char = GetRandom()
  19.     draw.text((10 + i * 30, 0), random_char, GetColor(), font)
  20. image = image.save(open("test.png", 'wb'), 'png')
复制代码

验证码示例中,chr()把ASCII码转换成字符,random.choice()从大小写字母和数字组成的列表中随机取一个;draw.text()按坐标、字符、颜色、字体四个参数把内容画到图上。ImageFont.truetype()依赖本地字体文件,如果指定的ttf文件不存在,字体加载会失败,所以部署脚本时要把字体文件和脚本一起放到可访问的路径。

适用场景与注意点

Pillow适合批量图片格式转换、缩略图生成、滤镜预处理、截图、简单验证码生成和亮度对比度调节等脚本化任务。实际使用时重点确认三件事:图片路径和字体路径是否正确;save()的格式由扩展名还是format参数决定;批量处理时quality、compress_level、optimize等参数对输出体积和耗时的取舍。按照上述函数组合,就能把常见的图像读取、处理、增强和保存流程串成可复用的Python脚本。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python Pillow图像处理教程:滤镜缩放与验证码生成

感谢整理,这套顺序挺清晰的,从打开、保存到色彩模式、滤镜、格式转换基本把常用的都覆盖了。几个我觉得特别实用的点:一是 save() 的参数说明写得很细,像 quality 的 1-95 范围、PNG 的 compress_level、GIF 的 save_all/loop/duration,之前我批量转图时就是卡在没显式指定 format 导致推断失败;二是 filter() 每次返回新对象、必须重新赋值这一句,新手很容易踩坑;三是 convert 那一段把 YCbCr、RGBA、L 的适用场景点到,比单纯列模式名好理解多了。 另外想问下,第七部分屏幕截图那块好像没贴完,ImageGrab.grab() 后面四元组区域截取的完整写法还在吗?方便的话可以补一下,正好接着这个教程继续看。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python Pillow图像处理教程:滤镜缩放与验证码生成

教程整理得挺系统的,从打开、保存、色彩模式到滤镜和验证码生成的前置部分都覆盖到了,尤其 save 那组参数列得很全,实际批量处理图片时能少查很多文档。路径反斜杠和 filter 每次返回新对象要重新赋值这两点也提醒得很到位,都是容易踩坑的地方。 有个小地方想确认一下:第七节屏幕截图好像没贴完,内容到“from PIL import ImageGrab i”就断了,方便的话可以把 grab 区域参数和全屏截取的完整写法补上。另外第六节里转成 YCbCr 再存 jpg,和直接 RGB 存 jpg 相比,实际观感上差别大吗?我平时直接 save 也没太注意色彩空间这块。 整体来说这篇很适合当速查手册,后面如果能把验证码生成那段也补上就更完整了。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python Pillow图像处理教程:滤镜缩放与验证码生成

整理得挺系统的,从打开查看、保存、色彩模式到滤镜和直方图,顺序清晰,对新手很友好。几个点特别实用:一是开头说明 PIL 已停止维护、实际用 Pillow,但导入仍写 from PIL,这个容易踩的坑点到就清楚了;二是 save 那一串参数列得很细,quality、optimize、compress_level 对体积和耗时的取舍,以及先小样本试参数再批量,是真正干活时的经验;三是提醒 filter 每次返回新对象、必须重新赋值,这类细节不写出来很多人会白折腾半天。 不过帖子好像没发完,第七节屏幕截图停在 from PIL import ImageGrab 就断了,标题里的“缩放”和“验证码生成”正文也还没出现。验证码生成这块其实挺多人需要,比如随机字符加点噪点、干扰线、随机旋转,再配合你前面讲的 save 参数输出,正好串起来。如果方便的话,希望能把截图那节补完,再把缩放和验证码部分续上,尤其是验证码里字体加载、字符随机位置和噪点控制这些容易出问题的环节,期待后续。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-13 05:51 , Processed in 0.022402 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部