本文将重点介绍机器视觉的一个分支:文字识别,
介绍如何用一些 Python库来识别和使用在线图片中的文字
我们可以很轻松的阅读图片里的文字,但是机器阅读这些图片就会非常困难,利用这种人类用户可以正常读取但是大多数机器人都没法读取的图片,验证码 (CAPTCHA)就出现了
将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition, OCR)
下载安装包,下载训练数据
https://github.com/tesseract-ocr/tesseract/wiki
https://github.com/tesseract-ocr/tesseract/wiki/Data-Files
import pytesseract
import urllib.request
from PIL import Image
url = "https://so.gushiwen.org/RandCode.ashx?"
urllib.request.urlretrieve(url,'./captcha.png')
def cleanImage(path):
image = Image.open(path)
# 灰度化
image = image.convert('L')
# 背景杂点删除
data = image.load()#返回图片的ndarray数据
w,h = image.size
for i in range(w):
for j in range(h):
if data[i,j] >150: #阈值,估计的值
data[i,j] = 255 #纯白
else:
data[i,j] = 0 #纯黑
image.save('clean_captcha.png')
return image
image = cleanImage('./captcha.png')
image.show()
result = pytesseract.image_to_string(image)
#
print(result)
古诗文网站使用selenium模拟登陆,识别验证码
from selenium import webdriver
import pytesseract
from PIL import Image
import time
url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
def get_captcha():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get(url)
# 元素
img = driver.find_element_by_id('imgCode')
driver.save_screenshot('./poem.png')
image = Image.open('./poem.png')
# 左上角坐标
loc = img.location
print(loc)
# 图片宽度高度
size = img.size
print(size)
# 矩形区域
# 160,260
# 234,291
rec = (loc['x']+100 , loc['y']+51, 554, 290)
captcha = image.crop(rec)
# 保存到文件中
captcha.save('./captcha.png')
return driver
def recognize_captcha():
captcha = Image.open('./captcha.png')
gray = captcha.convert('L')
data = gray.load()
w,h = captcha.size
for x in range(w):
for y in range(h):
# 0 ~ 255 0纯黑,255纯白
if data[x,y] < 140:
data[x,y] = 0
else:
data[x,y] = 255
code = pytesseract.image_to_string(gray)
return code
def login(drive,code):
drive.find_element_by_id('email').send_keys('xxxxxxx@qq.com')
drive.find_element_by_id('pwd').send_keys('xxxxabc')
drive.find_element_by_id('code').send_keys(code)
time.sleep(3)
drive.find_element_by_id('denglu').click()
if __name__ == '__main__':
drive = get_captcha()
# code验证码,有可能出错
code = recognize_captcha()
# print('----------------',code)
login(drive,code)
drive.quit()
网络毒刘
认证博客专家
Python
公众号:刘旺学长
数据分析
因为同样的坑不想踩两次而写博客,也同样为了社会更好的进步... 其实 Python 已经是一个很老的编程语言了,到现在(2019年) Python 已经高龄 28 岁,比很多程序员的年龄都大。现在之所以这么流行和社区、人工智能AI的日益发展,有很大的关系。千里之行始于足下,还不开始学习 Python编程吗个人公众号:刘旺学长一名热爱分享技术的宝藏博主。公众号回复1024,有免费教程分享。