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

  1. from PIL import Image
  2. from pytesseract import *
  3. from fnmatch import fnmatch
  4. from queue import Queue
  5. import matplotlib.pyplot as plt
  6. import cv2
  7. import time
  8. import os
  9.  
  10. def clear_border(img,img_name):
  11. '''去除边框
  12. '''
  13.  
  14. h, w = img.shape[:2]
  15. for y in range(0, w):
  16. for x in range(0, h):
  17. # if y ==0 or y == w -1 or y == w - 2:
  18. if y < 4 or y > w -4:
  19. img[x, y] = 255
  20. # if x == 0 or x == h - 1 or x == h - 2:
  21. if x < 4 or x > h - 4:
  22. img[x, y] = 255
  23.  
  24. return img
  25.  
  26. def interference_line(img, img_name):
  27. '''
  28. 干扰线降噪
  29. '''
  30.  
  31. h, w = img.shape[:2]
  32. # !!!opencv矩阵点是反的
  33. # img[1,2] 1:图片的高度,2:图片的宽度
  34. for r in range(0,2):
  35. for y in range(1, w - 1):
  36. for x in range(1, h - 1):
  37. count = 0
  38. if img[x, y - 1] > 245:
  39. count = count + 1
  40. if img[x, y + 1] > 245:
  41. count = count + 1
  42. if img[x - 1, y] > 245:
  43. count = count + 1
  44. if img[x + 1, y] > 245:
  45. count = count + 1
  46. if count > 2:
  47. img[x, y] = 255
  48.  
  49. return img
  50.  
  51. def interference_point(img,img_name, x = 0, y = 0):
  52. """点降噪
  53. 9邻域框,以当前点为中心的田字框,黑点个数
  54. :param x:
  55. :param y:
  56. :return:
  57. """
  58. # todo 判断图片的长宽度下限
  59. cur_pixel = img[x,y]# 当前像素点的值
  60. height,width = img.shape[:2]
  61.  
  62. for y in range(0, width - 1):
  63. for x in range(0, height - 1):
  64. if y == 0: # 第一行
  65. if x == 0: # 左上顶点,4邻域
  66. # 中心点旁边3个点
  67. sum = int(cur_pixel) \
  68. + int(img[x, y + 1]) \
  69. + int(img[x + 1, y]) \
  70. + int(img[x + 1, y + 1])
  71. if sum <= 2 * 245:
  72. img[x, y] = 0
  73. elif x == height - 1: # 右上顶点
  74. sum = int(cur_pixel) \
  75. + int(img[x, y + 1]) \
  76. + int(img[x - 1, y]) \
  77. + int(img[x - 1, y + 1])
  78. if sum <= 2 * 245:
  79. img[x, y] = 0
  80. else: # 最上非顶点,6邻域
  81. sum = int(img[x - 1, y]) \
  82. + int(img[x - 1, y + 1]) \
  83. + int(cur_pixel) \
  84. + int(img[x, y + 1]) \
  85. + int(img[x + 1, y]) \
  86. + int(img[x + 1, y + 1])
  87. if sum <= 3 * 245:
  88. img[x, y] = 0
  89. elif y == width - 1: # 最下面一行
  90. if x == 0: # 左下顶点
  91. # 中心点旁边3个点
  92. sum = int(cur_pixel) \
  93. + int(img[x + 1, y]) \
  94. + int(img[x + 1, y - 1]) \
  95. + int(img[x, y - 1])
  96. if sum <= 2 * 245:
  97. img[x, y] = 0
  98. elif x == height - 1: # 右下顶点
  99. sum = int(cur_pixel) \
  100. + int(img[x, y - 1]) \
  101. + int(img[x - 1, y]) \
  102. + int(img[x - 1, y - 1])
  103.  
  104. if sum <= 2 * 245:
  105. img[x, y] = 0
  106. else: # 最下非顶点,6邻域
  107. sum = int(cur_pixel) \
  108. + int(img[x - 1, y]) \
  109. + int(img[x + 1, y]) \
  110. + int(img[x, y - 1]) \
  111. + int(img[x - 1, y - 1]) \
  112. + int(img[x + 1, y - 1])
  113. if sum <= 3 * 245:
  114. img[x, y] = 0
  115. else: # y不在边界
  116. if x == 0: # 左边非顶点
  117. sum = int(img[x, y - 1]) \
  118. + int(cur_pixel) \
  119. + int(img[x, y + 1]) \
  120. + int(img[x + 1, y - 1]) \
  121. + int(img[x + 1, y]) \
  122. + int(img[x + 1, y + 1])
  123.  
  124. if sum <= 3 * 245:
  125. img[x, y] = 0
  126. elif x == height - 1: # 右边非顶点
  127. sum = int(img[x, y - 1]) \
  128. + int(cur_pixel) \
  129. + int(img[x, y + 1]) \
  130. + int(img[x - 1, y - 1]) \
  131. + int(img[x - 1, y]) \
  132. + int(img[x - 1, y + 1])
  133.  
  134. if sum <= 3 * 245:
  135. img[x, y] = 0
  136. else: # 具备9领域条件的
  137. sum = int(img[x - 1, y - 1]) \
  138. + int(img[x - 1, y]) \
  139. + int(img[x - 1, y + 1]) \
  140. + int(img[x, y - 1]) \
  141. + int(cur_pixel) \
  142. + int(img[x, y + 1]) \
  143. + int(img[x + 1, y - 1]) \
  144. + int(img[x + 1, y]) \
  145. + int(img[x + 1, y + 1])
  146. if sum <= 4 * 245:
  147. img[x, y] = 0
  148.  
  149. return img
  150.  
  151. def _get_dynamic_binary_image(filedir,img_name):
  152. '''
  153. 自适应阀值二值化
  154. '''
  155. filename = './easy_code/' + img_name.split('.')[0] + '-binary.jpg'
  156. img_name = filedir + '/' + img_name
  157. im = cv2.imread(img_name)
  158. im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
  159.  
  160. th1 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)
  161.  
  162. return th1
  163.  
  164. def recognize():  
  165. filedir = './images'  #验证码路径
  166.  
  167. for file in os.listdir(filedir):
  168. if fnmatch(file, '*.jpg'):
  169. img_name = file
  170. # 自适应阈值二值化
  171. im = _get_dynamic_binary_image(filedir,img_name)
  172. # 去除边框
  173. im = clear_border(im,img_name)
  174. # 对图片进行干扰线降噪
  175. im = interference_line(im,img_name)
  176. # 对图片进行点降噪
  177. im = interference_point(im,img_name)
  178. filename = './easy_code/' + img_name.split('.')[0] + '-interferencePoint.jpg'  #easy_code为保存路径
  179. cv2.imwrite(filename,im)  #保存图片
  180.  
  181. recognize()

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

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

