图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口、云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好。

而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网络,一顿炼丹猛如虎,识别准确率99%妥妥的。神经网络训练模型来识别验证码虽然效果好,但是却有两个先天的缺陷:

第一、需要大量的标注数据。很多公开的基于神经网络识别图片验证码的代码都会使用一个验证码生成库来生成大量的已标注的验证码图片,这一步,直接把实际场景下的会消耗大量时间和经历的步骤给忽略掉了;

第二、需要巨大的算力。没钱没配置的小伙伴,用着低级CPU,还想训练神经网络?还是洗洗睡吧。

所以对于一部分小伙伴而言,很现实的状况,还是对图片进行传统的ORC识别比较靠谱。要对图片进行传统的ORC识别,对图片进行各种降噪处理就必不可少,本文,州的先生就介绍一些实际使用到的图片降噪处理方法。

本文所用的示例图片来自于某网站的登录验证码:

可以看到,图片里面大的数据混杂着小的数字和字母,人眼可以迅速地看出来真实的数字,但是对于传统的ORC的话,可能会产生巨大的干扰。我们使用百度AI开放平台中的通用文字识别接口来测试一下:

可以看到,百度的通用文字识别接口将值为3885的数字识别成了38.852,虽然主要的数字都识别出来了,但是却多了许多无关的字符。

我们下面借助OpenCV的Python封装包cv2,对其进行一些降噪处理,使得图片更新清晰和无干扰。

一、二值化处理

在图片处理中,二值化是一个很常见的操作,我们首先将图片转为灰度,然后再根据特定的阈值将图片进行黑白的二值化处理。

import cv2

import matplotlib.pyplot as plt

img = cv2.imread("201910302114.png")

img2 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

img2 = cv2.inRange(img2, lowerb=160, upperb=255)

plt.subplot(121), plt.imshow(img) # 原始图片

plt.subplot(122), plt.imshow(img2) # 降噪图片

plt.show()

在上面的代码中,我们先将图片转换为灰度(cvtColor()步骤),得到的图片如下所示:

左边是原始的图片,右边则是灰度处理后的图片。接着用cv2.inRange()将将阈值内的像素设置黑色,就完成了图片二值化的转换,如下图所示:

阈值不同,得到的二值化图片也会不一样,比如我们之前设置的是160,如果我们将其设置为180,那么得到的二值化图像又会不一样,如下图所示:

可以发现,很多干扰字符也出来的。如何选择合适的阈值,需要根据具体的图片来进行判断。我们将效果最好的图片保存下来,如下图所示:

使用这个图片,我们再去百度AI的通用文字识别接口上测试一下,可以发现相比于之前的识别出错,现在已经完全识别正确了,如下动图所示:

二、像素降噪

除了上面简单的二值化之外,我们再来看一个更加复杂一点的例子。很多的验证码图片会加上很多干扰点,不仅机器认不出来,有时候连人都认不出来,比如下图这样的验证码图片:

干扰块大量地附着在字符上,甚至有喧宾夺主的趋势。这样的验证码,百度的AI接口也是没辙:

面对这样的验证码,我们要怎么处理呢。下面来看一下。

因为这个图片的底色是白色的,所以我们直接使用cv2的threshold()方法对图像进行二值化处理,小于某个阈值直接置位白色:

import cv2

import matplotlib.pyplot as plt

img = cv2.imread("vcode_2019-10-29141155879867.png")

# 二值化

ret, img2 = cv2.threshold(img, 160, 255, cv2.THRESH_BINARY)

plt.subplot(121), plt.imshow(img) # 原始图片

plt.subplot(122), plt.imshow(img2) # 降噪图片

plt.show()

运行上述代码,我们可以得到如下所示的图片:

对比与原始图像,经过二值化后的图像锐利了很多,边缘不再有过渡性的颜色。下一步,我们把那些孤立在图像上的像素点清除掉即可。

