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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
python删除列表中重复记录的方法
Apr 28 Python
Python实现的朴素贝叶斯分类器示例
Jan 06 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python实现静态web服务器
Sep 03 Python
浅谈Python中re.match()和re.search()的使用及区别
Apr 14 Python
Python调用shell命令常用方法(4种)
May 11 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
详解OpenCV曝光融合
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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
php的debug相关函数用法示例
2016/07/11 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
Python性能优化的20条建议
2014/10/25 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单
2020/05/24 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
毕业生求职简历的自我评价
2013/10/07 职场文书
客服部工作职责范本
2014/02/14 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
干部考察材料范文
2014/12/24 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
八月迷情观后感
2015/06/11 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript