图形验证码识别算法/Python

最近自己做公司系统的UI自动化,结果遇到了前端同事搞得图形验证码,干扰线比较多,PIL识别率很低,因此自己优化了一下,现在识别率从20%提高到了70%左右
处理前:


1.jpg

处理后


test.png

下面是具体代码:
__author__ = "LandiLiu"
from PIL import ImageEnhance, Image
import pytesseract
def getSecurityCode(path):
    # 原始图像
    image = Image.open (path)

    # 亮度增强
    enh_bri = ImageEnhance.Brightness (image)
    brightness = 1.5
    image_brightened = enh_bri.enhance (brightness)
    image_brightened.save (path)

    # 色度增强
    image = Image.open (path)
    enh_col = ImageEnhance.Color (image)
    color = 1.5
    image_colored = enh_col.enhance (color)
    image_colored.save (path)

    # 对比度增强
    image = Image.open (path)
    enh_con = ImageEnhance.Contrast (image)
    contrast = 1.5
    image_contrasted = enh_con.enhance (contrast)
    image_contrasted.save (path)

    #  锐度增强
    image = Image.open (path)
    enh_sha = ImageEnhance.Sharpness (image)
    sharpness = 3.0
    image_sharped = enh_sha.enhance (sharpness)
    image_sharped.save (path)

    #  黑白化处理
    image = Image.open (path)
    img_blacked = image.convert ('L')
    img_blacked.save (path)
    # text = pytesseract.image_to_string (img_blacked)
    # print (text)

    #去除干扰线
    data = Image.open (path)
    size = data.size
    w = size[0]
    h = size[1]
    buffer = 0
    #进行像素点过滤,判断干扰线像素点8个方向的像素值
    try:
        for i in range (1, w - 1):
            for j in range (1, h - 1):
                if data.getpixel ((i, j - 1)) > 150:
                    buffer += 1
                if data.getpixel ((i, j + 1)) > 150:
                    buffer += 1
                if data.getpixel ((i - 1, j)) > 150:
                    buffer += 1
                if data.getpixel ((i + 1, j)) > 150:
                    buffer += 1
                if data.getpixel ((i - 1, j - 1)) > 150:
                    buffer += 1
                if data.getpixel ((i - 1, j + 1)) > 150:
                    buffer += 1
                if data.getpixel ((i + 1, j - 1)) > 150:
                    buffer += 1
                if data.getpixel ((i + 1, j + 1)) > 150:
                    buffer += 1
                    # print (buffer)
                #对干扰线所在像素点进行置白
                if buffer > 4:
                    data.putpixel ((i, j), 255)
                buffer = 0
        data.save ('test.png')
        text = pytesseract.image_to_string (data)
        return text.replace(' ','')
    except:return -1

如果有其他的优化方法,欢迎留言
ps:未经作者授权禁止转载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 0x00 简介验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微...
    windgod阅读 2,314评论 0 19
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,523评论 25 708
  • 目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。验证码的形式有多种,最常见的就是图片...
    猴哥爱读书阅读 19,901评论 7 15
  • 今天估计得熬夜到凌晨了,简单说,昨天划了重点,雄安三个,一个今天一字板,一个成了龙头[鸡冻],一个是杂毛(金鱼)。...
    南阳说阅读 160评论 0 0
  • 嘟嘟名言:我这人没有什么缺点,就是有点懒!
    悦己人生阅读 339评论 0 0