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打开网页和暂停实例
Sep 30 Python
利用Python读取文件的四种不同方法比对
May 18 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
Sanic框架配置操作分析
Jul 17 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
python编程实现清理微信重复缓存文件
Nov 01 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中几种常见的超时处理全面总结
2012/09/11 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
php函数与传递参数实例分析
2014/11/15 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
2019/04/12 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
Python短信轰炸的代码
2020/03/25 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
python主要用于哪些方向
2020/07/05 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
养殖行业的创业计划书
2014/01/05 职场文书
银行内勤岗位职责
2014/04/09 职场文书
合伙购房协议样本
2014/10/06 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
优秀教师单行材料
2014/12/16 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
Java使用JMeter进行高并发测试
2021/11/23 Java/Android