2013-02-26 5 views
0

나는 당신이 나를 도울 수 있다고 생각하는 프로젝트에 관여하고 있습니다. 여기에 볼 수있는 여러 이미지가 있습니다 Images to recognize. 목표는 점선 사이의 숫자를 추출하는 것입니다. 그렇게하기위한 최선의 방법은 무엇입니까? 내가 처음부터 가지고있는 생각은 대시 라인의 좌표를 찾고 자르기 기능을 수행 한 다음 OCR 소프트웨어를 실행하는 것입니다. 그러나 그 좌표를 찾는 것이 쉽지 않습니다. 저를 도와 줄 수 있습니까? 또는 당신이 더 나은 접근법을 가지고 있다면 말해주십시오.특정 이미지의 번호 추출

안부, 페드로 피 멘타는

답변

0
당신은 파이썬 - 정팔 포체 https://code.google.com/p/python-tesseract/ 사용할 수 있습니다

, 그것은 당신이 할 필요가 당신의 image.What와 함께 작동 은 https://www.dropbox.com/sh/kcybs1i04w3ao97/u33YGH_Kv6#f:euro9.jpg에 test.And 소스 코드를 사용 string.I 결과를 분할하는 것입니다 아래에 있습니다. UPDATE

# -*- coding: utf-8 -*- 
from PIL import Image 
from PIL import ImageEnhance 
import tesseract 

im = Image.open('test.jpg') 
enhancer = ImageEnhance.Contrast(im) 
im = enhancer.enhance(4) 
im = im.convert('1') 
w, h = im.size 

im = im.resize((w * (416/h), 416)) 

pix = im.load() 

LINE_CR = 0.01 
WHITE_HEIGHT_CR = int(h * (20/416.0)) 

status = 0 
white_line = [] 

for i in xrange(h): 
    line = [] 
    for j in xrange(w): 
     line.append(pix[(j, i)]) 
    p = line.count(0)/float(w) 
    if not p > LINE_CR: 
     white_line.append(i) 

wp = None 
for i in range(10, len(white_line) - WHITE_HEIGHT_CR): 
    k = white_line[i] 
    if white_line[i + WHITE_HEIGHT_CR] == k + WHITE_HEIGHT_CR: 
     wp = k 
     break 

result = [] 
flag = 0 

while 1: 
    if wp < 0: 
     result.append(wp) 
     break 

    line = [] 
    for i in xrange(w): 
     line.append(pix[(i, wp)]) 
    p = line.count(0)/float(w) 

    if flag == 0 and p > LINE_CR: 

     l = [] 

     for xx in xrange(20): 
      l.append(pix[(xx, wp)]) 
     if l.count(0) > 5: 
      break 

     l = [] 
     for xx in xrange(416-1, 416-100-1, -1): 
      l.append(pix[(xx, wp)]) 
     if l.count(0) > 17: 
      break 

     result.append(wp) 
     wp -= 1 
     flag = 1 
     continue 

    if flag == 1 and p < LINE_CR: 
     result.append(wp) 
     wp -= 1 
     flag = 0 
     continue 

    wp -= 1 

result.reverse() 
for i in range(1, len(result)): 
    if result[i] - result[i - 1] < 15: 
     result[i - 1] = -1 
result = filter(lambda x: x >= 0, result) 
im = im.crop((0, result[0], w, result[-1])) 
im.save('test_converted.jpg') 

api = tesseract.TessBaseAPI() 
api.Init(".","eng",tesseract.OEM_DEFAULT) 
api.SetVariable("tessedit_char_whitelist", "abcdefghijklmnopqrstuvwxyz") 
api.SetPageSegMode(tesseract.PSM_AUTO) 

mImgFile = "test_converted.jpg" 
mBuffer=open(mImgFile,"rb").read() 
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api) 
print "result(ProcessPagesBuffer)=",result 

는 파이썬 2.7 파이썬 - 정팔 포체-는 Win32 파이썬에서 OpenCV NumPy와의 PIL을 의존하고 파이썬 - 정팔 포체의 에 기억 따라야합니다.

+0

나는 당신의 작업을 이해하지만 파선으로 수동으로 이미지를 자른다. 이 숫자는 다른 좌표에있을 수 있기 때문에이 자르기를 동적으로 수행하고 싶습니다. –

0

이미지에서 더 뚜렷한 (더 큰) 물체를 보면 시작할 수 있습니다. 점선은 일부 이미지에서 너무 작습니다. "euros milhoes"로고와 바코드를 검색하는 것이 더 쉬워지고 관련 스케일 및 회전에 대한 아이디어를 얻을 수 있습니다.

match template을 사용하지 않고이 오브젝트를 찾으려면 이미지를 2 진화하고 (배경 텍스처에주의하십시오) 윤곽선/모양에 Hu 모멘트를 사용하십시오.

숫자가 8-10 픽셀보다 작은 이미지에는 좋은 OCR 정확도가 기대되지 않습니다.

+0

힌트를 가져 주셔서 감사합니다. 그러나 문제는 파선 사이에서 이미지를 자르려는 것입니다. 왜냐하면 OCR은 파선으로 인해 읽기 오류가 발생하기 때문입니다. –

+0

로고와 바코드의 위치와 회전 및 축척이 있으면 [HorizontalRunLengthSmoothing]을 적용 할 수 있습니다 (http://www.aforgenet.com/framework/docs/html/f61451b0-4f33-9f34-ca89-fb95ca040614). .htm) 및 [VerticalRunLengthSmoothing] (http://www.aforgenet.com/framework/docs/html/249b205e-b7e5-5a70-0eef-65efa5e61da8.htm)에서 작은 maxGapSize를 사용하여 파선을 감지 한 다음 큰 숫자의 위치를 ​​감지하려면 maxGapSize 을 입력하십시오. – rold2007

+0

rold2007 감사합니다. 나는 그렇게 할 것입니다. –