我正在尝试从下图中提取文字。我在python中试过OCR。但它给我的结果不正确。
我预先处理了删除下划线的图像,使用了canny edge detector增加的对比度,然后将其提供给OCR。不过,我没有得到预期的产出。
由于知识有限,我试图在增加对比度后将角色从图像中分离出来。
import cv2
import numpy as np
import os
image_path = os.path.join(os.path.dirname(__file__), "image.png")
im = cv2.imread(image_path)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# converted intermediate pixels to black and white
gray[gray<100] = 0
gray[gray>=100] = 255
gray = gray[~np.all(gray == 255, axis=1)]
gray = gray[:,~np.all(gray == 255, axis=0)]
gray = gray[~np.all(gray == 0, axis=1)]
print (np.where(np.all(gray == 255,axis=0)))
print (gray[:,20:33])
words = np.hsplit(gray, np.where(np.all(gray == 255,axis=0))[0])
i = 0
for word in words:
word = word[:,~np.all(word == 255, axis=0)]
if(word.size):
print (word.shape)
i = i + 1
cv2.imwrite("temp" + str(i) + ".png", word)
就像这样
我再次将此作为pytesseract的输入。它给了我空白的输出。
这是我的疑惑。
如果看起来过于宽泛,那么短指针就可以了。解决这类问题的最佳方法是什么?
答案 0 :(得分:1)
这个答案实现了我的评论中所说的内容。
我使用opencv改变了你的代码并禁止了表单。代码是使用Python 3.5
编写的要提取数字,我按列方式对图像求和,并将得到的数组缩放为check
。我在这里使用您已经剪切的gray
图像进行操作,有效地摆脱了下划线。
x_sum = np.sum(gray, axis = 0)
check = ((x_sum)/np.max(x_sum)*10)
此数组现在可用于与阈值进行比较,以识别字母/数字所在的区域,例如:
plt.imshow(gray, cmap='gray')
x_sum = np.sum(gray, axis = 0)
check = ((x_sum)/np.max(x_sum)*10)
plt.plot((check<8).astype(int))
plt.show()
现在我们将使用此信息修改图像并删除检查数组值为0的区域,例如:
for idx,i in enumerate((check<8).astype(int)):
if i < 1:
gray[:,idx] = 255
因此我们有这张图片:
您正在做的事情可以进一步处理。这提供了单独的字母/数字,然后可以对其进行后处理以进行学习。
您将要处理的下一步是缩放/调整要由相同数量的要素描述的字母/图像。
最后,您可以使用预训练分类器来预测最可能的字母/数字。
此处提供完整代码:
import numpy as np
import os
import matplotlib.pyplot as plt
from scipy.stats import mstats
import scipy
from matplotlib import gridspec
from PIL import Image
image = Image.open("testl.png")
f = image.convert('I')
gray = np.array(f)
gray[gray<200] = 0
gray[gray>=200] = 255
gray = gray[~np.all(gray == 255, axis=1)]
gray = gray[:,~np.all(gray == 255, axis=0)]
gray = gray[~np.all(gray == 0, axis=1)]
plt.imshow(gray, cmap='gray')
x_sum = np.sum(gray, axis = 0)
check = ((x_sum)/np.max(x_sum)*10)
plt.plot((check<8).astype(int))
plt.show()
plt.matshow(gray)
plt.show()
for idx,i in enumerate((check<8).astype(int)):
if i < 1:
gray[:,idx] = 255
plt.matshow(gray)
plt.show()
words = np.hsplit(gray, np.where(np.all(gray >= 200,axis=0))[0])
gs = gridspec.GridSpec(1,len(words))
fig = plt.figure(figsize=(len(words),1))
i = 0
for word in words:
word = word[:,~np.all(word >= 230, axis=0)]
if(word.size):
ax = fig.add_subplot(gs[i])
print (word.shape)
i = i + 1
ax.matshow(word, aspect = 'auto')
plt.show()
这最终产生所有分隔的字母/数字,例如: