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数据集训练识别上述内容的文章
如感兴趣,请关注我!!!

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

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
卷积神经网络(Convolutional Neural Networks,简称CNN)是一种在图像处理中非常重要的神经网络结构。它可以用于手写体数字识别等任务。下面是一个使用CNN进行手写体数字识别的示例: ```python import tensorflow as tf from tensorflow.keras.datasets import mnist # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.reshape(-1, 28, 28, 1) / 255.0 x_test = x_test.reshape(-1, 28, 28, 1) / 255.0 y_train = tf.keras.utils.to_categorical(y_train, num_classes=10) y_test = tf.keras.utils.to_categorical(y_test, num_classes=10) # 构建卷积神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test)) # 评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc) ``` 这个示例使用了TensorFlow和Keras库来构建和训练一个卷积神经网络模型,用于手写体数字识别任务。模型首先加载了MNIST数据集,并进行了数据预处理。然后,通过添加卷积层、池化层、全连接层和输出层来构建了一个简单的卷积神经网络模型。最后,使用训练集对模型进行训练,并使用测试集评估模型的准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值