0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过图像处理改善OCR识别结果的实例

jf_78858299 来源:OpenCV与AI深度学习 作者: Color Space 2023-02-08 16:54 次阅读

本文主要介绍一个通过图像处理改善OCR识别结果的实例,并给出详细步骤和源码。

背景介绍

在很多情况下,文字识别会遇到困难。比如非单一的背景、杂讯干扰、文字部分缺失等。

我们希望识别图中的黑色文字(12-14),但背景较复杂且存在其他干扰,如果直接用Tesseract识别(代码如下),识别结果为空。
# -*- coding:utf-8 -*- 
import pytesseract
from PIL import Image

# 打开图像
image = Image.open('0.png')

# OCR识别:lang默认英文
text = pytesseract.image_to_string(image)

# 打印识别后的文本
print(text)
对这种复杂情况的文字识别,直接去识别很容易失败。思考:可不可以通过图像处理将我们需要的部分分割或凸显出来再做识别?本文将以此为例做演示说明。

**详细实现步骤

**

【1】OTSU二值化
image = cv2.imread('0.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)


_,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
cv2.imshow("Otsu", thresh)

【2】距离变化 + 归一化

dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)
dist = cv2.normalize(dist, dist, 0, 1.0, cv2.NORM_MINMAX)
dist = (dist * 255).astype("uint8")
cv2.imshow("Dist", dist)

【3】对距离变换结果图做OTSU二值化

