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 06 Python
Python升级提示Tkinter模块找不到的解决方法
Aug 22 Python
python中set常用操作汇总
Jun 30 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
Python库skimage绘制二值图像代码实例
Apr 10 Python
django 模型中的计算字段实例
May 19 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 Python
Django自定义YamlField实现过程解析
Nov 11 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 Python
Python if else条件语句形式详解
Mar 24 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
python Tkinter的图片刷新实例
2019/06/14 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Python3运算符常见用法分析
2020/02/14 Python
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
CAD制图设计师自荐信
2014/01/29 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
关于感恩的演讲稿400字
2014/08/26 职场文书
5.12护士节活动总结
2015/02/10 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
贷款收入证明范本
2015/06/12 职场文书
学习计划是什么
2019/04/30 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
java开发双人五子棋游戏
2022/05/06 Java/Android