Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)

dsize = 20
affine_flags = lmc_cv.WARP_INVERSE_MAP | lmc_cv.INTER_LINEAR
bin_number = 16####################################################################################################
# deskew the image using its second order moments.
def lmc_cv_deskew_second_order_moment(image):moment = lmc_cv.moments(image)if abs(moment['mu02']) < 1e-2:return image.copy()skew = moment['mu11'] / moment['mu02']transformation_matrix = np.float32([[1, skew, -0.5 * dsize * skew], [0, 1, 0]])image = lmc_cv.warpAffine(image, transformation_matrix, (dsize, dsize), flags=affine_flags)return image####################################################################################################
# HOG Descriptor.
def lmc_cv_hog_svm(image):"""函数功能: We find Sobel derivatives of each cell in X and Y direction.Then find their magnitude and direction of gradient at each pixel.This gradient is quantized to 16 integer values. Divide this image to four sub-squares.For each sub-square, calculate the histogram of direction (16 bins) weighted with their magnitude.So each sub-square gives you a vector containing 16 values.Four such vectors (of four sub-squares) together gives us a feature vector containing 64 values.This is the feature vector we use to train our data."""gx = lmc_cv.Sobel(image, lmc_cv.CV_32F, 1, 0)gy = lmc_cv.Sobel(image, lmc_cv.CV_32F, 0, 1)mag, ang = lmc_cv.cartToPolar(gx, gy)# quantizing binvalues in (0...16)bins = np.int32(bin_number * ang / (2 * np.pi))bin_cells = bins[:10, :10], bins[10:, :10], bins[:10, 10:], bins[10:, 10:]mag_cells = mag[:10, :10], mag[10:, :10], mag[:10, 10:], mag[10:, 10:]hists = [np.bincount(b.ravel(), m.ravel(), bin_number) for b, m in zip(bin_cells, mag_cells)]# hist is a 64 bit vectorhist = np.hstack(hists)return hist####################################################################################################
# 基于SVM手写数据OCR(OCR of Hand-written Data using SVM)
def lmc_cv_svm_ocr_handwritten_digits():"""函数功能: 基于KNN手写数据OCR(OCR of Hand-written Data using kNN)."""image = lmc_cv.imread('D:/99-Research/TestData/image/digits.png', lmc_cv.IMREAD_GRAYSCALE)if image is None:raise Exception("we need the digits.png image from samples/data here !")cells = [np.hsplit(row, 50) for row in np.vsplit(image, 50)]# First half is train_data, remaining is test_datatrain_cells = [i[:25] for i in cells]test_cells = [i[25:] for i in cells]deskewed = [list(map(lmc_cv_deskew_second_order_moment, row)) for row in train_cells]hogdata = [list(map(lmc_cv_hog_svm, row)) for row in deskewed]train_data = np.float32(hogdata).reshape(-1, 64)responses = np.repeat(np.arange(10), 125)[:, np.newaxis]svm = lmc_cv.ml.SVM_create()svm.setKernel(lmc_cv.ml.SVM_LINEAR)svm.setType(lmc_cv.ml.SVM_C_SVC)svm.setC(2.67)svm.setGamma(5.383)svm.train(train_data, lmc_cv.ml.ROW_SAMPLE, responses)svm.save('svm_data.dat')deskewed = [list(map(lmc_cv_deskew_second_order_moment, row)) for row in test_cells]hogdata = [list(map(lmc_cv_hog_svm, row)) for row in deskewed]test_data = np.float32(hogdata).reshape(-1, bin_number * 4)result = svm.predict(test_data)[1]mask = result == responsescorrect = np.count_nonzero(mask)print("accuracy:  {}\n".format(correct * 100.0 / result.size))
【结果】
accuracy:  92.48

This particular technique gave me nearly 93% accuracy.

You can try different values for various parameters of SVM to check if higher accuracy is possible.

