清理图片,对图片进行二值化,去边框,去干扰线,去点

from PIL import Image
from pytesseract import *
from fnmatch import fnmatch
from queue import Queue
import matplotlib.pyplot as plt
import cv2
import time
import osdef clear_border(img,img_name):'''去除边框'''h, w = img.shape[:2]for y in range(0, w):for x in range(0, h):# if y ==0 or y == w -1 or y == w - 2:if y < 4 or y > w -4:img[x, y] = 255# if x == 0 or x == h - 1 or x == h - 2:if x < 4 or x > h - 4:img[x, y] = 255return imgdef interference_line(img, img_name):'''干扰线降噪'''h, w = img.shape[:2]# !!!opencv矩阵点是反的# img[1,2] 1:图片的高度,2:图片的宽度for r in range(0,2):for y in range(1, w - 1):for x in range(1, h - 1):count = 0if img[x, y - 1] > 245:count = count + 1if img[x, y + 1] > 245:count = count + 1if img[x - 1, y] > 245:count = count + 1if img[x + 1, y] > 245:count = count + 1if count > 2:img[x, y] = 255return imgdef interference_point(img,img_name, x = 0, y = 0):"""点降噪9邻域框,以当前点为中心的田字框,黑点个数:param x::param y::return:"""# todo 判断图片的长宽度下限cur_pixel = img[x,y]# 当前像素点的值height,width = img.shape[:2]for y in range(0, width - 1):for x in range(0, height - 1):if y == 0:  # 第一行if x == 0:  # 左上顶点,4邻域# 中心点旁边3个点sum = int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 2 * 245:img[x, y] = 0elif x == height - 1:  # 右上顶点sum = int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1])if sum <= 2 * 245:img[x, y] = 0else:  # 最上非顶点,6邻域sum = int(img[x - 1, y]) \+ int(img[x - 1, y + 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 3 * 245:img[x, y] = 0elif y == width - 1:  # 最下面一行if x == 0:  # 左下顶点# 中心点旁边3个点sum = int(cur_pixel) \+ int(img[x + 1, y]) \+ int(img[x + 1, y - 1]) \+ int(img[x, y - 1])if sum <= 2 * 245:img[x, y] = 0elif x == height - 1:  # 右下顶点sum = int(cur_pixel) \+ int(img[x, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y - 1])if sum <= 2 * 245:img[x, y] = 0else:  # 最下非顶点,6邻域sum = int(cur_pixel) \+ int(img[x - 1, y]) \+ int(img[x + 1, y]) \+ int(img[x, y - 1]) \+ int(img[x - 1, y - 1]) \+ int(img[x + 1, y - 1])if sum <= 3 * 245:img[x, y] = 0else:  # y不在边界if x == 0:  # 左边非顶点sum = int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y - 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 3 * 245:img[x, y] = 0elif x == height - 1:  # 右边非顶点sum = int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x - 1, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1])if sum <= 3 * 245:img[x, y] = 0else:  # 具备9领域条件的sum = int(img[x - 1, y - 1]) \+ int(img[x - 1, y]) \+ int(img[x - 1, y + 1]) \+ int(img[x, y - 1]) \+ int(cur_pixel) \+ int(img[x, y + 1]) \+ int(img[x + 1, y - 1]) \+ int(img[x + 1, y]) \+ int(img[x + 1, y + 1])if sum <= 4 * 245:img[x, y] = 0return imgdef _get_dynamic_binary_image(filedir,img_name):'''自适应阀值二值化'''filename =   './easy_code/' + img_name.split('.')[0] + '-binary.jpg'img_name = filedir + '/' + img_nameim = cv2.imread(img_name)im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)return th1def recognize():  filedir = './images'  #验证码路径for file in os.listdir(filedir):if fnmatch(file, '*.jpg'):img_name = file# 自适应阈值二值化im = _get_dynamic_binary_image(filedir,img_name)# 去除边框im = clear_border(im,img_name)# 对图片进行干扰线降噪im = interference_line(im,img_name)# 对图片进行点降噪im = interference_point(im,img_name)filename =  './easy_code/' + img_name.split('.')[0] + '-interferencePoint.jpg'  #easy_code为保存路径cv2.imwrite(filename,im)  #保存图片

