zoukankan      html  css  js  c++  java
  • OpenCV获取验证码的单个字符(一)

    介绍

      在我们日常上网注册账号以及制作网络爬虫时,经常会遇到奇奇怪怪的验证码,有些容易,有些连人眼都无法辨识。于是,大牛们想到了用深度学习的方法来破解验证码,对于一般的验证码往往能出奇制胜,取得不俗的识别效果。对于利用深度学习方法识别验证码,其预处理就是获取验证码中的单个字符,即字符切割。
      本文将通过一个简单的验证码例子,来展示如何利用OpenCV来获取单个字符。

    手把手教学

      我们所使用的示例验证码如下:

    验证码例子

      首先我们在OpenCV中以灰度模式读取图片(imagepath为图片所在的绝对路径)

     gray = cv2.imread(imagepath, 0)

      处理后的图片如下:

    灰度模式

      接着我们把该验证码的边缘设置为白色255代表白色

     # 将图片的边缘变为白色
        height, width = gray.shape
        for i in range(width):
            gray[0, i] = 255
            gray[height-1, i] = 255
        for j in range(height):
            gray[j, 0] = 255
            gray[j, width-1] = 255

      处理后的图片效果如下:

    去掉边缘

      可以看到,处理后的图片的边缘部分已经置为白色了。
      接着我们需要对图像进行滤波处理,图像滤波的主要目的是为了在保留图像细节的情况下尽量的对图像的噪声进行消除,从而是后来的图像处理变得更加的方便。我们在这里采用中值滤波(median blur)的方法来实现,取孔径大小为3,

     blur = cv2.medianBlur(gray, 3) #模板大小3*3

      处理后的图片效果如下:

    中值滤波

      接着我们需要对图像进行二值化处理,即将图像由灰度模式转化至黑白模式,当然阈值的选择很重要,在这里我们选择二值化的阈值为200,

       ret,thresh1 = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)

      二值化的图片效果如下:

    二值化处理

      最后我们需要在二值化处理后的图片中提取单个字符,主要利用OpenCV中的最小外接矩形函数来提取,代码如下:

     image, contours, hierarchy = cv2.findContours(thresh1, 2, 2)
    
        flag = 1
        for cnt in contours:
            # 最小的外接矩形
            x, y, w, h = cv2.boundingRect(cnt)
            if x != 0 and y != 0 and w*h >= 100:
                print((x,y,w,h))
                # 显示图片
                cv2.imwrite('E://char%s.jpg'%flag, thresh1[y:y+h, x:x+w])
                flag += 1

      需要注意的是,对提取后的图片有一定要求,比如x,y的值不能为0以及图片的大小要超过100,不然我们会得到其他的不想要的图片。提取单个字符后的图片如下:

    提取后的单个字符

      提取的效果还是不错的。

    总结

      本文主要通过一个简单的验证码例子,逐步展示了如何利用OpenCV来获取单个字符,这些都是图像处理的基本技巧。

      最后附上本次操作的Python代码,供大家参考。

    import cv2
    
    def split_picture(imagepath):
    
        # 以灰度模式读取图片
        gray = cv2.imread(imagepath, 0)
    
        # 将图片的边缘变为白色
        height, width = gray.shape
        for i in range(width):
            gray[0, i] = 255
            gray[height-1, i] = 255
        for j in range(height):
            gray[j, 0] = 255
            gray[j, width-1] = 255
    
        # 中值滤波
        blur = cv2.medianBlur(gray, 3) #模板大小3*3
        #print(blur)
    
        # 二值化
        ret,thresh1 = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
        #print(thresh1)
    
        image, contours, hierarchy = cv2.findContours(thresh1, 2, 2)
    
        flag = 1
        for cnt in contours:
            # 最小的外接矩形
            x, y, w, h = cv2.boundingRect(cnt)
            if x != 0 and y != 0 and w*h >= 100:
                print((x,y,w,h))
                # 显示图片
                cv2.imwrite('E://char%s.jpg'%flag, thresh1[y:y+h, x:x+w])
                flag += 1
    
    def main():
        imagepath = 'E://VerifyCode.jpg'
        split_picture(imagepath)
    
    main()
  • 相关阅读:
    python 多进程下的日志打印
    卷积神经网络思考点,卷积网络就是很多个小分类器构建的网络
    ShuffleNetV1 paper reading
    find,grep,mv 组合使用,对大量数据切割方便
    常用的开源协议
    python3 日志重复打印logger
    pytorch clamp 与clamp_区别
    version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference
    pytorch,cuda8,torch.cuda.is_available return flase (ubuntu14)
    opencv remap 函数
  • 原文地址:https://www.cnblogs.com/chen8023miss/p/11445877.html
Copyright © 2011-2022 走看看