Python爬虫笔记【一】模拟用户访问之验证码清理(4)的更多相关文章

  1. python爬虫笔记之用cookie访问需要登录的网站

     目标:用cookie访问一个需要登录的网站 如图,直接访问会跳转到登录页面,提示登录. 运行结果: 直接在浏览器上输入该url,网站立马跳转到登录页面.  方法: 1.先手动登录,通过抓包获取coo ...

  2. Python爬虫笔记【一】模拟用户访问之设置请求头 (1)

    学习的课本为<python网络数据采集>,大部分代码来此此书. 网络爬虫爬取数据首先就是要有爬取的权限,没有爬取的权限再好的代码也不能运行.所以首先要伪装自己的爬虫,让爬虫不像爬虫而是像人 ...

  3. python爬虫笔记Day01

    python爬虫笔记第一天 Requests库的安装 先在cmd中pip install requests 再打开Python IDM写入import requests 完成requests在.py文 ...

  4. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

  5. Python爬虫笔记一(来自MOOC) Requests库入门

    Python爬虫笔记一(来自MOOC) 提示:本文是我在中国大学MOOC里面自学以及敲的一部分代码,纯一个记录文,如果刚好有人也是看的这个课,方便搬运在自己电脑上运行. 课程为:北京理工大学-嵩天-P ...

  6. Python之路,Day22 - 网站用户访问质量分析监测分析项目开发

    Python之路,Day22 - 网站用户访问质量分析监测分析项目开发   做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129  项目实战之 ...

  7. Python爬虫笔记(一):爬虫基本入门

    最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫.这是这个项目的第一篇文章,这次就简单介绍一下Python爬虫,后面根据项 ...

  8. 《转载》python爬虫实践之模拟登录

    有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录.   浏览器访问服务器的过程   在用户访问网页时,不论是通过URL输入域名或IP ...

  9. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

随机推荐

  1. hive 总结二

    本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 查询函数(Hive高级) NVL(cloumn,replace_with) 如果cloumn为NU ...

  2. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  3. <scrapy爬虫>scrapy命令行操作

    1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...

  4. 面试系列 31 zk都有哪些使用场景

    大致来说,zk的使用场景如下,我就举几个简单的,大家能说几个就好了: (1)分布式协调:这个其实是zk很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B消息消费之后处理了.那A系统如 ...

  5. Mapped Statements collection does not contain value for xxx.xxx 错误原因&解决方案

    先贴出详细的报错信息 2019-11-05 10:10:00 [executor-1] ERROR [org.quartz.core.JobRunShell:225] - Job DEFAULT.ef ...

  6. BOM相关知识点

    1.BOM概念:Browser Object Model 浏览器对象模型作用:提供了使用JS操作浏览器的接口 2.BOM包含了许多对象信息,包括如下这些:(1)screen 屏幕信息(2)locati ...

  7. Android开发 设备横屏与竖屏的详解

    需要了解横竖屏切换关键知识 1.在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期.从onCreate 到 onDestroy 2. ...

  8. scoreboarding

    Reference docs: https://en.wikipedia.org/wiki/Scoreboarding SSC_course_5_Scoreboard_ex.pdf 1, what i ...

  9. HTML - 内嵌标签相关

    <html> <head></head> <body> <!-- iframe (内嵌标签) src : 要显示的网页资源路径(本地资源或网络资源 ...

  10. ssoj 2279 磁力阵

    说不想改最后还是向T1屈服了..然后就de了一下午Bug... 虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了. 说自己的做法,略鬼畜. 每个正方形的边界上的边.每条边在 ...