1

我正在做一个项目,我应该在一些文件上申请和 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),但结果并不像我想要的那样清晰。

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

4

2 回答 2

3

在深入研究 Stack Overflow问题后,我找到了这个关于使用 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)

这是输出图像:

在此处输入图像描述

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

我希望它可以帮助任何有同样问题的人。

于 2018-11-05T20:05:38.597 回答
1

您可以使用自适应阈值。从文档:

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

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 )
于 2018-11-01T03:23:53.583 回答