OCR介绍及CV2(OpenCV)常用功能实现

标准而完善的 OCR 任务可分为五大步骤,其中前三步为必有区块,后两步用于提升识别准确度,如下图所示:

1.抽取
2.切割
3.文字识别
4.文字定位
5.NLP算法矫正
图像
文字区域
文字方块
文字
自然语言
输出结果

尽管近年来神经网络重创了计算机视觉领域绝大多数传统算法,但始终难以攻入学术界光学字符识别 (OCR) 模型设计非文字识别部分的主流。这是由于图像中文字有大有小,形状和排列更变换无穷,既有的目标检测算法 (R-CNN及其变形等) 难以实现高精度的文字区块识别和切割。即使存在,或需要大量的标签数据进行训练,或应用场景单一,不具备泛化能力。工业界的 OCR 系统常常为满足特定需求而设计,对输入图像的质量和格式要求严格。

限于篇幅,以下仅呈现上述步骤中第一步的代码,即文字区域抽取,核心原理在于边缘检测+形态学处理。以下是本篇代码使用的图片案例:

在这里插入图片描述

# 导入所需模块
import numpy as np
import matplotlib.pyplot as plt
import cv2

# 读取原图
_init = plt.imread(r'D:\test.jpg')
plt.imshow(_init)
plt.show()

# 重置尺寸
_resize = cv2.resize(_init,dsize=(500,300))
plt.imshow(_resize,'brg')
plt.show()

# 翻转
_flip = cv2.flip(_init,flipCode=1)    #flipCode取0/1/-1
plt.imshow(_flip,'brg')
plt.show()

# 灰度化
_gray = cv2.cvtColor(_init, cv2.COLOR_BGR2GRAY)
plt.imshow(_gray,'gray')
plt.show()

# Canny边缘检测
_canny = cv2.Canny(_gray, 500, 500, 0)
plt.imshow(_canny,'gray')
plt.show()

# Sobel边缘检测
_sobel = cv2.Sobel(_gray, cv2.CV_8U, 1, 0, ksize = 3)
plt.imshow(_sobel,'gray')
plt.show()

# 二值化
_ret, _binary = cv2.threshold(_sobel, 0, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)
plt.imshow(_binary,'gray')
plt.show()

# 腐蚀
_element_erosion = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))    #设置腐蚀核函数
_erosion = cv2.erode(_binary, _element_erosion, iterations = 1)
plt.imshow(_erosion,'gray')
plt.show()

# 膨胀
_element_dilation = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 5))    #设置膨胀核函数
_dilation = cv2.dilate(_erosion, _element_dilation, iterations = 1)
plt.imshow(_dilation,'gray')
plt.show()

# 查找和筛选文字区域
_, _contours, _ = cv2.findContours(_dilation, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)    #查找轮廓
for i in range(len(_contours)):
    _cnt = _contours[i]    #点集
    if cv2.contourArea(_cnt) < 100: continue    #筛掉面积太小的候选区域
    _rect = cv2.minAreaRect(_cnt)    #找到最小外接矩形
    _box = np.int0(cv2.boxPoints(_rect))    #四个点的坐标
    _height = abs(_box[0][1] - _box[2][1])    #计算高
    _width = abs(_box[0][0] - _box[2][0])    #计算宽
    if _height > _width * 1.3: continue    #筛选太细的矩形
    cv2.drawContours(_init, [_box], 0, (0, 255, 0), 2)    #用绿线画出轮廓
plt.imshow(_init,'brg')
plt.show()

猜你喜欢

转载自blog.csdn.net/weixin_43269174/article/details/88563978