Python爬虫笔记【一】模拟用户访问之验证码清理(4)
清理图片,对图片进行二值化,去边框,去干扰线,去点
- 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 os
- def 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] = 255
- return img
- def 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 = 0
- if img[x, y - 1] > 245:
- count = count + 1
- if img[x, y + 1] > 245:
- count = count + 1
- if img[x - 1, y] > 245:
- count = count + 1
- if img[x + 1, y] > 245:
- count = count + 1
- if count > 2:
- img[x, y] = 255
- return img
- def 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] = 0
- elif 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] = 0
- else: # 最上非顶点,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] = 0
- elif 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] = 0
- elif 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] = 0
- else: # 最下非顶点,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] = 0
- else: # 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] = 0
- elif 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] = 0
- else: # 具备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] = 0
- return img
- def _get_dynamic_binary_image(filedir,img_name):
- '''
- 自适应阀值二值化
- '''
- filename = './easy_code/' + img_name.split('.')[0] + '-binary.jpg'
- img_name = filedir + '/' + img_name
- im = 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 th1
- def 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
Python爬虫笔记【一】模拟用户访问之验证码清理(4)的更多相关文章
- python爬虫笔记之用cookie访问需要登录的网站
目标:用cookie访问一个需要登录的网站 如图,直接访问会跳转到登录页面,提示登录. 运行结果: 直接在浏览器上输入该url,网站立马跳转到登录页面. 方法: 1.先手动登录,通过抓包获取coo ...
- Python爬虫笔记【一】模拟用户访问之设置请求头 (1)
学习的课本为<python网络数据采集>,大部分代码来此此书. 网络爬虫爬取数据首先就是要有爬取的权限,没有爬取的权限再好的代码也不能运行.所以首先要伪装自己的爬虫,让爬虫不像爬虫而是像人 ...
- python爬虫笔记Day01
python爬虫笔记第一天 Requests库的安装 先在cmd中pip install requests 再打开Python IDM写入import requests 完成requests在.py文 ...
- [Python爬虫笔记][随意找个博客入门(一)]
[Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...
- Python爬虫笔记一(来自MOOC) Requests库入门
Python爬虫笔记一(来自MOOC) 提示:本文是我在中国大学MOOC里面自学以及敲的一部分代码,纯一个记录文,如果刚好有人也是看的这个课,方便搬运在自己电脑上运行. 课程为:北京理工大学-嵩天-P ...
- Python之路,Day22 - 网站用户访问质量分析监测分析项目开发
Python之路,Day22 - 网站用户访问质量分析监测分析项目开发 做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129 项目实战之 ...
- Python爬虫笔记(一):爬虫基本入门
最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫.这是这个项目的第一篇文章,这次就简单介绍一下Python爬虫,后面根据项 ...
- 《转载》python爬虫实践之模拟登录
有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录. 浏览器访问服务器的过程 在用户访问网页时,不论是通过URL输入域名或IP ...
- Python 爬虫实战5 模拟登录淘宝并获取所有订单
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...
随机推荐
- hive 总结二
本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 查询函数(Hive高级) NVL(cloumn,replace_with) 如果cloumn为NU ...
- day 69 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...
- <scrapy爬虫>scrapy命令行操作
1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...
- 面试系列 31 zk都有哪些使用场景
大致来说,zk的使用场景如下,我就举几个简单的,大家能说几个就好了: (1)分布式协调:这个其实是zk很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B消息消费之后处理了.那A系统如 ...
- 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 ...
- BOM相关知识点
1.BOM概念:Browser Object Model 浏览器对象模型作用:提供了使用JS操作浏览器的接口 2.BOM包含了许多对象信息,包括如下这些:(1)screen 屏幕信息(2)locati ...
- Android开发 设备横屏与竖屏的详解
需要了解横竖屏切换关键知识 1.在Android设备的横竖屏幕,每一次切换横竖屏其实是在重新创建Activity,Activity会重新走一遍生命周期.从onCreate 到 onDestroy 2. ...
- scoreboarding
Reference docs: https://en.wikipedia.org/wiki/Scoreboarding SSC_course_5_Scoreboard_ex.pdf 1, what i ...
- HTML - 内嵌标签相关
<html> <head></head> <body> <!-- iframe (内嵌标签) src : 要显示的网页资源路径(本地资源或网络资源 ...
- ssoj 2279 磁力阵
说不想改最后还是向T1屈服了..然后就de了一下午Bug... 虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了. 说自己的做法,略鬼畜. 每个正方形的边界上的边.每条边在 ...