python文字验证码识别_利用python进行验证码识别(预处理部分)
# -*- coding: utf-8 -*-
"""Created on Thu Feb 1 15:52:05 2018@author: Administrator"""
from PIL import Image
import os
import time #命名时用
import string #字符串模块
import shutil #文件复制粘贴等操作模块
path=r'C:\Users\Administrator\Desktop\python之图像识别\2.验证吗识别相关\pic(字母加数字加边框)'
path_save=r'C:\Users\Administrator\Desktop\python之图像识别\2.验证吗识别相关\归类\\'
path_save2=r'C:\Users\Administrator\Desktop\python之图像识别\2.验证吗识别相关\cut\\'
path_makedir=r'C:\Users\Administrator\Desktop\python之图像识别\2.验证吗识别相关\分类_识别\\'
path_copy_from=r'C:\Users\Administrator\Desktop\python之图像识别\2.验证吗识别相关\归类'
#import pytesseract #利用著名hp的软件tesseract来进行简单的规则的文字识别
##上面都是导包,只需要下面这一行就能实现图片文字识别
#text=pytesseract.image_to_string(Image.open(r'C:\Users\Administrator\Desktop\python之图像识别\pic\123.jpg'),lang='eng')
#print(type(text))
################以下为自定义阈值的二值化函数##############
def get_bin_table(threshold): #threshold为阈值
"""获取灰度转二值的映射table:param threshold::return:"""
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
return table
##########################################################
################以下为去噪函数(简单的删除点)::9邻域框,以当前点为中心的田字框,黑点个数##############
def sum_9_region(img, x, y): #为输入图片,xy分别为像素坐标,故使用其时需要用循环函数来厉遍图片里所有点
"""9邻域框,以当前点为中心的田字框,黑点个数:param x::param y::return:"""
# todo 判断图片的长宽度下限
cur_pixel = img.getpixel((x, y)) # 当前像素点的值
width = img.width
height = img.height
if cur_pixel == 1: # 如果当前点为白色区域,则不统计邻域值
return 0
if y == 0: # 第一行
if x == 0: # 左上顶点,4邻域
# 中心点旁边3个点
sum = cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y + 1))
return 4 - sum
elif x == width - 1: # 右上顶点
sum = cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x - 1, y)) \
+ img.getpixel((x - 1, y + 1))
return 4 - sum
else: # 最上非顶点,6邻域
sum = img.getpixel((x - 1, y)) \
+ img.getpixel((x - 1, y + 1)) \
+ cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y + 1))
return 6 - sum
elif y == height - 1: # 最下面一行
if x == 0: # 左下顶点
# 中心点旁边3个点
sum = cur_pixel \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y - 1)) \
+ img.getpixel((x, y - 1))
return 4 - sum
elif x == width - 1: # 右下顶点
sum = cur_pixel \
+ img.getpixel((x, y - 1)) \
+ img.getpixel((x - 1, y)) \
+ img.getpixel((x - 1, y - 1))
return 4 - sum
else: # 最下非顶点,6邻域
sum = cur_pixel \
+ img.getpixel((x - 1, y)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x, y - 1)) \
+ img.getpixel((x - 1, y - 1)) \
+ img.getpixel((x + 1, y - 1))
return 6 - sum
else: # y不在边界
if x == 0: # 左边非顶点
sum = img.getpixel((x, y - 1)) \
+ cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x + 1, y - 1)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y + 1))
return 6 - sum
elif x == width - 1: # 右边非顶点
# print('%s,%s' % (x, y))
sum = img.getpixel((x, y - 1)) \
+ cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x - 1, y - 1)) \
+ img.getpixel((x - 1, y)) \
+ img.getpixel((x - 1, y + 1))
return 6 - sum
else: # 具备9领域条件的
sum = img.getpixel((x - 1, y - 1)) \
+ img.getpixel((x - 1, y)) \
+ img.getpixel((x - 1, y + 1)) \
+ img.getpixel((x, y - 1)) \
+ cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x + 1, y - 1)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y + 1))
return 9 - sum
################以下为去去边框函数##############
# 去除边框
def clear_border(img):
w = img.width
h = img.height
for y_b in range(0, h):
for x_b in range(0, w):
if y_b < 5 or y_b > h - 5:
img.putpixel((x_b,y_b),1)
if x_b < 5 or x_b > w -5:
img.putpixel((x_b,y_b),1)
return img
###################以下的函数功能为切割一个完整验证码的数字,并以原文件名分割的字符来命名,形式为!!!函数里套用函数!!!!!
def get_whole_cut_pic(img):
#ww_w=img.width #这个暂时不需要了,因为下面直接用width定义了
hh_h=img.height #为了以下避免麻烦,先定义
################以下为智能切割图片函数(分别从左、右、上、下(左 右 顶 底)这四个极值坐标来定义,分别是四个函数)##############
def cut_get_coord_list(img_in):
co_list=[]
ww=img_in.width
hh=img_in.height
trigger1=False #用这样的触发事件来终止外循环,不然这哥们会一直循环下去
trigger2=False
trigger3=False
trigger4=False
for x_c in range(ww): ##得到最左面的x值
if trigger1==False:
for y_c in range(hh):
if img_in.getpixel((x_c,y_c))==0:
x_first=x_c
co_list.append(x_first) # 左
# print('x_1st is:'+str(x_first))
trigger1=True
break
else:
break
for y_cf in range(hh): ##得到最上面的y值
if trigger3==False:
for x_cf in range(ww):
if img_in.getpixel((x_cf,y_cf))==0:
y_first=y_cf
co_list.append(y_first) # 顶
# print('y_1st is:'+str(y_first))
trigger3=True
break
else:
break
for x_cl in range(x_first,ww): #获得最右端的x值,方法: 判断每一行的像素值,从最左端的x开始一直到有一整列为白点(像素值为1)为止,该列的所有像素值加起来应该等于该列的长度X1(height X 1即height值)
if trigger2==False:
x_hang_count=0 #初始x行开始是的像素值,让后循环相加,直至一列结束,再次重置循环
for y_cl in range(hh):
x_hang_count=x_hang_count+img_in.getpixel((x_cl,y_cl))
if y_cl==hh-1 and x_hang_count==hh:
x_last=x_cl
co_list.append(x_last) # 右
# print('x_last is:'+str(x_last))
trigger2=True
break
else:
break
for y_cls in range(y_first,hh): #获得最下端的y值,
if trigger4==False:
y_hang_count=0
for x_cls in range(ww):
y_hang_count=y_hang_count+img_in.getpixel((x_cls,y_cls))
if x_cls==ww-1 and y_hang_count==ww:
y_last=y_cls
co_list.append(y_last) # 底
# print('y_last is:'+str(y_last))
trigger4=True
break
else:
break
return co_list
##################################################
f_ex_sl=os.path.splitext(filename)#获取文件与拓展名分离的元祖,例子:('Y4G7', '.png')
cut1_list=cut_get_coord_list(img)
cropedIm_1 = img.crop((cut1_list[0], cut1_list[1], cut1_list[2], cut1_list[3])) #函数的添加顺序是左,顶,右,底,与图片切割的顺序一样,所以可以直接顺序取值使用
cropedIm_1.save(path_save+f_ex_sl[0][0]+'-'+str(time.time())+'.png')
cropedIm_1_2=img.crop((cut1_list[2], 0,img.width, hh_h)) ##裁剪剩下的图片,并保存
# print('save 1')
cropedIm_1_2.save(path_save2+f_ex_sl[0][0]+'-'+str(time.time())+'.png')
cut2_list=cut_get_coord_list(cropedIm_1_2)
cropedIm_2 = cropedIm_1_2.crop((cut2_list[0], cut2_list[1], cut2_list[2], cut2_list[3])) #函数的添加顺序是左,顶,右,底,与图片切割的顺序一样,所以可以直接顺序取值使用
cropedIm_2.save(path_save+f_ex_sl[0][1]+'-'+str(time.time())+'.png')
cropedIm_2_3=cropedIm_1_2.crop((cut2_list[2], 0, cropedIm_1_2.width, hh_h)) ##裁剪剩下的图片,并保存
# print('save 2')
cropedIm_2_3.save(path_save2+f_ex_sl[0][1]+'-'+str(time.time())+'.png')
cut3_list=cut_get_coord_list(cropedIm_2_3)
cropedIm_3 = cropedIm_2_3.crop((cut3_list[0], cut3_list[1], cut3_list[2], cut3_list[3])) #函数的添加顺序是左,顶,右,底,与图片切割的顺序一样,所以可以直接顺序取值使用
cropedIm_3.save(path_save+f_ex_sl[0][2]+'-'+str(time.time())+'.png')
cropedIm_3_4=cropedIm_2_3.crop((cut3_list[2], 0,cropedIm_2_3.width, hh_h))
# print('save 3')
cropedIm_3_4.save(path_save2+f_ex_sl[0][2]+'-'+str(time.time())+'.png')
cut4_list=cut_get_coord_list(cropedIm_3_4)
cropedIm_3 = cropedIm_3_4.crop((cut4_list[0], cut4_list[1], cut4_list[2], cut4_list[3])) #函数的添加顺序是左,顶,右,底,与图片切割的顺序一样,所以可以直接顺序取值使用
cropedIm_3.save(path_save+f_ex_sl[0][3]+'-'+str(time.time())+'.png')
# print('save 4')
# cropedIm_4_5=cropedIm_3_4.crop((cut3_list[2], 0, ww_w, hh_h))
#################以下为厉遍所有带学习的验证码图片,并对其预处理(二值、去噪、切割、重命名等)#################
file_list=os.listdir(path)
for filename in file_list:
# print(j)
pic = Image.open(path+'\\'+filename)
# print(path+'\\'+filename)
pic_gry = pic.convert('L') # 转化为灰度图
width,height = pic.size #获取长宽信息
# print(width)
#print(height)
#pic_gry.show() # 显示图像,好像是调用windows的cmd来运行
#pic_2_bit2=pic_gry.convert('1') # PIL内置命令实现二值化,可以直接将rgb转换成二值
table_2bit = get_bin_table(180) #定义参数为阈值180,这样橙色也可以显示出来
pic_2_bit2 = pic_gry.point(table_2bit, '1') #定义以什么样的参数来赋值二值化图片 注意这里point()函数只支持灰度图像的二值转化,只支持灰度
#pic_2_bit2.save(r'ceshi.png') #保存图片
for x in range(width):
for y in range(height):
b_pt_num=sum_9_region(pic_2_bit2, x, y) #利用去噪函数去噪
# print(b_pt_num)
if b_pt_num < 2 :
pic_2_bit2.putpixel((x,y),1) #赋值给像素坐标为xy 的点,值1为白色,0为黑色(因为hi二值,只有0和1)
clear_border(pic_2_bit2) #去边框函数
#pic_2_bit2.show()
#pic_2_bit2.save(r'jiangzao5.png') #保存图片
get_whole_cut_pic(pic_2_bit2) #调用大函数,将所有图片切割,并厉遍(上级函数功能)
#################################################################################################
#####################以下代码为 建立n个文件夹,分别命名从A到Z,从0到9,并把上一步生成的图片检测名称,复制到对应的文件夹里#####################################
sg_file=os.listdir(path_copy_from) #待复制文件夹里的所有文件list形式
#print(sg_file)
X_name=string.ascii_uppercase+string.digits #要新建的文件夹所有的名称合集,利用字符串函数功能,自动生成从0到9,从A到Z的字符串,并相加组成一个大的字符串
for X in X_name:
if os.path.exists(path_makedir+X): #判断是否存在文件或目录name
print('已经存在!')
else:
os.makedirs(path_makedir+X) #创建目录函数,os.makedirs,即使父级目录不存在也会创建
# print(X+'done!')
for f_i in sg_file:
if f_i[0]==X:
shutil.copy(path_copy_from+'\\'+f_i,path_makedir+X)
#shutil.copy(r"path1+name1",r"path2") #赋值函数,复制path1里的name文件到path2里
#####################################################################################################
##########################################接下来就是要进行机器学习部分了###################################
python文字验证码识别_利用python进行验证码识别(预处理部分)相关推荐
- python账单查询软件_利用Python批量识别电子账单数据的方法
这篇文章主要介绍了利用Python批量识别电子账单数据的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.前言 有一定数量类似如下截图所示的账单,利用 ...
- python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...
相信许多80,90后都玩过2G时代的文字小游戏,它是来自QQ家园的专属回忆.偷菜,美味小镇,大乐斗,还有精武堂等等,虽然只是文字的输出,但是留给我们这一代的人的印象却是最深刻的.曾经流量很少,响应很快 ...
- python识图打怪_利用python进行识别相似图片(二)
前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...
- python读取图片文字为表格_利用python将图片转换成excel文档格式
前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据 ...
- python制作图片墙_利用python生成照片墙的示例代码
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...
- python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)
今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...
- python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)
抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...
- python post请求 上传图片_利用python模拟实现POST请求提交图片的方法
本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...
- python实现邮件客户端_利用python实现简单的邮件发送客户端示例
脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...
- python中文字体奇怪_利用python检查 AS400的中文字问题
总所周知,AS400处理中文的能力比较有限,特别是在针式打印机上打印含有中文字体的报表的时候,特别容易出现乱码.这里先探讨一下AS400的 中文格式.在AS400中,存放中文字的字段都是以0x0E开头 ...
最新文章
- 硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...
- linux在shell中获取时间
- anaconda3安装_Anaconda3软件与安装教程
- Python工程师求职必知的经典面试题分享
- 吴恩达《机器学习》课程总结(19)总结
- oracle的SCN和Checkpoint_Change#的关系
- LeetCode 849. 到最近的人的最大距离
- php带来互联网的影响,网络对我们的影响有哪些?
- 20140120收藏夹
- 备课笔记190826
- Populating Next Right Pointers in Each Node I or II
- 自由曲面透镜设计matlab,实现LED台灯均匀照明的自由曲面透镜仿真设计
- 清卡时提示“增值税未申报或未比对”
- 网页保存视频最有效的几种方法
- 26设计模式之建造者模式
- 【openjudge】抓住那头牛
- B站网页视频加速设置
- (9)机械臂路径规划
- P2P理财资金安全最重要 大数据风控模型或成趋势
- 零基础如何学好C语言?