图像处理案例06 OCR应用

OCR应用

  • [1 OCR读取账单](#1 OCR读取账单)
    • [1.1 背景及思路](#1.1 背景及思路)
    • [1.2 代码](#1.2 代码)

1 OCR读取账单

1.1 背景及思路

  1. 思路

    目标是读取图片中账单的信息。首先要截取图片上的账单,考虑到账单并非都是整齐摆放,为了保持算法的通用性,通过透视变换对扣取的账单摆正,然后调用工具识别账单上的信息。

  2. 步骤

    1) 读取图像,做二值化。

    2)开运算除噪声。

    3)找到图像的最大外部轮廓,根轮廓得到账单的最小外接矩形的坐标,根据坐标对账单做透视变换。

    4)识别账单上的信息。

1.2 代码

python 复制代码
img_rgb = cv2.imread('OCR识别账单文字/note.jpg')
img_gray = cv2.imread('OCR识别账单文字/note.jpg', 0)
img = img_gray.copy()
_ ,benary = cv2.threshold(img_gray,0,240,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.imshow(benary,"gray")
k=np.ones((10,10),np.uint8)
r1=cv2.morphologyEx(benary,cv2.MORPH_OPEN,k)  # 除掉了噪声
plt.imshow(r1,"gray")
ret, binary = cv2.threshold(r1,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# ret, binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
        
rect = cv2.minAreaRect(contours[0])
points = cv2.boxPoints(rect)
points = points.astype(np.int32)
image=cv2.drawContours(img_rgb.copy(),[points],0,(255,255,255),2)

# 透视变换
pts = np.zeros((4, 2), np.float32)
res = np.sum(points, axis=1)
pts[0] = points[np.argmin(res)]
pts[2] = points[np.argmax(res)]
res = np.diff(points, axis=1)
pts[1] = points[np.argmin(res)]
pts[3] = points[np.argmax(res)]
pts = np.array(pts, np.float32)

#计算边长
w1 = np.sqrt((pts[0][0] - pts[1][0]) ** 2 + (pts[0][1] - pts[1][1]) ** 2)
w2 = np.sqrt((pts[2][0] - pts[3][0]) ** 2 + (pts[2][1] - pts[3][1]) ** 2)
w = int(max(w1, w2))

h1 = np.sqrt((pts[1][0] - pts[2][0]) ** 2 + (pts[1][1] - pts[2][1]) ** 2)
h2 = np.sqrt((pts[0][0] - pts[3][0]) ** 2 + (pts[0][1] - pts[3][1]) ** 2)
h = int(max(h1, h2))

#计算目标图像的尺寸
dst = np.array([
    [0, 0],
    [w - 1, 0],
    [w - 1, h - 1],
    [0, h - 1]
], np.float32)

#透视变换
mat = cv2.getPerspectiveTransform(pts, dst)
img = img_gray.copy()
img = cv2.warpPerspective(img, mat, (w, h))
plt.imshow(img,"gray")

# 二值化
img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
text = pytesseract.image_to_string(img)
print(text)
'''
Berghotel
    
 
Srosse Scheidegg
SBI Geindehald
Fate Rotter
Rech te A572 2.07. 2007/18:29:17
bar Tech Y/0t
Qieatta Macehial 4450 OF 9.00
'ubloxt a 500 oF s.09
nGcheotnscettzel & 22.00 OF 2200
worsespstzt) 850 OF HEBD
 
Jorat: oF 54,56
Incl, 1.8% St $850.08: 3.85
Fntsprteht tn Euro $6.33. EUR
Es bedtente Sta: Ursuta
  
Tht Hee: 430-234 |
Tel. 088 853.67 16
Fax, : 088 858 87 19
Ennai ls srassesche angeBbiuevie.ch
'''

上图中左图为原图,右图为二值化后的图像,观察发现,二值化后的图像有噪声,影响寻找账单的轮廓。

对二值化后的图像做开运算可以消除图像上的噪声,方便寻找图像的轮廓,右图为

根据图像最外轮廓得到的账单,并对账单做透视变换的结果,根据右图可以做检测。

相关推荐
这张生成的图像能检测吗25 分钟前
(论文速读)SCNN:用于交通场景理解的空间CNN
人工智能·深度学习·目标检测·计算机视觉·道路线检测
蓝创工坊Blue Foundry1 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
小保CPP2 小时前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
求真学习3 小时前
智谱联合清华开源GLM-OCR,0.9B参数配MTP多Token预测,文档解析吞吐量1.86页/秒,印章识别90.5分,第二名才42.2分
ocr·pdf解析·glm·文档解析·智谱
Microvision维视智造3 小时前
从“看见“到“看懂“——工业视觉的大模型时刻到了吗?
人工智能·计算机视觉·视觉检测·机器视觉
小保CPP4 小时前
OpenCV C++提取webp动图里的图片
c++·人工智能·opencv·计算机视觉
深度研习笔记14 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
腾渊信息科技公司15 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
点PY16 小时前
一种从CTA图像中去除扫描床的方法及装置
人工智能·计算机视觉
小白巨白16 小时前
玫瑰花园管理系统:AI识病+3D可视化,一套面向中小型玫瑰种植园的数字化管理工具
css·人工智能·计算机视觉·html5