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实现提取百度搜索结果的方法
May 19 Python
django初始化数据库的实例
May 27 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
python3 logging日志封装实例
Apr 08 Python
Python中如何引入第三方模块
May 27 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
Python如何导出导入所有依赖包详解
Jun 08 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实现水仙花数的4个示例分享
2014/04/08 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
JS创建自定义表格具体实现
2014/02/11 Javascript
javascript实现禁止右键和F12查看源代码
2014/12/26 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
Python中Collection的使用小技巧
2014/08/18 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
Python引用计数操作示例
2018/08/23 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
化工实习心得体会
2014/09/09 职场文书
医德医魂心得体会
2014/09/11 职场文书
个人培训总结
2015/03/05 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
学生病假条范文
2015/08/17 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
七年级作文之下雨天
2019/12/23 职场文书