简介

图片验证码识别的可以分为几个步骤,一般用 Pillow 库或 OpenCV 来实现,这几个过程是:

1.灰度处理&二值化

2.降噪

3.字符分割

4.标准化

5.识别

所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只留下需要识别的字符,让图片变成2进制点阵,方便代入模型训练。

8邻域降噪

8邻域降噪 的前提是将图片灰度化,即将彩色图像转化为灰度图像。以RGN色彩空间为例,彩色图像中每个像素的颜色由R 、G、B三个分量决定,每个分量由0到255种取值,这个一个像素点可以有一千多万种颜色变化。而灰度则是将三个分量转化成一个,使每个像素点只有0-255种取值,这样可以使后续的图像计算量变得少一些。

以上面的灰度图片为例,图片越接近白色的点像素越接近255,越接近黑色的点像素越接近0,而且验证码字符肯定是非白色的。对于其中噪点大部分都是孤立的小点的,而且字符都是串联在一起的。8邻域降噪 的原理就是依次遍历图中所有非白色的点,计算其周围8个点中属于非白色点的个数,如果数量小于一个固定值,那么这个点就是噪点。对于不同类型的验证码这个阈值是不同的,所以可以在程序中配置,不断尝试找到最佳的阈值。

经过测试8邻域降噪 对于小的噪点的去除是很有效的,而且计算量不大,下图是阈值设置为4去噪后的结果:

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)

图片降噪 java_Python图片验证码降噪 — 8邻域降噪相关推荐

  1. python爬虫验证码识别 (手把手教会你验证码识别)opencv图像处理 图片处理 验证码处理 降噪 简单易懂验证码处理

    前言:验证码是个烦人的小家伙!当然有很多打码平台,可以轻松解决!但可以自己来,干嘛靠别人!有技术不学是傻儿童!今天主要讲opencv来解决验证码!抱着怀里教你!让你向前迈一大步!详细讲,慢慢看!简单易 ...

  2. python音频 降噪_python降噪_python音频降噪_python图片降噪 - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我们下面借助opencv的python封装包cv2,对其进行一些降噪处理,使得图 ...

  3. opencv4 java 验证码噪点 8邻域降噪

    工程下载地址https://download.csdn.net/download/qq_16596909/11503962 程序运行后,同样会把图片存放在以下路径 首先来看一下原图 二值化后,可以把这 ...

  4. python训练好的图片验证_Python图片验证码降噪处理实例

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

  5. PHP生产一个验证码图片,PHP使用GD库生成验证码图片,实现图片验证

    本文记录从php 下载配置GD图片生成库 到使用该库生成验证码图片,网页上实现验证码. 使用技术: php使用GD库绘图 [php版本7.3] php session 缓存 实现最终效果: 一. 配置 ...

  6. php验证码有图片没数字,php验证码图片不显示

    php 动态验证码,PHP如何开发短信验证码功能?,php验证码代码,php验证码图片不显示 欢迎登录清源教育官网 www.tsingyuan.cn 查看更多视频教程 php 验证码linux下只显示 ...

  7. PLC 西门子smart200 锁机 有图片证明分期付款 动态验证码

    PLC 西门子smart200 锁机 有图片证明分期付款 动态验证码,无限次加密 程序例程 配对应维纶屏程序!有直接程序版本(初学者使用和封装库版本(方便快速移植) ID:77864957608068 ...

  8. php验证是否图片,php验证码图片不显示图片怎么办

    php验证码图片不显示图片的解决办法:首先检查php是否安装gd扩展:然后在php目录下找到php.ini文件:最后将文件编码方式改为utf-8无DOM格式,并在header前清除缓存即可. PHP图 ...

  9. python如何调用图片-python调用图片

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python本身也有识别图片转文字的框架,但是相比调用接口,识别的精度就略显不行 ...

最新文章

  1. 解决 Callout位置不更新的问题
  2. Understanding Unix/Linux Programming-终端控制和信号
  3. qprocess回调_QT进程间通信详细介绍及QProcess机制分析
  4. Android之万能适配器Adapter的使用
  5. 互联网日报 | 6月15日 星期二 | 凯撒旅业拟换股吸并众信旅游;爱回收预计6月18日登陆纽交所;顺丰航空机队规模增至66架...
  6. BOOT.INI文件的目的[微软提供]
  7. java学生管理系统oracle_基于Java的Oracle学生成绩管理系统
  8. oracle 能被2整除_整除专题基础篇 “刀法四式”
  9. 数据错误循环冗余检查是什么意思_磁盘阵列是什么,用在什么地方,有什么优点...
  10. 精密测量和超精密测量
  11. 使用CM快速搭建CDH集群
  12. 计算机rom和硬盘,都是存储器,但RAM、ROM、闪存、硬盘怎么分?
  13. 股指期货手续费每日增加吗(手续费计算公式)
  14. Linux内核中的汇编语言
  15. 2021新宁二中高考喜报成绩查询,新宁各校高考喜报!最高分684,全县大获得丰收!看有你认识的吗?...
  16. CIO40知识星球—IT人之兄弟连
  17. 创业两年,一家小VC的自我反思
  18. 16进制几个字符是一个字节
  19. 大白话5分钟带你走进人工智能-第二十八节集成学习之随机森林概念介绍(1)
  20. mysql语法大全和jdbc知识汇总

热门文章

  1. win10挂载esp(efi)分区
  2. 高次osu(重邮第13届ACM程序设计大赛-网络赛)
  3. 债券收益率建模(时间序列建模)时间序列相似度度量
  4. 实时商业智能BI(二):合理的ETL架构设计实现准实时商业智能BI
  5. 基于微服务架构的云平台总体设计
  6. php获取微信uninoid_PHP微信小程序之获取并解密用户数据获取openId和unionId,,小程序登陆...
  7. VMware设置静态IP
  8. Pixelmator for Mac(强大的图像处理软件)
  9. 《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上二)
  10. springboot初次使用template可能遇到的问题