# -*- 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进行验证码识别(预处理部分)相关推荐

  1. python账单查询软件_利用Python批量识别电子账单数据的方法

    这篇文章主要介绍了利用Python批量识别电子账单数据的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.前言 有一定数量类似如下截图所示的账单,利用 ...

  2. python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...

    相信许多80,90后都玩过2G时代的文字小游戏,它是来自QQ家园的专属回忆.偷菜,美味小镇,大乐斗,还有精武堂等等,虽然只是文字的输出,但是留给我们这一代的人的印象却是最深刻的.曾经流量很少,响应很快 ...

  3. python识图打怪_利用python进行识别相似图片(二)

    前言 和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸, 只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了. 所以本篇文章着重讲述如何利用openCV定位人脸. ...

  4. python读取图片文字为表格_利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据 ...

  5. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  6. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)

    今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...

  7. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  8. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  9. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  10. python中文字体奇怪_利用python检查 AS400的中文字问题

    总所周知,AS400处理中文的能力比较有限,特别是在针式打印机上打印含有中文字体的报表的时候,特别容易出现乱码.这里先探讨一下AS400的 中文格式.在AS400中,存放中文字的字段都是以0x0E开头 ...

最新文章

  1. 硬盘温度70度正常吗_70多岁老年人原来血压160,现在130正常吗?医生为你分析实情...
  2. linux在shell中获取时间
  3. anaconda3安装_Anaconda3软件与安装教程
  4. Python工程师求职必知的经典面试题分享
  5. 吴恩达《机器学习》课程总结(19)总结
  6. oracle的SCN和Checkpoint_Change#的关系
  7. LeetCode 849. 到最近的人的最大距离
  8. php带来互联网的影响,网络对我们的影响有哪些?
  9. 20140120收藏夹
  10. 备课笔记190826
  11. Populating Next Right Pointers in Each Node I or II
  12. 自由曲面透镜设计matlab,实现LED台灯均匀照明的自由曲面透镜仿真设计
  13. 清卡时提示“增值税未申报或未比对”
  14. 网页保存视频最有效的几种方法
  15. 26设计模式之建造者模式
  16. 【openjudge】抓住那头牛
  17. B站网页视频加速设置
  18. (9)机械臂路径规划
  19. P2P理财资金安全最重要 大数据风控模型或成趋势
  20. 零基础如何学好C语言?

热门文章

  1. 金融成AI最佳应用场景,“智能金融”时代真的来了么?
  2. 图解数据分析(5) | 核心步骤2 - 数据清洗与预处理(数据科学家入门·完结)
  3. matlab中特殊字符6,matlab中特殊字符
  4. 以太坊智能合约各方法对应的签名编码
  5. 什么是CLI和CLR
  6. 了解CV和RoboMaster视觉组(五)目标跟踪:概述与光流法
  7. 安装visol(x64)遇到的问题
  8. Python实现自动写邮件
  9. 时间序列预测任务的模型选择最全总结
  10. 全球造船业发展现状分析,正处于行业上升时期「图」