_,dist = cv2.threshold(dist, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("Dist Otsu", dist)

【4】形态学开运算滤除杂讯

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
opening = cv2.morphologyEx(dist, cv2.MORPH_OPEN, kernel)
cv2.imshow("Opening", opening)

【5】轮廓筛选,找出文字区域


black_img = cv2.cvtColor(opening, cv2.COLOR_GRAY2BGR)


cnts = cv2.findContours(opening.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
chars = []
# loop over the contours
for c in cnts:
  # compute the bounding box of the contour
  (x, y, w, h) = cv2.boundingRect(c)
  if w >= 35 and h >= 100:
    chars.append(c)

cv2.drawContours(black_img,chars,-1,(0,255,0),2)
cv2.imshow("chars", black_img)

【6】计算轮廓凸包,进一步获取文字区域mask


mask = np.zeros(image.shape[:2], dtype="uint8")

cv2.drawContours(mask, [hull], -1, 255, -1)

mask = cv2.dilate(mask, None, iterations=2)

cv2.imshow("Mask", mask)

take the bitwise of the opening image and the mask to reveal just

the characters in the image

final = cv2.bitwise_and(opening, opening, mask=mask)

cv2.imshow("final", mask)

7】Tesseract文字识别


text = pytesseract.image_to_string(final)

# 打印识别后的文本

print(text)

【8】完整代码:


#公众号:OpenCV与AI深度学习

import cv2

import numpy as np

import imutils

import pytesseract

image = cv2.imread('0.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

_,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

cv2.imshow("Otsu", thresh)

dist = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)

dist = cv2.normalize(dist, dist, 0, 1.0, cv2.NORM_MINMAX)

dist = (dist * 255).astype("uint8")

cv2.imshow("Dist", dist)

threshold the distance transform using Otsu's method

_,dist = cv2.threshold(dist, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

cv2.imshow("Dist Otsu", dist)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))

opening = cv2.morphologyEx(dist, cv2.MORPH_OPEN, kernel)

cv2.imshow("Opening", opening)

black_img = cv2.cvtColor(opening, cv2.COLOR_GRAY2BGR)

cnts = cv2.findContours(opening.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

cnts = imutils.grab_contours(cnts)

chars = []

loop over the contours

for c in cnts:

compute the bounding box of the contour

(x, y, w, h) = cv2.boundingRect(c)

if w >= 35 and h >= 100:

chars.append(c)

cv2.drawContours(black_img,chars,-1,(0,255,0),2)

cv2.imshow("chars", black_img)

chars = np.vstack([chars[i] for i in range(0, len(chars))])

hull = cv2.convexHull(chars)

allocate memory for the convex hull mask, draw the convex hull on

the image, and then enlarge it via a dilation

mask = np.zeros(image.shape[:2], dtype="uint8")

cv2.drawContours(mask, [hull], -1, 255, -1)

mask = cv2.dilate(mask, None, iterations=2)

cv2.imshow("Mask", mask)

take the bitwise of the opening image and the mask to reveal just

the characters in the image

final = cv2.bitwise_and(opening, opening, mask=mask)

cv2.imshow("final", final)

text = pytesseract.image_to_string(final)

打印识别后的文本

print(text)

cv2.waitKey()

cv2.destroyAllWindows()

**参考链接**

(1)https://pyimagesearch.com/2021/11/22/improving-ocr-results-with-basic-image-processing/

(2)https://stackoverflow.com/questions/33881175/remove-background-noise-from-image-to-make-text-more-clear-for-ocr
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏

    评论

    相关推荐

    OCR文字距离太近应该如何处理

    ;最近需要做一个OCR文字识别的自动测试,之前基本没有接触过图像处理的相关概念,对于纯数学上的算法目前也只是大致在看。 我需要识别的图片情况
    发表于 05-04 15:07

    OCR SDK开发者平台推荐:OCR图像智能字符识别技术

    为了促进业内生态环境良好发展,帮助开发者更好的专注于自己的产品。想让产品实现OCR图像智能字符识别技术,看此帖!楼主吐血为大家找到一个集身份证识别,驾驶证
    发表于 09-25 13:48

    Labview调用OCR Training.exe实现字符识别

    ;这一步实现之后就是读取训练文件进行图像字符的识别了,所需参数:ROI ;图像 ;*.abc训练文件路径 ;Parameters(字符识别参数);简单方式可
    发表于 08-16 17:36

    Labview怎么实现对OCR识别定位,在线急等

    在实际应用中进行OCR识别时,字符的位置以及角度是经常变化的,怎么利用LabVIEW对彩色图像进行灰度处理以及定位识别?这里图一是彩色照片、
    发表于 11-18 15:18

    Python OCR 识别库-ddddocr

    ;, 'rb') as f: image = f.read()res = ocr.classification(image)print(res)识别结果3n3d8342总结ddddocr 让验证码变得如此简单
    发表于 03-30 17:26

    【KV260视觉入门套件试用体验】七、VITis AI字符和文本检测(OCR&Textmountain)

    某些字符的图像。输出为包含所识别的字词及其位置的结构。下 图显示了 OCR结果。 换一个带中文的图片试一下,结果只能
    发表于 09-26 16:31

    车号图像处理识别系统的研制

    文章介绍了用于火车货车的车皮号及自重数字图像识别的计算机图像处理识别系统的实践。使用滤波和非线性灰度扩展,使显示图像获得
    发表于 06-19 08:36 12次下载

    什么是OCR

    什么是OCR OCR的英文全称: OCR是英文Optical Character Recognition的缩写,意思是光学字符识别,也可简单地称为文字
    发表于 04-10 12:55 6147次阅读

    基于FPGA的OCR文字识别技术的深度解析

    识别整体性能为GPU P4 130%,处理延时仅为P4的1/10,CPU的1/30。 1.文字识别技术- OCR OCR技术,通俗来讲就是从
    发表于 01-26 12:19 3839次阅读

    移动端证件OCR识别/安卓IOS平台

    一、证件识别/证件OCR介绍移动端证件识别是开发的基于移动平台的证件识别/证件OCR应用程序,支持Android、iOS等多种主流移动操作系
    发表于 06-15 15:42 239次阅读

    OCR光学字符识别技术原理讲解

    纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
    的头像 发表于 03-02 13:49 2w次阅读

    OCR识别技术

    在爬虫对验证码进行破解时,经常需要对图片中的文字内容进行识别,这时就需要用到OCR技术了,那么 OCR识别技术是如何实现对文字内容“即拍即得”的呢?
    的头像 发表于 03-12 09:07 4515次阅读

    OCR实战教程

    OCR 是光学字符识别(英语:Optical Character Recognition,OCR)是指对文本资料的图像文件进行分析识别处理
    的头像 发表于 02-24 10:36 788次阅读
    <b class='flag-5'>OCR</b>实战教程

    OCR如何自动识别图片文字

    OCR 是光学字符识别(英语:Optical Character Recognition,OCR)是指对文本资料的图像文件进行分析识别处理
    的头像 发表于 10-31 16:45 530次阅读
    <b class='flag-5'>OCR</b>如何自动<b class='flag-5'>识别</b>图片文字

    基于OpenVINO+OpenCV的OCR处理流程化实现

    处理主要是基于OpenCV、场景文字检测与识别基于OpenVINO框架 + PaddleOCR模型完成。直接按图索骥即可得到最终结果。 OpenCV预处理主要是完成偏斜矫正、背景矫正
    的头像 发表于 11-07 11:21 511次阅读
    基于OpenVINO+OpenCV的<b class='flag-5'>OCR</b><b class='flag-5'>处理</b>流程化实现