小工具知识网

当前位置: 首页 > 行业知识 > 计算机设计大赛 深度学习验证码识别 - 机器视觉 python opencv

行业知识

计算机设计大赛 深度学习验证码识别 - 机器视觉 python opencv

2026-11-13 02:28:43 来源:互联网转载

文章目录

  • 0 前言
  • 1 项目简介
  • 2 验证码识别步骤
    • 2.1 灰度处理&二值化
    • 2.2 去除边框
    • 2.3 图像降噪
    • 2.4 字符切割
    • 2.5 识别
    • 3 基于tensorflow的验证码识别
      • 3.1 数据集
      • 3.2 基于tf的神经网络训练代码
      • 4 ���后

        0 前言

        优质竞赛项目系列,今天要分享的是

        深度学习验证码识别 - 机器视觉 python opencv

        该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

        学长这里给一个题目综合评分(每项满分5分)

        • 难度系数:3分
        • 工作量:3分
        • 创新点:4分

          更多资料, 项目分享:

          https://gitee.com/dancheng-senior/postgraduate

          1 项目简介

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

          • 1、计算验证码

          • 2、滑块验证码

          • 3、识图验证码

          • 4、语音验证码

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

            2 验证码识别步骤

            1、灰度处理

            2、二值化

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

            4、降噪

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

            6、训练字体库

            7、识别

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

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

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

            2.1 灰度处理&二值化

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

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

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

            ​

            # 自适应阀值二值化def _get_dynamic_binary_image(filedir, img_name):  filename =   './out_img/' + img_name.split('.')[0] + '-binary.jpg'  img_name = filedir + '/' + img_name  print('.....' + img_name)  im = cv2.imread(img_name)  im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #灰值化  # 二值化  th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)  cv2.imwrite(filename,th1)  return th1

            2.2 去除边框

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

            注意:在用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  w - 2:        img[x, y] = 255      if x  h -2:        img[x, y] = 255  cv2.imwrite(filename,img)  return img

            效果

            2.3 图像降噪

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

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

            ​

            # 干扰线降噪def interference_line(img, img_name):  filename =  './out_img/' + img_name.split('.')[0] + '-interferenceline.jpg'  h, w = img.shape[:2]  # !!!opencv矩阵点是反的  # img[1,2] 1:图片的高度,2:图片的宽度  for y in range(1, w - 1):    for x in range(1, h - 1):      count = 0      if img[x, y - 1] > 245:        count = count + 1      if img[x, y + 1] > 245:        count = count + 1      if img[x - 1, y] > 245:        count = count + 1      if img[x + 1, y] > 245:        count = count + 1      if count > 2:        img[x, y] = 255  cv2.imwrite(filename,img)  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]    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     private static Random random = new Random();    private static ConfigurableCaptchaService cs = new ConfigurableCaptchaService();    static {        // cs.setColorFactory(new SingleColorFactory(new Color(25, 60, 170)));        cs.setColorFactory(new ColorFactory() {            @Override            public Color getColor(int x) {                int[] c = new int[3];                int i = random.nextInt(c.length);                for (int fi = 0; fi 

上一篇:轻松下载Word、PDF、PPT文件全攻略!

下一篇:掌握滑动验证码操作技巧,手机验证流程详解!