简易的验证码自动识别脚本

准备工作

python环境,PILLOW库,pytesseract库

环境搭建

python环境和PILLOW库的搭建不再赘述,主要是pytesseract库搭建需要注意一下,具体搭建细节,参考:pytesseract库安装与使用

项目工程结构图如下:

在这里插入图片描述

最后附上Verify模块中的代码

#-*-coding:utf-8-*-
import os
from PIL import Image,ImageDraw
import pytesseract

class Recognizer(object):
    def __init__(self):
        self.ParentPath = os.path.abspath(os.path.join(os.getcwd(),".."))  #上级目录
        self.DataPath = os.path.join(self.ParentPath,'Data')           #Data目录
        self.ResultsPath = os.path.join(self.ParentPath,'Results')     #Reulsts目录
        self.BlackWhiteImage = None  #存放灰度图像经过阈值划分后的0-1二值图像
        self.tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
        self.t2val = {}

    def ToBlack(self,path):
        """
        将彩色
        :param path: 
        :return: 
        """
        img = Image.open(path)
        w, h = img.size
        for x in range(w):     #这个更改RGB值好像没有什么用
            for y in range(h):
                r, g, b = img.getpixel((x, y))    #检索指定坐标点的像素的RGB颜色值
                if 190 <= r <= 255 and 170 <= g <= 255 and 0 <= b <= 140:
                    img.putpixel((x, y), (0, 0, 0))
                if 0 <= r <= 90 and 210 <= g <= 255 and 0 <= b <= 90:
                    img.putpixel((x, y), (0, 0, 0))
        # img = img.convert('L')       #灰度图像,不是二值图像
        img = img.convert('L').point([0] * 150 + [1] * (256 - 150), '1')  #RGB先转换为灰度公式,然后根据灰度值设定阈值,进行二值化
        self.BlackWhiteImage = img
        return img

    def twoValue(self, G=100):
        for y in xrange(0, self.BlackWhiteImage.size[1]):
            for x in xrange(0, self.BlackWhiteImage.size[0]):
                self.t2val[(x, y)] = self.BlackWhiteImage.getpixel((x, y))  # 这个是二值后的图像像素,将0,255转换为0,1矩阵

    def CleanNoise(self,N=3,Z=2):
        # 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
        # N: Integer 降噪率 0 <N <8,常见的设置为3,效果还行
        # Z: Integer 降噪次数
        # 输出
        #  0:降噪成功
        #  1:降噪失败
        for i in xrange(0, Z):
            self.t2val[(0, 0)] = 1
            self.t2val[(self.BlackWhiteImage.size[0] - 1, self.BlackWhiteImage.size[1] - 1)] = 1

            for x in xrange(1, self.BlackWhiteImage.size[0] - 1):
                for y in xrange(1, self.BlackWhiteImage.size[1] - 1):
                    nearDots = 0
                    L = self.t2val[(x, y)]
                    if L == self.t2val[(x - 1, y - 1)]:
                        nearDots += 1
                    if L == self.t2val[(x - 1, y)]:
                        nearDots += 1
                    if L == self.t2val[(x - 1, y + 1)]:
                        nearDots += 1
                    if L == self.t2val[(x, y - 1)]:
                        nearDots += 1
                    if L == self.t2val[(x, y + 1)]:
                        nearDots += 1
                    if L == self.t2val[(x + 1, y - 1)]:
                        nearDots += 1
                    if L == self.t2val[(x + 1, y)]:
                        nearDots += 1
                    if L == self.t2val[(x + 1, y + 1)]:
                        nearDots += 1

                    if nearDots < N:
                        self.t2val[(x, y)] = 1  # 1白,0黑

    def recognize_captcha(self):
        image = Image.new("1", self.BlackWhiteImage.size)
        draw = ImageDraw.Draw(image)
        for x in xrange(0, self.BlackWhiteImage.size[0]):
            for y in xrange(0, self.BlackWhiteImage.size[1]):
                draw.point((x, y), self.t2val[(x, y)])
        num = pytesseract.image_to_string(image, config=self.tessdata_dir_config)
        return num

    def BeginRecogize(self,path):
        self.ToBlack(path)
        self.twoValue()
        self.CleanNoise(N=3,Z=2)
        res = self.recognize_captcha()
        res = self.StandardOutput(res)
        return res

    def StandardOutput(self,output):
        temp = ''
        for i in range(len(str(output))):
            if(str(output)[i]!=' '):
                temp = temp + str(output)[i]
        return temp.upper()


if __name__ == '__main__':
   # p1 = os.path.abspath(os.path.join(os.getcwd(),".."))
   # print os.path.join(p1,'Data')
   # print ([0] * 150 + [1] * (256 - 150))
   r1 = Recognizer()
   p1 = os.path.join(r1.DataPath,'7.png')
   res = r1.BeginRecogize(p1)
   print res

方法效果:

原图
在这里插入图片描述
识别结果:
在这里插入图片描述
但是针对,一些其他验证码不行,如:
在这里插入图片描述
识别结果为:
在这里插入图片描述

总的来说,效果还有待提高,主要放在图像预处理的算法上,去噪是很关键的一步

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个任务需要用到机器学习和图像处理的知识,需要用到一些 Python 库来实现,比如 TensorFlow,Keras,OpenCV 等。下面是一个基本的示例代码: ```python import numpy as np import cv2 from keras.models import Sequential from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.layers import Dense, Dropout, Flatten from keras.optimizers import Adam # 加载训练数据和标签 training_data = np.load('training_data.npy') training_labels = np.load('training_labels.npy') # 将训练数据和标签进行归一化处理 training_data = training_data.astype('float32') / 255 training_labels = training_labels.astype('float32') # 创建卷积神经网络模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(50, 50, 1))) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['accuracy']) # 训练模型 model.fit(training_data, training_labels, epochs=10, batch_size=32) # 加载验证码图片进行预测 captcha_image = cv2.imread('captcha.png', cv2.IMREAD_GRAYSCALE) captcha_image = cv2.resize(captcha_image, (50, 50)) captcha_image = captcha_image.astype('float32') / 255 captcha_image = captcha_image.reshape((1, 50, 50, 1)) # 预测验证码 prediction = model.predict(captcha_image) # 输出预测结果 print(prediction) ``` 这个示例代码需要两个文件:`training_data.npy` 和 `training_labels.npy`,用于训练模型。你需要自己收集图片数据和标签,并将其转换为 numpy 数组格式保存。同时,你也需要自己手动标注验证码图片的标签。 这个示例代码只是一个基本的框架,还需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值