Python图片验证码降噪 — 8邻域降噪

简介

图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是:

  • 1.灰度处理&二值化
  • 2.降噪
  • 3.字符分割
  • 4.标准化
  • 5.识别

所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只留下需要识别的字符,让图片变成2进制点阵,方便代入模型训练。

8邻域降噪

8邻域降噪 的前提是将图片灰度化,即将彩色图像转化为灰度图像。以RGN色彩空间为例,彩色图像中每个像素的颜色由R 、G、B三个分量决定,每个分量由0到255种取值,这个一个像素点可以有一千多万种颜色变化。而灰度则是将三个分量转化成一个,使每个像素点只有0-255种取值,这样可以使后续的图像计算量变得少一些。

以上面的灰度图片为例,图片越接近白色的点像素越接近255,越接近黑色的点像素越接近0,而且验证码字符肯定是非白色的。对于其中噪点大部分都是孤立的小点的,而且字符都是串联在一起的。8邻域降噪 的原理就是依次遍历图中所有非白色的点,计算其周围8个点中属于非白色点的个数,如果数量小于一个固定值,那么这个点就是噪点。对于不同类型的验证码这个阈值是不同的,所以可以在程序中配置,不断尝试找到最佳的阈值。

经过测试8邻域降噪 对于小的噪点的去除是很有效的,而且计算量不大,下图是阈值设置为4去噪后的结果:

Pillow实现

下面是使用 Pillow 模块的实现代码:

from PIL import Image

def noise_remove_pil(image_name, k):
    """
    8邻域降噪
    Args:
        image_name: 图片文件命名
        k: 判断阈值

    Returns:

    """

    def calculate_noise_count(img_obj, w, h):
        """
        计算邻域非白色的个数
        Args:
            img_obj: img obj
            w: width
            h: height
        Returns:
            count (int)
        """
        count = 0
        width, height = img_obj.size
        for _w_ in [w - 1, w, w + 1]:
            for _h_ in [h - 1, h, h + 1]:
                if _w_ > width - 1:
                    continue
                if _h_ > height - 1:
                    continue
                if _w_ == w and _h_ == h:
                    continue
                if img_obj.getpixel((_w_, _h_)) < 230:  # 这里因为是灰度图像,设置小于230为非白色
                    count += 1
        return count

    img = Image.open(image_name)
    # 灰度
    gray_img = img.convert('L')

    w, h = gray_img.size
    for _w in range(w):
        for _h in range(h):
            if _w == 0 or _h == 0:
                gray_img.putpixel((_w, _h), 255)
                continue
            # 计算邻域非白色的个数
            pixel = gray_img.getpixel((_w, _h))
            if pixel == 255:
                continue

            if calculate_noise_count(gray_img, _w, _h) < k:
                gray_img.putpixel((_w, _h), 255)
    return gray_img

if __name__ == '__main__':
    image = noise_remove_pil("test.jpg", 4)
    image.show()

OpenCV实现

使用OpenCV可以提高计算效率:

import cv2

def noise_remove_cv2(image_name, k):
    """
    8邻域降噪
    Args:
        image_name: 图片文件命名
        k: 判断阈值

    Returns:

    """

    def calculate_noise_count(img_obj, w, h):
        """
        计算邻域非白色的个数
        Args:
            img_obj: img obj
            w: width
            h: height
        Returns:
            count (int)
        """
        count = 0
        width, height = img_obj.shape
        for _w_ in [w - 1, w, w + 1]:
            for _h_ in [h - 1, h, h + 1]:
                if _w_ > width - 1:
                    continue
                if _h_ > height - 1:
                    continue
                if _w_ == w and _h_ == h:
                    continue
                if img_obj[_w_, _h_] < 230:  # 二值化的图片设置为255
                    count += 1
        return count

    img = cv2.imread(image_name, 1)
    # 灰度
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    w, h = gray_img.shape
    for _w in range(w):
        for _h in range(h):
            if _w == 0 or _h == 0:
                gray_img[_w, _h] = 255
                continue
            # 计算邻域pixel值小于255的个数
            pixel = gray_img[_w, _h]
            if pixel == 255:
                continue

            if calculate_noise_count(gray_img, _w, _h) < k:
                gray_img[_w, _h] = 255

    return gray_img

if __name__ == '__main__':
    image = noise_remove_cv2("test.jpg", 4)
    cv2.imshow('img', image)
    cv2.waitKey(10000)

原文地址:https://www.cnblogs.com/jhao/p/10345853.html

时间: 2024-10-11 06:23:06

Python图片验证码降噪 — 8邻域降噪的相关文章

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)

现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一.这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码.代码中有详细注释. #!/usr/bin/env python #coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.

Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed

最近在用Python开发自己的博客,需要用到Python生成验证码,当然肯定要用到Python的图形处理库PIL,因为我用的是windows. 所以在安装好pil之后就开始写,就按照题目所说出现了The _imagingft C module is not installed 错误,找了很多建议,最后确定在windows下应该用pillpw.下载地址 点击打开链接 找到 Pillow?2.5.2.win32?py2.7.exe因为我用的是python2.7和win32系统,所以就应该下载这个,大

Python Scrapy 验证码登录处理

一.Form表单分析 以豆瓣登录页面为例分析,豆瓣登录页是:https://accounts.douban.com/login,浏览器打开之后查看源码,查找登录的form表单HTML结构.如下: 包括了form_email.form_password.captcha-solution四个表单参数,需要注意之处是name,而不是id. 二.验证码图片处理 1.分析验证码参数图片的构建如下图,获取id为captcha_image的src图片即可.可以采用人工输入,或第三方图片验证码识别API获得.

使用python识别验证码

公司的登录注册等操作有验证码,测试环境可以让开发屏蔽掉验证码,但是如果到线上的话就要想办法识别验证码或必过验证码了. 识别验证码主要分为三部分,一.对验证码进行二值化.二.将二值化后的图片分割.三.进行识别.理论上在识别之前有一个标准化的操作,是将图片进行旋转等操作,尽量将字符弄成一样的格式,方便识别,避免随进图片的差异. 用这个验证码作为例子:.下面是代码: 一.打开图片,将图片二值化. 图片是由RGB三个通道组成的,图片的验证码和他的干扰,比如点或横线等,RGB的阙值有很大的区别,我们可以使

python之验证码识别 特征向量提取和余弦相似性比较

0.目录 1.参考2.没事画个流程图3.完整代码4.改进方向 1.参考 https://en.wikipedia.org/wiki/Cosine_similarity https://zh.wikipedia.org/wiki/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E6%80%A7 Cosine similarityGiven two vectors of attributes, A and B, the cosine similarity, cos(θ),

day20 project+查看新闻列表 + 点赞 + 图片验证码 + 评论和多级评论 + 后台管理 + webSocket + kindEditor

Day20回顾: 1. 请求生命周期 2. 中间件 md = [ "file_path.classname" ] process_request[可有可无] process_response[必须有] process_request process_response process_request process_response process_request process_response process_request process_response 路由->函数 3.