Below image shows above deskew function applied to an image of zero.

Left image is the original image and right image is the deskewed image.

Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)相关推荐

  1. Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)

    Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN) OCR of Hand-written Digits ########## ...

  2. python手写数字识别教学_python实现基于SVM手写数字识别功能

    本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下 1.SVM手写数字识别 识别步骤: (1)样本图像的准备. (2)图像尺寸标准化:将图像大小都标准化为8*8大小. (3 ...

  3. BP神经网络理解原理——用Python编程实现识别手写数字(翻译英文文献)

    BP神经网络理解原理--用Python编程实现识别手写数字   备注,这里可以用这个方法在csdn中编辑公式: https://www.zybuluo.com/codeep/note/163962 一 ...

  4. Tensorflow之基于MNIST手写识别的入门介绍

    Tensorflow是当下AI热潮下,最为受欢迎的开源框架.无论是从Github上的fork数量还是star数量,还是从支持的语音,开发资料,社区活跃度等多方面,他当之为superstar. 在前面介 ...

  5. 如何批量将手写数据转Excel?

    做实验的过程中往往需要记录数据,比如笔者有时需要测定上百个DNA样品的浓度,有时又需要去野外实验地记录田间数据,手写记录目前还是最可靠.最便捷.最有效的方法.但手写数据需要录入电脑进行数据分析,录入的 ...

  6. 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    文章目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...

  7. CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init、ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录

    CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init.ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录 目录 基于 ...

  8. 机器学习算法(九): 基于线性判别LDA模型的分类(基于LDA手写数字分类实践)

    机器学习算法(九): 基于线性判别模型的分类 1.前言:LDA算法简介和应用 1.1.算法简介 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监 ...

  9. 基于vue手写一个分屏器,通过鼠标控制屏幕宽度。

    基于vue手写一个分屏器,通过鼠标控制屏幕宽度. 先来看看实现效果: QQ录屏20220403095856 下面是实现代码: <template><section class=&qu ...

最新文章

  1. 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器
  2. poj--2019 Cornfields 2维RMQ
  3. getmany返回值 gjson_序列化多个模型并在一个JSON响应中发送所有Django Rest框架
  4. python abc
  5. 金融风控必备:想从手机上做风控管理?原来还可以从设备指纹入手
  6. 工程师分享——SMT贴片机编程的主要流程 2021-08-11
  7. 普通人适合哪种O2O创业模式 O2O模式的应用价值是什么?
  8. 【机器学习】左逆、右逆、伪逆和广义逆的概念理解
  9. 【嵌入式】学习心路历程与总结
  10. Nature:Jeff Dangl团队揭示贪噬菌属在微生物组中维持根的生长
  11. SSH基础----【超级干货】Spring常用注解用法汇总(附DEMO)
  12. [SSD核心技术:FTL 15] 固态存储FTL映射表的神秘面纱
  13. vue提取字符串中中文汉字的大写首字母
  14. 色彩和色调(色相,明度,冷暖,纯度)
  15. 分布式专题(2)- 分布式 Java通信
  16. CSDN:0分下载的技术资料的地址列表(带链接)方便大家下载啦!第六期
  17. 智慧城市——商业综合体智能化建设
  18. 0基础的新手小白,也可以做短视频自媒体,每天轻松稳定200多
  19. 选择优秀IT培训机构的终极建议!
  20. 英语单词最常用的328个前缀后缀(超全面)

热门文章

  1. Navicat MySQL连接Linux下MySQL的及2003错误解决方案
  2. django系列3.3--CBV 和 FBV
  3. LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵
  4. linux环境apache,php的安装目录
  5. angular4-http
  6. 【蓝桥杯】历届试题 分糖果
  7. PHP利用smarty生成静态页详解
  8. 【C/C++】字符串类型
  9. Windows基于gitee使用hexo搭建个人博客笔记
  10. halcon算子翻译——dev_set_window