Python-TensorFlow架构下CNN手写体识别(一)----简介与图像预处理
一、手写体识别简介
- 入门级别 ,阿拉伯字符;数据集:MNIST
- 入门级别二,英文字符;数据集:EMNIST
- 骨灰级别,中文字符;建议:直接调用API,阿里云,腾讯OCR等
二、项目流程
1,图片的预处理
2,卷积神经网络的训练
3,识别图片
4,pyqt5构建简单GUI界面
Part -1 图像预处理
调用Python库Opencv
至于Opencv库的介绍,在此不赘述(若有兴趣,自行查阅),直接说怎么用,纯干货。
安装方法:
pip install -i https://pypi.douban.com/simple opencv
导入
import cv2 #注意,不是import opencv
import numpy as np#后面用
也许有些人会不懂为什么不是pip install opencv,因为它太慢了(保持微笑,口吐芬芳)上述语句为cmd命令窗口中实行,调用豆瓣镜像资源(关于pip国内镜像资源,请自行百度,不赘述)
读取图像
path='apple.jpg'#路径
img=cv2.imread(path)#读取图片
调整图像大小(等比例)
scale=img.shape[0]/img.shape[1] #计算比例,img.shape可返回图像的长和宽
xx=1200 #目的大小的长
width=int(xx*scale) #计算宽,注意int强制转换数据类型(不接受非整数)
img=cv2.resize(img,(xx,width),cv2.INTER_AREA) #第一个参数是图像,第二个是大小,第三个是resize方式,cv2.INTER_AREA为线性插值,简单理解为确定如何新的像素值
转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #img:图像
图像降噪等预处理
gray = cv2.GaussianBlur(gray, (15,15), 0)#高斯滤波,参数可调
# cv2.imshow('a',gray)
edges=cv2.Canny(gray,70,70)#Canny边缘检测
# cv2.imshow('b', edges)
x = cv2.Sobel(edges, cv2.CV_16S, 1, 0)
y = cv2.Sobel(edges, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#Sobel算子降噪
image = cv2.adaptiveThreshold(dst, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 3)#自适应阈值二值化
以上的行为,为了下一步在图片中找出数字以及字符做准备。
轮廓寻找
_,contours, hierarchy = cv2.findContours(image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
image为之前降噪完成的图片,后面两个为参数(可不改)
返回值为三个(如果Opencv版本不小心装的旧版返回值是两个,直接删除第一个下划线,不过默认装的是新版)
返回的contours是需要用的轮廓参数
定位字符并且框选
sum=0
for c in contours:
sum+=cv2.contourArea(c)
avg=sum/len(contours)#遍历轮廓求面积均值
for c in contours:
if avg/3<cv2.contourArea(c)<avg*3:#大小筛选
x, y, w, h = cv2.boundingRect(c)
if in_or_out(x,y,w,h):
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
return img
补充函数:
为了防止轮廓嵌套,使用x,y,w,h四个参数求得轮廓中心点坐标![在这
li=[0,0]
def in_or_out(x,y,w,h):
global li
flag=1
for i in range(0,len(li)-1,2):
if abs(x + w / 2-li[i])+abs(y + h / 2-li[i+1])<50:
flag=0
if flag:
li.append(x + w / 2)
li.append(y + h / 2)
return True
else:
return False
原图片
降噪等处理后
未使用in_or_out函数前
最终版本
结语
此次只简单介绍了简单的图像处理,定位。后续还会有图像仿射变换,Hough直线检测用于表格中数据提取 等进一步图像处理以及信息提取内容的文章。
以及运用TensorFlow架构搭建CNN基于MNIST以及EMNIST数据集训练识别上述内容的文章
如感兴趣,请关注我!!!
注:以上内容为自学后整理而出,在此发布为互相交流,如有错误烦请指正!