好的形象,但没有来自OCR的文字,为什么?Python,Skimage,PIL,Tesseract

Inê*_*ins 3 ocr tesseract image-processing python-imaging-library scikit-image

我对图像处理,CV和OCR都很陌生.到目前为止,我认为这是一个惊人的主题,我愿意进一步挖掘它.

想象一下,我有这个原始图像: 原始页面

我把它调整到这个: 调整

然后我找到了区域最大值并获得此图像(以避免更轻的背景和太嘈杂的): 区域千里马

然后将上面的图像提交到阈值并处理具有此图像: Tresholded 在我看来,这个图像不是100%二进制...如果我放大它,它会在字符内显示一些灰色像素......

我认为最后一张图片应该足够/(非常好,确实)用于OCR,你不觉得吗?但是没有文字出来......

我的代码:

#http://stackoverflow.com/questions/18813300/finding-the-coordinates-of-maxima-in-an-image
from PIL import *
from PIL import Image
import numpy as np
from skimage import io
from skimage import img_as_float
from scipy.ndimage import gaussian_filter
from skimage.morphology import reconstruction
import pytesseract

im111 = Image.open('page.jpg')

basewidth = 1000
wpercent = (basewidth / float(im111.size[0]))
hsize = int((float(im111.size[1]) * float(wpercent)))
image_resized = im111.resize((basewidth, hsize), Image.ANTIALIAS)
image_resized.save('page2.jpg')

image = img_as_float(io.imread('page2.jpg', as_grey=True))
image = gaussian_filter(image, 1)
seed = np.copy(image)
seed[1:-1, 1:-1] = image.min()
mask = image
dilated = reconstruction(seed, mask, method='dilation')
image = image - dilated

#print type(image)

#io.imsave("RegionalMaxima.jpg", image)

im = np.array(image * 255, dtype = np.uint8)
a = np.asarray(im)
img = Image.fromarray(a)

#img.show()

#print type(img)
#img.save('RegionalMaximaPIL.jpg')

#image2 = Image.open('RegionalMaxima.jpg')

minima, maxima = img.getextrema()
print "------Extrema1----------" + str(minima), str(maxima)
mean = int(maxima/4)
im1 = img.point(lambda x: 0 if x<mean else maxima, '1')
im1.save('Thresh_calculated.jpg')
#im1.show()

mini, maxi = im1.getextrema()
print "-------Extrema2(after1stTresh)---------" + str(mini), str(maxi)

im2 = im1.point(lambda x: 0 if x<128 else 255, '1')
im2.save('Thresh_calculated+++.jpg')
im2.show()

text = pytesseract.image_to_string(im2)
print "-----TEXT------" + text
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?带有阈值图像的pytesseract.image_to_string(im1)应该已经检索了一些文本:/

其他疑惑:第二个"getextrema()"结果不应该是0和255 ??? 我很困惑,因为他们仍然在第一个阈值之前给我相同的数字...所以由第二个阈值产生的图像全是黑色的.

非常感谢您的时间和帮助.

Mar*_*ell 5

对不起,我不会说python,但我tesseract从命令行有一些经验.从一些实验我做了一段时间后,我认为tesseract识别字母的最佳位置是它们大约30-50像素高.

按照这个逻辑,我用ImageMagick提取了你的一部分图像,以包含单词Nokia和单词225.然后我将生成的两行文本和一些垂直空间的大小调整为160像素,即使字母高出50像素.

convert nokia.jpg -crop 1000x800+1800+1000 -resize x160 x.jpg
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后我运行tesseract如下并查看已识别的文本:

tesseract x.jpg text
Tesseract Open Source OCR Engine v3.02.02 with Leptonica

more text*
NOKIA
225
Run Code Online (Sandbox Code Playgroud)

我不是假装这是奇迹解决方案 - 我只是说我会删掉一些文本 - 可能使用"连接组件分析"(或其他东西)并调整大小以使文本高约30-80像素,看看是什么给人.

随意在评论中提出任何问题,我会看到我能做些什么 - 或者其他一些聪明的人会知道更多,并在他们的想法中扼杀......

我有一点时间做更多的实验,所以我试图找到yuor图像整体高度的最佳位置,以帮助tesseract更成功.我以10步为单位将高度从100像素改为500像素,然后查看生成的OCR文本,如下所示:

for x in $(seq 100 10 500); do 
  convert nokia.jpg -resize x$x small.jpg
  echo Height:$x
  tesseract small.jpg text >/dev/null 2>&1 && grep -E "NOKIA|225" text*
done

Height:100
Height:110
Height:120
Height:130
Height:140
NOKIA
225
Height:150
Height:160
Height:170
225
Height:180
Height:190
NOKIA
225
Height:200
225
Height:210
NOKIA
225
Height:220
NOKIA
225
Height:230
NOKIA
225
Height:240
NOKIA
225
Height:250
NOKIA
225
Height:260
Height:270
NOKIA
225
Height:280
Height:290
NOKIA
225
Height:300
NOKIA
225
Height:310
Height:320
NOKIA
225
Height:330
Height:340
Height:350
NOKIA
225
Height:360
NOKIA
225
Height:370
NOKIA
225
Height:380
NOKIA
225
Height:390
Height:400
Height:410
Height:420
Height:430
Height:440
Height:450
NOKIA
225
Height:460
Height:470
Height:480
Height:490
Height:500
Run Code Online (Sandbox Code Playgroud)