收据中字符的褪色部分可以恢复吗? [英] Can the faded parts of a character in a receipt be restored?

查看:42
本文介绍了收据中字符的褪色部分可以恢复吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些文件包含一些扫描的收据,我需要使用OCR从其中提取文本。由于收据中打印的文字会在一段时间后淡出,因此收据中的某些文字不清晰,会影响OCR结果。

淡出单词的一些示例:

有什么方法可以恢复褪色的部分,以便我可以改善OCR结果?

我在OpenCV中尝试了图像阈值和图像平滑,但效果不是很理想。是否可以进一步处理该图像?

先取平均值,然后取高斯阈值

先是高斯模糊,然后是高斯阈值

推荐答案

此方法并不完美,也不适用于所有字符(最好指定字符范围,将其分隔,然后在单独的字符上尝试此方法)。这是一个基本的想法;也许你可以完成它。最后的字符看起来不像原始字体,可能只是更具可读性。考虑到选择的方法,这似乎很自然;由于字符受到破坏,识别初始字体的名称和类型并非易事。

import sys
import cv2
import numpy as np

# Load and resize image
im = cv2.imread(sys.path[0]+'/im.png')
H, W = im.shape[:2]
S = 4
im = cv2.resize(im, (W*S, H*S))

# Convert to binary
msk = im.copy()
msk = cv2.cvtColor(msk, cv2.COLOR_BGR2GRAY)
msk = cv2.threshold(msk, 200, 255, cv2.THRESH_BINARY)[1]

# Glue char blobs together
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 13))
kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (4, 5))
msk = cv2.medianBlur(msk, 3)
msk = cv2.erode(msk, kernel1)
msk = cv2.erode(msk, kernel2)

# Skeletonization-like operation in OpenCV
thinned = cv2.ximgproc.thinning(~msk)

# Make final chars
msk = cv2.cvtColor(msk, cv2.COLOR_GRAY2BGR)
thinned = cv2.cvtColor(thinned, cv2.COLOR_GRAY2BGR)
thicked = cv2.erode(~thinned, np.ones((9, 15)))
thicked = cv2.medianBlur(thicked, 11)

# Save the output
top = np.hstack((im, ~msk))
btm = np.hstack((thinned, thicked))
cv2.imwrite(sys.path[0]+'/im_out.png', np.vstack((top, btm)))


有关模块及其许可证的详细信息: OpenCVNumPy

请注意,细化算法位于OpenCV_Conrib存储库中;因此,请考虑使用其许可证。

这篇关于收据中字符的褪色部分可以恢复吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