recognize()

以上代码改自 老板丶鱼丸粗面 的 《python验证码识别》对于验证码识别大佬那还有跟详细的介绍。

附链接:https://www.cnblogs.com/qqandfqr/p/7866650.html

转载于:https://www.cnblogs.com/dfy-blog/p/11563331.html

Python爬虫笔记【一】模拟用户访问之验证码清理(4)相关推荐

  1. Python爬虫笔记(3)- 爬取丁香园留言

    Python爬虫笔记(3)- 爬取丁香园留言 爬取丁香园留言:主要用到了模拟登录 爬取丁香园留言:主要用到了模拟登录 import requests, json, re, random,time fr ...

  2. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  3. Python爬虫笔记

    Python爬虫笔记 总体看过程 赋予地址 获取网页信息 获取网页中所需的信息 将得到所需的信息保存到硬盘 总体看过程 爬虫-从网络上爬取所需要的信息,怎么爬取?首先得知道你要去哪里获取(即地址,首先 ...

  4. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  5. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  6. python爬虫笔记第二章

    前言 你好! 这是基于b站2021年路飞学成爬虫教程的python爬虫学习笔记,主要是方便作者复习和回顾课程内容. 已经发布了第一章和第二章,可以在主页中查看. python爬虫笔记(第二章) 前言 ...

  7. 利用python爬虫(part15)--cookie模拟登陆

    学习笔记 文章目录 cookie模拟登陆 获取cookie 爬取我的简介 cookie模拟登陆 有的时候,我们想要抓取一个网站,但是需要先登录才能访问它,如果不输入用户名和密码,我们就会一直停留在登录 ...

  8. Python爬虫基础 爬取网页 访问网页

    前段时间又被人问了会不会爬虫,然后感觉现在爬取数据好像还是挺有用的,所以就在网上找了课程学习了一下,利用Python对网站进行爬取和解析等等.原来使用过八爪鱼这个软件,不太需要有什么编程基础,但是也已 ...

  9. Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers

    一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...

  10. Python爬虫笔记汇总

    文中介绍的比较详细的有,requests库,urllib.request库,BeautifulSoup库,re库和正则表达式,Scrapy常用命令. 一.requests库 课程小案例 京东商品详情页 ...

最新文章

  1. NSThread 多线程相关
  2. android存储器,Android——寄存器和存储器的区别
  3. java拼接字符串 判断内容_java--字符串拼接比较
  4. 【树链剖分】染色(luogu 2486/金牌导航 树链剖分-3)
  5. 用于检测敏感词的 PHP 扩展
  6. exists的用法 python_Python 办公自动化自动整理文件,一键完成!
  7. linux下的C语言开发(自动编译工具和config.h文件生成)
  8. hibernate 读取mysql表结构_为什么要用hibernate 与基于数据库表结构的项目开发
  9. kafka 同步提交 异步_Kafka 位移提交那些事儿
  10. (转载)Stackoverflow让我们变懒了?
  11. java jpa 字段 关联_jpa查询关联表懒加载数据initialize proxy no session
  12. 本特利探头177230-01-02-CN
  13. 服务器分类方式和类型
  14. MSP、CSP、BSP区别
  15. 力扣(LeetCode)244. 最短单词距离 II(2022.09.01)
  16. php实现短信找回密码,thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能...
  17. Spring boot再来一遍
  18. Anaconda更新报404:UnavailableInvalidChannel: The channel is not accessible or is invalid.error404
  19. We Dont Kown ....
  20. php new object delete,DeleteObject()函数

热门文章

  1. 跟着Code走,详解Symbian Client/Server架构
  2. 基于asp.net725原创(古代)文学交流网站系统
  3. 【WIN】超简单的Excel密码破解
  4. 游戏服务器更新文件,如何配置网吧游戏更新服务器
  5. 【Paper-Attack】Graph Universal Adversarial Attacks: A Few Bad Actors Ruin Graph Learning Models
  6. R语言:lengths计算列表list中元素的个数
  7. H5页面点击图片自动全屏代码
  8. 已有虚拟磁盘多个vmdk文件导入虚拟机
  9. Servlet判断用户是否登陆过、异地登录和登出功能
  10. vue3.x自定义换肤