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


Posted in Python onAugust 30, 2021

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

一、简介

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

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

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

二、8邻域降噪

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

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

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

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

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

三、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)

到此这篇关于Python图片验证码降噪和8邻域降噪的文章就介绍到这了,更多相关Python验证码降噪和8邻域降噪内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的类实例属性访问规则探讨
Jan 30 Python
详细解读Python的web.py框架下的application.py模块
May 02 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
Python中创建二维数组
Oct 17 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
Python3 翻转二叉树的实现
Sep 30 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
Pytorch生成随机数Tensor的方法汇总
Sep 09 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 Python
Python音乐爬虫完美绕过反爬
Aug 30 #Python
详解解Django 多对多表关系的三种创建方式
Aug 23 #Python
一些让Python代码简洁的实用技巧总结
Aug 23 #Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 #Python
Python学习开发之图形用户界面详解
Aug 23 #Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 #Python
教你使用一行Python代码玩遍童年的小游戏
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
Smarty保留变量用法分析
2016/05/23 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
webpack3之loader全解析
2017/10/26 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
Python最基本的输入输出详解
2015/04/25 Python
python的unittest测试类代码实例
2017/12/07 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
python爬虫要用到的库总结
2020/07/28 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
servlet面试题
2012/08/20 面试题
普通大学毕业生自荐信
2013/11/04 职场文书
出纳岗位职责
2013/11/09 职场文书
运动会表扬稿大全
2014/01/16 职场文书
打架检讨书500字
2014/01/29 职场文书
小学生秋游活动方案
2014/02/23 职场文书
爱护草坪标语
2014/06/24 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年女职工工作总结
2014/11/27 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
聊一聊python常用的编程模块
2021/05/14 Python