收据上字符褪色的部分可以恢复吗?
Can the faded parts of a character in a receipt be restored?
我有一些包含扫描收据的文件,我需要使用 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)))
请注意,thinning 算法位于 opencv_contrib 存储库中;因此,请考虑其使用许可。
我有一些包含扫描收据的文件,我需要使用 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)))
请注意,thinning 算法位于 opencv_contrib 存储库中;因此,请考虑其使用许可。