主要是分享记录一下大概思路:
首先是把图片变成灰度图片,理解为黑白,砍掉颜色那些影响因素,因为我这个验证码很多复杂颜色,然后里面很多小点点,就开始去除噪声
最主要是不知道为撒获取下来的文本一直都是比我眼睛看到的多一位,然后输出控制台看的也是一样的,但是就是多一位(因为获取的时候还是会有乱七八糟的问题,多小数点,少数字,所以就开了循环)
然后今天突然想到加个正则,就只取数字,然后取得是列表(业余不是很理解)。反正就是OK了。主要就一个思路,实现方法我看网上挺多,循环个人感觉最简单,因为在灰度的时候就可以一眼识别了
if response.status_code == 200:
# 将响应内容转换成图像对象
image = Image.open(BytesIO(response.content))
image.save('getCoc.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2GRAY)
# 对灰度图像进行阈值处理
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 去除噪声
denoised_image = cv2.GaussianBlur(binary_image, (1, 3), 0)
# 指定语言为数字
custom_config = r'--oem 3 --psm 6 outputbase digits'
text = pytesseract.image_to_string(Image.fromarray(denoised_image), config=custom_config)
# 使用正则表达式匹配数字
numbers = re.findall(r'\d+', text)
# 检查列表是否为空
if numbers:
# 如果列表不为空,则提取第一个元素并打印
first_number = numbers[0]
if len(first_number) == 3 and first_number.isdigit():
print("验证码:", text)
break
else:
print(f"Failed to fetch captcha. Status code: {response.status_code}")