Python PIL模块核心功能实战:图像二值化、坐标匹配与屏幕截图

Alice
Alice
发布时间:2026-10-14 | 2人浏览过
原创

本文详解Python PIL模块的三大核心应用:通过convert('L')与point方法实现图像黑白化及阈值处理;利用像素遍历算法计算小图在大图中的精确坐标;以及使用ImageGrab模块进行全屏或指定区域的屏幕截图。涵盖关键参数设置与代码实现,适用于图像识别与自动化测试场景。

PIL模块基础与图像预处理

PIL模块提供了丰富的图像处理能力,本节首先介绍其基础功能。通过导入Image和ImageEnhance类,可以加载图片并进行展示。示例代码展示了如何打开指定路径的图片文件,并调用show()方法预览。此外,还演示了图像的二值化处理,即将彩色图像转换为灰度模式('L'模式),以及调整图像尺寸,例如将宽度和高度分别放大3倍和4倍,并使用ANTIALIAS算法进行高质量缩放。


from PIL import Image
from PIL import ImageEnhance
 
img = Image.open(r'E:\img\f1.png')
img.show()
#图像二值化
img = img.convert('L')
# 图像放大
img = img.resize((img.width * int(3), img.height * int(4)), Image.ANTIALIAS)
# # 对比度增强
enh_con = ImageEnhance.Contrast(img)
contrast = 2
img_contrasted = enh_con.enhance(contrast)
# 亮度增强
enh_bri = ImageEnhance.Brightness(img_contrasted)
brightness = 2.5
image_brightened = enh_bri.enhance(brightness)
#色度增强
enh_col = ImageEnhance.Color(img)
color = 50
image_colored = enh_col.enhance(color)
# # 锐度增强
enh_sha = ImageEnhance.Sharpness(img)
sharpness = 2
image_sharped = enh_sha.enhance(sharpness)
image_sharped.save(r'E:\img\f22.png', dpi=(300, 300), quality=95)
# image_sharped.save(r'E:\img\f22.png')
 
# 图片汉字识别
img2 = Image.open(r'E:\img\f22.png')
code2 = pytesseract.image_to_string(img2, lang='chi_sim')
# print(code2)
# 图片裁剪
image_cro = Image.open(r'E:\img\f24.png')
image_cropped = image_cro.crop(res)
image_cropped.save(u'E:\img\\f25.png') 

在图像黑白化处理中,除了简单的灰度转换,还可以通过阈值控制实现更精细的二值化效果。代码示例中,首先打开主图片并转换为灰度模式,设定阈值threshold1为138。接着构建一个包含256个元素的查找表table1,当像素值小于阈值时存入0,否则存入1。最后利用point()方法结合该查找表对图像进行二值化处理,并保存结果。这种方法常用于OCR前的预处理,以提高识别率。

基于阈值的图像二值化处理


img_main = Image.open(u'E:/login1.png')
img_main = img_main.convert('L')
threshold1 = 138
table1 = []
for i in range(256):
  if i < threshold1:
    table1.append(0)
  else:
    table1.append(1)
img_main = img_main.point(table1, "1")
img_main.save(u'E:/login3.png')

计算小图在大图中的坐标是图像匹配中的常见需求。该算法首先将主图和子图均转换为灰度并进行二值化处理,设定相同的阈值138。随后,将图像数据转换为列表格式。通过遍历主图的像素数据,寻找与子图前两个像素值匹配的位置作为起始点。接着,逐行比对子图数据与主图中对应区域的数据,若所有像素均匹配,则返回该区域的左上角坐标及宽高;若未找到匹配区域,则返回False。此方法适用于简单的模板匹配场景。

小图在大图中的坐标匹配算法


def get_screenxy_from_bmp(main_bmp, son_bmp):
  # 获取屏幕上匹配指定截图的坐标->(x,y,width,height)
 
  img_main = Image.open(main_bmp)
  img_main = img_main.convert('L')
  threshold1 = 138
  table1 = []
  for i in range(256):
    if i < threshold1:
      table1.append(0)
    else:
      table1.append(1)
  img_main = img_main.point(table1, "1")
 
  img_son = Image.open(son_bmp)
  img_son = img_son.convert('L')
  threshold2 = 138
  table2 = []
  for i in range(256):
    if i < threshold2:
      table2.append(0)
    else:
      table2.append(1)
  img_son = img_son.point(table2, "1")
 
  datas_a = list(img_main.getdata())
  datas_b = list(img_son.getdata())
  for i, item in enumerate(datas_a):
    if datas_b[0] == item and datas_a[i + 1] == datas_b[1]:
      yx = divmod(i, img_main.size[0])
      main_start_pos = yx[1] + yx[0] * img_main.size[0]
 
      match_test = True
      for n in range(img_son.size[1]):
        main_pos = main_start_pos + n * img_main.size[0]
        son_pos = n * img_son.size[0]
 
        if datas_b[son_pos:son_pos + img_son.size[0]] != datas_a[main_pos:main_pos + img_son.size[0]]:
          match_test = False
          break
      if match_test:
        return (yx[1], yx[0], img_son.size[0], img_son.size[1])
  return False

PIL模块中的ImageGrab类可用于实现屏幕截图功能。最简单的用法是直接调用grab()方法截取整个屏幕,并保存为PNG文件。此外,ImageGrab.grab()支持传入bbox参数,以指定截图的区域。bbox参数是一个包含四个整数的元组,分别代表开始截图的x坐标、y坐标、结束截图的x坐标和y坐标。通过指定具体的坐标范围,可以实现对屏幕特定区域的精准截图,这在自动化测试和监控场景中非常实用。

使用ImageGrab进行屏幕截图


im = ImageGrab.grab()
im.save('D:/as1.png')
 
#   # # # 参数说明
#   # # # 第一个参数 开始截图的x坐标
#   # # # 第二个参数 开始截图的y坐标
#   # # # 第三个参数 结束截图的x坐标
#   # # # 第四个参数 结束截图的y坐标
bbox = (897, 131, 930, 148)
im = ImageGrab.grab(bbox)
im.save('D:/as2.png')

以上介绍了Python PIL模块在图像黑白化、坐标匹配计算以及屏幕截图方面的基本使用方法。这些功能涵盖了图像处理的基础操作和常见应用场景。如需了解更多关于Python PIL模块的高级用法或相关技术细节,建议参考本站其他相关文章或官方文档。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表