【问题标题】:Is there a better way to separate the writing from the background?有没有更好的方法将写作与背景分开?
【发布时间】:2018-12-21 16:49:00
【问题描述】:

我正在做一个项目,我应该在其中申请和 OCR 处理一些文件。
第一步是对图像进行阈值处理,只让文字(背景变白)。

输入图像示例:出于 GDPR 和隐私原因,此图像来自互联网

这是我的代码:

import cv2
import numpy as np


image = cv2.imread('b.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
h = image.shape[0]
w = image.shape[1]
for y in range(0, h):
    for x in range(0, w):
        if image[y, x] >= 120:
            image[y, x] = 255
        else:
            image[y, x] = 0
cv2.imwrite('output.jpg', image)

这是我得到的结果:

当我将 pytesseract 应用于输出图像时,结果并不令人满意(我知道 OCR 并不完美)。尽管我尝试调整阈值(在此代码中它等于 120),但结果并没有我想要的那么清晰。

有没有办法设置一个更好的阈值,以便只保持黑色和白色的写作?

【问题讨论】:

  • 在网上发布您的个人/某人 ID 不是一个好主意。
  • 谢谢,我完全知道,这是我从网上下载的图片
  • 底部看起来很干净,是你要解码的吗?
  • @MarkRansom,不仅是底部。主要是姓名、姓氏、出生日期和地点

标签: python opencv ocr image-thresholding


【解决方案1】:

在深入研究 StackOverflow 问题后,我发现this answer 是关于使用 opencv 去除水印的。 我根据自己的需要调整了代码,这就是我得到的:

import numpy as np
import cv2


image = cv2.imread('a.png')
img = image.copy()

alpha =2.75
beta = -160.0

denoised = alpha * img + beta
denoised = np.clip(denoised, 0, 255).astype(np.uint8)

#denoised = cv2.fastNlMeansDenoising(denoised, None, 31, 7, 21)

img = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)

h = img.shape[0]
w = img.shape[1]

for y in range(0, h):
    for x in range(0, w):
        if img[y, x] >= 220:
            img[y, x] = 255
        else:
            img[y, x] = 0

cv2.imwrite('outpu.jpg', img)

这是输出图像:

这段代码的好处在于,它不仅对这张图片,而且对我测试的所有图片都给出了很好的结果。

希望对遇到同样问题的人有所帮助。

【讨论】:

    【解决方案2】:

    您可以使用adaptive thresholding。来自文档:

    在此,算法计算图像小区域的阈值。因此,我们为同一图像的不同区域获得了不同的阈值,它可以为具有不同光照的图像提供更好的结果。

    import numpy as np
    import cv2
    
    
    
    image = cv2.imread('b.jpg')
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    image = cv2.medianBlur(image ,5)
    
    th1 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
                cv2.THRESH_BINARY,11,2)
    th2 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                cv2.THRESH_BINARY,11,2)
    cv2.imwrite('output1.jpg', th1 )
    cv2.imwrite('output2.jpg', th2 )
    

    【讨论】:

    • 不幸的是,这也没有给出更好的结果:背景仍然很嘈杂,所以文字还不清楚。
    • 您需要相应地更改adaptiveThreshold方法的最后两个参数以获得更好的结果
    • 其实我也尝试过调整参数,但是效果并不好。
    猜你喜欢
    • 2015-10-10
    • 2014-02-21
    • 2017-11-06
    • 2012-11-29
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多