Python 有没有更好的方法将文字与背景分开?
我正在进行一个项目,我应该在其中申请一些文档的OCR。Python 有没有更好的方法将文字与背景分开?,python,opencv,ocr,image-thresholding,Python,Opencv,Ocr,Image Thresholding,我正在进行一个项目,我应该在其中申请一些文档的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 ran
第一步是对图像设置阈值,只允许写入(使背景变白) 输入图像示例:(出于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)
以下是我得到的结果:
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),但结果并不像我想要的那样清楚
有没有一种方法可以设置一个更好的阈值,以便只将书写内容保持为黑色,而将其余部分保持为白色?您可以使用。从文件:
在这种情况下,该算法计算图像小区域的阈值。因此,对于同一图像的不同区域,我们可以得到不同的阈值,对于不同照明的图像,我们可以得到更好的结果
你可以用。从文件:
在这种情况下,该算法计算图像小区域的阈值。因此,对于同一图像的不同区域,我们可以得到不同的阈值,对于不同照明的图像,我们可以得到更好的结果
在深入研究StackOverflow问题后,我发现了关于使用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)
以下是输出图像:
这段代码的好处在于,它不仅对这幅图像,而且对我测试的所有图像都有很好的效果。
我希望它能帮助任何有同样问题的人。在深入研究堆栈溢出问题后,我发现了使用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)
以下是输出图像:
这段代码的好处在于,它不仅对这幅图像,而且对我测试的所有图像都有很好的效果。
我希望它能帮助任何有同样问题的人。将你的个人/某人ID发布到网上不是一个好主意。谢谢你,我完全知道,这是我从网上下载的一张图片。底部看起来很干净,这就是你想要解码的吗?@MarkRansom,不仅仅是底部。主要是姓名、姓氏、日期和出生地将你的个人/某人ID发布到网上不是一个好主意。谢谢,我完全知道,这是我从网上下载的一张图片。底部看起来很干净,这就是你想要解码的吗?@markranson,不仅仅是底部。主要是姓名、姓氏、出生日期和地点。不幸的是,这也没有给出更好的结果:背景仍然很嘈杂,因此文字还不清楚。您需要相应地更改
adaptiveThreshold
方法的最后两个参数,以获得更好的结果谢谢,我会尝试。事实上,我试图调整参数,但效果不太好。不幸的是,这也没有带来更好的效果:背景仍然很嘈杂,因此文字还不清楚。您需要相应地更改adaptiveThreshold
方法的最后两个参数,以获得更好的效果谢谢,我会尝试。事实上,我试着调整参数,但效果不好。