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实现扫描端口示例
Mar 29 Python
Python中的random()方法的使用介绍
May 15 Python
使用 Python 实现文件递归遍历的三种方式
Jul 18 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
Python pickle模块实现对象序列化
Nov 22 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
使用python-Jenkins批量创建及修改jobs操作
May 12 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
Pandas搭配lambda组合使用详解
Jan 22 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
生成sessionid和随机密码的例子
2006/10/09 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
js实现移动端轮播图
2020/12/21 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
使用Python中的cookielib模拟登录网站
2015/04/09 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Python BS4库的安装与使用详解
2018/08/08 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
python图片合成的示例
2020/11/09 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
汽车服务工程专业自荐信
2014/09/02 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
办公室主任个人总结
2015/02/28 职场文书
2016年春节慰问信息
2015/03/25 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
使用Python开发冰球小游戏
2022/04/30 Python