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中set与frozenset方法和区别详解
May 23 Python
python获取外网IP并发邮件的实现方法
Oct 01 Python
python3第三方爬虫库BeautifulSoup4安装教程
Jun 19 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
Python3实现的反转单链表算法示例
Mar 08 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
jupyter notebook清除输出方式
Apr 10 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
python中adb有什么功能
Jun 07 Python
pyCharm 实现关闭代码检查
Jun 09 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 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
投票管理程序
2006/10/09 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
Python urlopen()函数 示例分享
2014/06/12 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
python如何设置静态变量
2020/09/07 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
印度网上药店:1mg
2017/10/13 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
会议欢迎词
2015/01/23 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers