图像叠加

引言

记一个生活中的小插曲,在使用 selenium 工具写自动化脚本的时遇到一个非常规的验证码登录情况,例如:上证服务通行证 。该验证码有 4 个字符,但是每次闪动其中 3 个字符(换句话说,当你使用截图工具截图只能截到其中 3 个字符)。解决思路也很简单,就是多张图片叠加出一张完整的验证码图片,然后再使用 ocr 识别验证码。

正文

方法很简单,就是讲图片转为 RGBA 格式;将图像的白色像素更改为透明形式;保存即可。

  • 使用 pillow

    • 写法一

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      from PIL import Image

      def transparent_back():
      img = Image.open("./image.png")
      img = img.convert("RGBA")
      datas = img.getdata()
      data = []

      for item in datas:
      if item[0] == 255 and item[1] == 255 and item[2] == 255:
      data.append((255, 255, 255, 0))
      else:
      data.append(item)

      img.putdata(data)
      img.save("./new_image.png", "PNG")
    • 写法二

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      from PIL import Image

      def transparent_back():
      img = Image.open("./image.png")
      img = img.convert('RGBA')
      L, H = img.size
      color_0 = img.getpixel((0, 0))
      for h in range(H):
      for l in range(L):
      dot = (l, h)
      color_1 = img.getpixel(dot)
      if color_1 == color_0:
      color_1 = color_1[:-1] + (0,)
      img.putpixel(dot, color_1)
      img.save("./new_image.png", "PNG")
  • 使用 opencv

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import cv2

    def merge():
    dsts = []
    images = os.listdir("./images")
    for image in images:
    img = cv2.imread(image, 1)
    dsts.append(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
    while len(dsts) > 1:
    dsts.append(cv2.addWeighted(dsts[0], 0.5, dsts[1], 0.5, 0))
    dsts.pop(0)
    dsts.pop(0)
    cv2.imshow('', dsts[0])
    cv2.waitKey(0)
    cv2.destroyAllWindows()

当然,如果你是保存的 gif 格式的验证码,可以先按照帧率去切割 gifdemo 如下:

1
2
3
4
5
6
7
8
9
10
11
from PIL import Image

def framing_gif():
img = Image.open("./image.gif")
try:
while True:
curr = img.tell()
img.save(f"./第{str(curr + 1)}帧.png")
img.seek(curr + 1)
except Exception as e:
pass

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2023 Leamx's Blog All Rights Reserved.

UV : | PV :