引言
记一个生活中的小插曲,在使用 selenium
工具写自动化脚本的时遇到一个非常规的验证码登录情况,例如:上证服务通行证 。该验证码有 4
个字符,但是每次闪动其中 3
个字符(换句话说,当你使用截图工具截图只能截到其中 3
个字符)。解决思路也很简单,就是多张图片叠加出一张完整的验证码图片,然后再使用 ocr
识别验证码。
正文
方法很简单,就是讲图片转为 RGBA
格式;将图像的白色像素更改为透明形式;保存即可。
使用
pillow
写法一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from 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
15from 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
15import 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
格式的验证码,可以先按照帧率去切割 gif
, demo
如下:
1 | from PIL import Image |