计算机屏幕的图像识别

时间:2017-02-27 06:25:41

标签: python opencv machine-learning ocr image-recognition

我正在尝试从下图中提取文字。我在python中试过OCR。但它给我的结果不正确。

Test image

我预先处理了删除下划线的图像,使用了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)

就像这样

Cropped images

我再次将此作为pytesseract的输入。它给了我空白的输出。

这是我的疑惑。

  1. 我们能否有更好的机制将白色空间上的字符与图像分开。目前,我似乎非常容易受伤。
  2. 如何通过OCR更好地检测图像的预处理。
  3. 我们可以使用神经网络或SVM,就像我们用于MNIST Digits dataset
  4. 一样

    如果看起来过于宽泛,那么短指针就可以了。解决这类问题的最佳方法是什么?

1 个答案:

答案 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()

enter image description here

现在我们将使用此信息修改图像并删除检查数组值为0的区域,例如:

for idx,i in enumerate((check<8).astype(int)):     
    if i < 1:
        gray[:,idx] = 255

因此我们有这张图片:

enter image description here

您正在做的事情可以进一步处理。这提供了单独的字母/数字,然后可以对其进行后处理以进行学习。

您将要处理的下一步是缩放/调整要由相同数量的要素描述的字母/图像。

最后,您可以使用预训练分类器来预测最可能的字母/数字。

此处提供完整代码:

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()

这最终产生所有分隔的字母/数字,例如:

enter image description here