Python验证码的实操讲解

简介: Python验证码的实操讲解

大致介绍
  在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类:

    1、计算验证码

   2、滑块验证码

    3、识图验证码

    4、语音验证码

  这篇博客主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库。

  识别验证码通常是这几个步骤:

    1、灰度处理

    2、二值化

    3、去除边框(如果有的话)

    4、降噪

    5、切割字符或者倾斜度矫正

    6、训练字体库

    7、识别

  这6个步骤中前三个步骤是基本的,4或者5可根据实际情况选择是否需要,并不一定切割验证码,识别率就会上升很多有时候还会下降

  这篇博客不涉及训练字体库的内容,请自行搜索。同样也不讲解基础的语法。

  用到的几个主要的python库: Pillow(python图像处理库)、OpenCV(高级图像处理库)、pytesseract(识别库)

  

灰度处理&二值化
  灰度处理,就是把彩色的验证码图片转为灰色的图片。

  二值化,是将图片处理为只有黑白两色的图片,利于后面的图像处理和识别

  在OpenCV中有现成的方法可以进行灰度处理和二值化,处理后的效果:

  

  代码:

复制代码
1 # 自适应阀值二值化
2 def _get_dynamic_binary_image(filedir, img_name):
3 filename = './out_img/' + img_name.split('.')[0] + '-binary.jpg'
4 img_name = filedir + '/' + img_name
5 print('.....' + img_name)
6 im = cv2.imread(img_name)
7 im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #灰值化
8 # 二值化
9 th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)
10 cv2.imwrite(filename,th1)
11 return th1

//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE5MTAyNA==.html
复制代码

去除边框
  如果验证码有边框,那我们就需要去除边框,去除边框就是遍历像素点,找到四个边框上的所有点,把他们都改为白色,我这里边框是两个像素宽

  注意:在用OpenCV时,图片的矩阵点是反的,就是长和宽是颠倒的

  代码:

复制代码

去除边框

def clear_border(img,img_name):
filename = './out_img/' + img_name.split('.')[0] + '-clearBorder.jpg'
h, w = img.shape[:2]
for y in range(0, w):
for x in range(0, h):
if y < 2 or y > w - 2:
img[x, y] = 255
if x < 2 or x > h -2:
img[x, y] = 255

cv2.imwrite(filename,img)
return img
复制代码   

  效果:

降噪
  降噪是验证码处理中比较重要的一个步骤,我这里使用了点降噪和线降噪

  

  线降噪的思路就是检测这个点相邻的四个点(图中标出的绿色点),判断这四个点中是白点的个数,如果有两个以上的白色像素点,那么就认为这个点是白色的,从而去除整个干扰线,但是这种方法是有限度的,如果干扰线特别粗就没有办法去除,只能去除细的干扰线

  代码:

复制代码
1 # 干扰线降噪
2 def interference_line(img, img_name):
3 filename = './out_img/' + img_name.split('.')[0] + '-interferenceline.jpg'
4 h, w = img.shape[:2]
5 # !!!opencv矩阵点是反的
6 # img[1,2] 1:图片的高度,2:图片的宽度
7 for y in range(1, w - 1):
8 for x in range(1, h - 1):
9 count = 0
10 if img[x, y - 1] > 245:
11 count = count + 1
12 if img[x, y + 1] > 245:
13 count = count + 1
14 if img[x - 1, y] > 245:
15 count = count + 1
16 if img[x + 1, y] > 245:
17 count = count + 1
18 if count > 2:
19 img[x, y] = 255
20 cv2.imwrite(filename,img)
21 return img
复制代码

  点降噪的思路和线降噪的差不多,只是会针对不同的位置检测的点不一样,注释写的很清楚了

  代码:

复制代码

点降噪

def interference_point(img,img_name, x = 0, y = 0):
"""
9邻域框,以当前点为中心的田字框,黑点个数
:param x:
:param y:
:return:
"""
filename = './out_img/' + img_name.split('.')[0] + '-interferencePoint.jpg'

# todo 判断图片的长宽度下限
cur_pixel = img[x,y]# 当前像素点的值
height,width = img.shape[:2]

//代码效果参考:https://v.youku.com/v_show/id_XNjQwMDE4NjQwMA==.html

for y in range(0, width - 1):
  for x in range(0, height - 1):
    if y == 0:  # 第一行
        if x == 0:  # 左上顶点,4邻域
            # 中心点旁边3个点
            sum = int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右上顶点
            sum = int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        else:  # 最上非顶点,6邻域
            sum = int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 3 * 245:
              img[x, y] = 0
    elif y == width - 1:  # 最下面一行
        if x == 0:  # 左下顶点
            # 中心点旁边3个点
            sum = int(cur_pixel) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x, y - 1])
            if sum <= 2 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右下顶点
            sum = int(cur_pixel) \
                  + int(img[x, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y - 1])

            if sum <= 2 * 245:
              img[x, y] = 0
        else:  # 最下非顶点,6邻域
            sum = int(cur_pixel) \
                  + int(img[x - 1, y]) \
                  + int(img[x + 1, y]) \
                  + int(img[x, y - 1]) \
                  + int(img[x - 1, y - 1]) \
                  + int(img[x + 1, y - 1])
            if sum <= 3 * 245:
              img[x, y] = 0
    else:  # y不在边界
        if x == 0:  # 左边非顶点
            sum = int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])

            if sum <= 3 * 245:
              img[x, y] = 0
        elif x == height - 1:  # 右边非顶点
            sum = int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x - 1, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1])

            if sum <= 3 * 245:
              img[x, y] = 0
        else:  # 具备9领域条件的
            sum = int(img[x - 1, y - 1]) \
                  + int(img[x - 1, y]) \
                  + int(img[x - 1, y + 1]) \
                  + int(img[x, y - 1]) \
                  + int(cur_pixel) \
                  + int(img[x, y + 1]) \
                  + int(img[x + 1, y - 1]) \
                  + int(img[x + 1, y]) \
                  + int(img[x + 1, y + 1])
            if sum <= 4 * 245:
              img[x, y] = 0
cv2.imwrite(filename,img)
return img

复制代码

相关文章
|
1月前
|
数据采集 机器学习/深度学习 安全
Python爬虫之极验滑动验证码的识别
了解极验滑动验证码、特点、识别思路、初始化、模拟点击、识别缺口、模拟拖动。
184 0
|
1月前
|
算法 定位技术 C语言
【python实操】软件安装进展提示进度条如何实现的?如何设置窗体拉伸?如何获取输入框内容?
【python实操】软件安装进展提示进度条如何实现的?如何设置窗体拉伸?如何获取输入框内容?
60 0
|
11天前
|
存储 JavaScript 前端开发
Python Django下的实现注册验证码
摘要: 使用Python生成随机验证码图像,包括干扰线和噪点,保存到静态文件夹,并将验证码文本存储到数据库。数据库表包含ID、验证码图片路径和验证码文本。JavaScript函数`getRandomInt`生成1到300的随机数,用于请求对应数据库条目的验证码和图片。XMLHttpRequest发送POST请求到服务器,视图函数返回指定ID的验证码图片路径,实现验证码的动态刷新。
|
1月前
|
人工智能 开发工具 Python
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
|
1月前
|
数据采集 文字识别 测试技术
神器!使用Python 轻松识别验证码
本文介绍了使用Python进行验证码识别,主要包括安装Tesseract OCR和相关Python库,如`pytesseract`和`opencv-python`。通过Pillow加载验证码图片,使用`pytesseract`进行简单数字验证码识别。对于数字字母混合的验证码,先进行二值化和降噪处理,然后使用`cv2.findContours`分割字符并分别识别。这种方法适用于自动化测试和爬虫中的验证码处理。
270 2
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
python 数字验证码 自动识别
5月更文挑战第4天
46 3
|
1月前
|
机器学习/深度学习 关系型数据库 MySQL
MySQL 到 Greenplum 实时数据同步实操分享,2024年最新【Python面试题
MySQL 到 Greenplum 实时数据同步实操分享,2024年最新【Python面试题
|
1月前
|
算法 数据可视化 定位技术
【python实操】如何通过简单拖拽直接开发软件,避免手写界面布局
【python实操】如何通过简单拖拽直接开发软件,避免手写界面布局
82 0
|
1月前
|
数据采集 Web App开发 文字识别
Python爬虫之点触验证码的识别
点触验证码识别思路,初始化,获取,识别。
113 0
Python爬虫之点触验证码的识别
|
1月前
|
数据采集 文字识别 开发者
Python爬虫之图形验证码的识别
python爬虫逆向图形验证码分析,处理和测试实战。
77 0

热门文章

最新文章