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 29 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
python截取两个单词之间的内容方法
Dec 25 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
python实现对输入的密文加密
Mar 20 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 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中常用的预定义变量小结
2012/05/09 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
js中作用域的实例解析
2017/03/16 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
自制简易打赏功能的实例
2017/09/02 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python数据类型详解(一)字符串
2016/05/08 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
Python configparser模块应用过程解析
2020/08/14 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
火锅店营销方案
2014/02/26 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
三年级评语大全
2014/04/23 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
实习证明格式范文
2015/06/16 职场文书