如何清除图像中的孤立像素,我们可以选用效果较好的邻域降噪算法。邻域降噪算法通过计算一个像素点邻域的非白色数量来判断是否将其置为白色。其Python代码的实现如下所示:

# 计算邻域非白色个数

def calculate_noise_count(img_obj, w, h):

"""

计算邻域非白色的个数

Args:

img_obj: img obj

w: width

h: height

Returns:

count (int)

"""

count = 0

width, height,s = 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_,0] < 233) or (img_obj[_w_, _h_,1] < 233) or (img_obj[_w_, _h_,2] < 233):

count += 1

return count

# k邻域降噪

def operate_img(img,k):

w,h,s = img.shape

# 从高度开始遍历

for _w in range(w):

# 遍历宽度

for _h in range(h):

if _h != 0 and _w != 0 and _w < w-1 and _h < h-1:

if calculate_noise_count(img, _w, _h) < k:

img.itemset((_w,_h,0),255)

img.itemset((_w, _h,1), 255)

img.itemset((_w, _h,2), 255)

return img

我们将读取的图像传入operate_img()函数,其就会返回降噪处理后的图像,而且这个函数还可以重复进行调用,每一次调用都是在前一次降噪的基础上进行降噪。

img2 = operate_img(img2, 4)

在进行第一次邻域降噪后,图像如下图所示:

可以看到,图像上已经减少了很多孤立像素块了。

img2 = operate_img(img2, 4)

img2 = operate_img(img2, 4)

对二值化后的图像调用两次邻域降噪,降噪的效果更加明显了,如下图所示:

可以发现,图像中孤立的像素点都清除掉了,但是图像四周边缘的噪点还是很顽固。我们再来编写一个简单的算法,将图像四周全部置为白色,代码如下所示:

# 四周置白色

def around_white(img):

w, h, s = img.shape

for _w in range(w):

for _h in range(h):

if (_w <= 5) or (_h <= 5) or (_w >= w-5) or (_h >= h-5):

img.itemset((_w, _h, 0), 255)

img.itemset((_w, _h, 1), 255)

img.itemset((_w, _h, 2), 255)

return img

然后,我们再来编写一个简单的处理算法,就是如果一个像素点上下左右四个连接的像素都跟像素点不是同一个颜色,那么我们将其置为白色:

# 邻域非同色降噪

def noise_unsome_piexl(img):

'''

查找像素点上下左右相邻点的颜色,如果是非白色的非像素点颜色,则填充为白色

:param img:

:return:

'''

# print(img.shape)

w, h, s = img.shape

for _w in range(w):

for _h in range(h):

if _h != 0 and _w != 0 and _w < w - 1 and _h < h - 1:# 剔除顶点、底点

center_color = img[_w, _h] # 当前坐标颜色

# print(center_color)

top_color = img[_w, _h + 1]

bottom_color = img[_w, _h - 1]

left_color = img[_w - 1, _h]

right_color = img[_w + 1, _h]

cnt = 0

if all(top_color == center_color):

cnt += 1

if all(bottom_color == center_color):

cnt += 1

if all(left_color == center_color):

cnt += 1

if all(right_color == center_color):

cnt += 1

if cnt < 1:

img.itemset((_w, _h, 0), 255)

img.itemset((_w, _h, 1), 255)

img.itemset((_w, _h, 2), 255)

return img

最后,我们结合上面的各种降噪算法,最后得到一个处理得比较好的图像,如下图所示:

用它再去百度AI接口上测试,发现已经完全识别正确的:

以上就是本文介绍的两种验证码图片降噪处理方法,欢迎留言讨论:)

分享到:

