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入门指引
Apr 01 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
Python爬取十篇新闻统计TF-IDF
Jan 03 Python
Tornado高并发处理方法实例代码
Jan 15 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 Python
Python 从相对路径下import的方法
Dec 04 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
django云端留言板实例详解
Jul 22 Python
基于Django统计博客文章阅读量
Oct 29 Python
Python 没有main函数的原因
Jul 10 Python
Python 数据的累加与统计的示例代码
Aug 03 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
js实现弹窗效果
2020/08/09 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
django自定义模板标签过程解析
2019/12/14 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
优秀医生事迹材料
2014/02/12 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
升学宴学生答谢词
2015/01/05 职场文书
三峡导游词
2015/01/31 职场文书
安徽导游词
2015/02/12 职场文书
实习生个人总结范文
2015/02/28 职场文书
改造DE1103三步曲
2022/04/07 无线电
方法汇总:Python 安装第三方库常用
2022/04/26 Python