验证码处理
一、 字符验证码
通过某个程序,计算机产生一个字符串,一般四位,包含数字、字母、中文
1、 难点
- 噪点
- 干扰线
- 重叠
- 颜色
- 变形
经过这么一些的操作之后,程序会生成一张图片,而我们要做的就是输入和图片里面的文本信息一致,才算通过校验
2、 图像处理
在数字世界中,有色彩模式这一算法,来表示各种颜色
比较常见的有RGB模式,HSL模式等
基础知识
-
RGB通道
一张彩色图片,包含着R、G、B三个通道,每一个通道用(0, 255)来表示,越接近0,表示该通道的色彩越淡
-
像素
像素是图形单元的 简称,它是位图最小的完整单位。像素具有两种属性:一种是相对于位图图像中的其他像素来说,一个像素具有一个特定的位置;另一种是具有可以用位来度量的颜色深度
-
图像分辨率
图像分辨率通常是指每英寸中像素的个数,用ppi表示。图像分辨率取决于显示图像的大小。分辨率与图像清晰程度成正比。分辨率越高,图像越清晰,当然产生的图形图像文件越大,在图形处理是所需计算机的内存较多,同时CPU处理的时间也就越长
使用PIllow库进行图像处理
3、 实例代码
识别古诗文网的图形验证码:https://so.gushiwen.cn/RandCode.ashx
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: A.L.Kun
# @file : demo01.py
# @time : 2022/4/25 15:22
from requests import get
from PIL import Image
import pytesser3 # 注意,要安装tesseract
from io import BytesIO # 内存IO,将数据写入到内存中去,不会产生文件
img_url = "https://so.gushiwen.cn/RandCode.ashx" # 生成验证码的网址
img_data = BytesIO(get(img_url).content) # 里面传入二进制数据
img = Image.open(img_data) # 打开验证码图片
img = img.convert("L") # 将图片转换为灰度图
# 获取阈值阈值可以通过数组来获取,这里默认方便,默认阈值为175
avg = 175
# 二值化处理
w, h = img.size # 获取图片的大小
pixes = img.load() # 获取照片的像素
for x in range(w):
for y in range(h):
if pixes[x, y] < avg:
pixes[x, y] = 0
else:
pixes[x, y] = 255
# 去除噪点
for x in range(1, w - 1):
for y in range(1, h - 1):
count = 0 # 统计周边摆设像素的个数
if pixes[x, y - 1] > 245: # 如果上面的像素的颜色为白色
count += 1
if pixes[x, y + 1] > 245: # 如果下面的像素的颜色白色
count += 1
if pixes[x - 1, y] > 245: # 如果左边的像素的颜色为白色
count += 1
if pixes[x + 1, y] > 245: # 如果右边的像素的颜色为白色
count += 1
if pixes[x - 1, y - 1] > 245: # 如果左上面的像素的颜色为白色
count += 1
if pixes[x -