python训练好的图片验证_Python图片验证码降噪处理实例相关推荐

  1. python 训练集 测试集 验证集划分_将自己的图片数据集分成训练集、验证集和测试集并用 Tensorflow2.0 导入...

    文章目录项目介绍 划分数据集1.在 dataset 目录下创建三个文件夹 2.将原来 dataset 文件夹中的子文件夹分别复制到这三个文件夹中 3.在 python 中指定所有路径 4.将这三个文件 ...

  2. python 识别图形验证码_Python图片验证码降噪处理实例!此乃识别验证码神技!...

    图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...

  3. python显示图片不连续_Python 图片连接(不重叠)

    在用python处理图像的时候,除了图片叠加和图片拼接两种情况之外,有时候还会碰到需要上下左右连接图片合成一张图片.opencv中的cv2.addWeighted()和cv2.add()函数处理效果是 ...

  4. python图片裁剪_Python图片裁剪(如: 头像裁剪)

    今天就来说个常用的功能,图片裁剪,可用于头像裁剪啊之类的.用的还是我们之前用的哪个模块pillow 不过最好还是客户端裁剪,这里只是为了讲一下图片处理的这个功能 1. 安装pillow#### 用pi ...

  5. python代码图片头像_Python图片裁剪实例代码(如头像裁剪)

    今天就来说个常用的功能,图片裁剪,可用于头像裁剪啊之类的.用的还是我们之前用的哪个模块pillow 1. 安装pillow 用pip安装 pip install pillow 2. 图片裁剪 2.1 ...

  6. python获取图片像素点_Python 处理图片像素点的实例

    ###在做爬虫的时候有时需要识别验证码,但是验证码一般都有干扰物,这时需要对验证码进行预处理,效果如下: from PIL import Image import itertools img = Im ...

  7. python 图片合并_Python 图片合并pdf

    1.缘起 最近需要将记的笔记整理成一个 pdf 进行保存,所以就研究了一下如何利用 Python 代码将拍下来的照片整个合并成一个 pdf. 2.过程 拿到一个需求最重要的就是将大块任务拆分成一个个小 ...

  8. python做图片美化_python图片美化

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 功能性是开发的第一要务每一个 python 图形界面库都有它自有的功能特性和界面 ...

  9. python爬取微博图片教程_Python爬取微博实例分析

    引言 利用Ajax分析微博并爬取其内容如微博内容,点赞数,转发数,评论数等. 分析 打开陈一发微博网站:https://m.weibo.cn/p/1005051054009064,并同时打开开发者工具 ...

最新文章

  1. laravel学习资料整理
  2. Python之web开发(四):python使用django框架搭建网站之主页搭建
  3. 新容器!不再担心空指针, Java8 Optional类
  4. TOMCAT启动完成但是ECLIPSE仍然显示starting....
  5. 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式
  6. 怎么把pdf转成word
  7. 思科华为命令没有对比就没有伤害
  8. 大数据有哪些特点和作用
  9. Web 开发者不可不知的15条编码原则
  10. Vue CLI安装 Vue项目创建 Vue Devtools安装
  11. PMP第十三章:项目相关方管理
  12. 微软笔试题《Arithmetic Puzzles》- 题解
  13. 在线的棋牌类网络游戏java服务端实现
  14. 计算机创新创业计划2000字,创新创业论文2000字
  15. 【翻译】Qt撤销/回撤框架概述
  16. 符合python语言变量命名规则_符的解释|符的意思|汉典“符”字的基本解释
  17. iphone换android手机铃声,在iPhone中换个自定义铃声要11个步骤 正常人受不了
  18. 网络工程管理 第七章 应用层协议 万维网 DNS 电子邮件 FTP DHCP TELNET
  19. 计算机网络--虚拟局域网
  20. 神龙版 (官方网站 下载)

热门文章

  1. Java中利用freemarker导出word表格并合并单元格
  2. 盘点40个最佳项目管理工具大全
  3. matlab模拟硅中的点缺陷,硅中的杂质和缺陷.pdf
  4. Serenity框架官方文档翻译3.1(教程)
  5. keras h5—darknet weights模型相互转换
  6. 千图网免费下载工具(windows版)
  7. XMind8 pro 免费破解版!速度
  8. 初探TweenMax 动画
  9. 教你如何在vue-cli项目打包时避免踩雷(一)【早看早受益】
  10. shapely包的使用