Python-TensorFlow架构下CNN手写体识别(一)----简介与图像预处理

Python-TensorFlow架构下CNN手写体识别(一)----简介与图像预处理

一、手写体识别简介

  1. 入门级别 ,阿拉伯字符;数据集:MNIST
  2. 入门级别二,英文字符;数据集:EMNIST
  3. 骨灰级别,中文字符;建议:直接调用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数据集训练识别上述内容的文章
如感兴趣,请关注我!!!

注:以上内容为自学后整理而出,在此发布为互相交流,如有错误烦请指正!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值