2017-11-13 10 views
1

:클러스터 경계 상자와 그들에 선을 그립니다 (OpenCV의, 파이썬) 나는 아래 이미지에서 문자 주위에 약간의 경계 상자를 만들어이 코드

import csv 
import cv2 
from pytesseract import pytesseract as pt 

pt.run_tesseract('bb.png', 'output', lang=None, boxes=True, config="hocr") 

# To read the coordinates 
boxes = [] 
with open('output.box', 'rt') as f: 
    reader = csv.reader(f, delimiter=' ') 
    for row in reader: 
     if len(row) == 6: 
      boxes.append(row) 

# Draw the bounding box 
img = cv2.imread('bb.png') 
h, w, _ = img.shape 
for b in boxes: 
    img = cv2.rectangle(img, (int(b[1]), h-int(b[2])), (int(b[3]), h-int(b[4])), (0, 255, 0), 2) 

cv2.imshow('output', img) 
cv2.waitKey(0) 

OUTPUT

bb-o1

내가 원하는 것은 :

bb-o2

프로그램은 테두리 상자의 X 축에 수직선을 그려야합니다 (첫 번째 및 세 번째 텍스트 영역에만 해당). 중간에있는 사람은 그 과정에 관심이 없어야합니다.)

목표는 이것입니다 (그리고 그것을 달성하는 또 다른 방법이 있습니다, 설명해주십시오) : 일단이 두 라인 (또는 더 나은 좌표 그룹)을 가지고이 두 영역을 커버하기 위해 마스크를 사용하십시오.

bb-o3

은 가능합니까?

원본 이미지 : 요청으로

src

CSV : 인쇄 (박스)

[['l', '56', '328', '63', '365', '0'], ['i', '69', '328', '76', '365', '0'], ['n', '81', '328', '104', '354', '0'], ['e', '108', '328', '130', '354', '0'], ['1', '147', '328', '161', '362', '0'], ['m', '102', '193', '151', '227', '0'], ['i', '158', '193', '167', '242', '0'], ['d', '173', '192', '204', '242', '0'], ['d', '209', '192', '240', '242', '0'], ['l', '247', '193', '256', '242', '0'], ['e', '262', '192', '292', '227', '0'], ['t', '310', '192', '331', '235', '0'], ['e', '334', '192', '364', '227', '0'], ['x', '367', '193', '398', '227', '0'], ['t', '399', '192', '420', '235', '0'], ['-', '440', '209', '458', '216', '0'], ['n', '481', '193', '511', '227', '0'], ['o', '516', '192', '548', '227', '0'], ['n', '553', '193', '583', '227', '0'], ['t', '602', '192', '623', '235', '0'], ['o', '626', '192', '658', '227', '0'], ['t', '676', '192', '697', '235', '0'], ['o', '700', '192', '732', '227', '0'], ['u', '737', '192', '767', '227', '0'], ['c', '772', '192', '802', '227', '0'], ['h', '806', '193', '836', '242', '0'], ['l', '597', '49', '604', '86', '0'], ['i', '610', '49', '617', '86', '0'], ['n', '622', '49', '645', '75', '0'], ['e', '649', '49', '671', '75', '0'], ['2', '686', '49', '710', '83', '0']] 

이 편집 :

zindarod 대답을 사용하려면 tesserocr이 필요합니다. pip install tesserocr을 통해 설치하면 다양한 오류가 발생할 수 있습니다. 휠 버전을 찾았습니다. (몇 시간 후에 설치하고 오류를 해결하고 답변 아래 내 의견을 참조하십시오 ...) : here you can find/download it. 이 도움이

희망 ..

+0

테두리 상자를 클러스터 한 다음 줄 1 클러스터에서 최대 y를 얻고 줄 2 클러스터에서 최소 y를 얻고 2 y 및 모든 너비를 사용하여 사각형을 만들 것을 제안합니다. 마스크를 가지고있다. – api55

+0

맞아. 그것을하는 방법을 알고 있습니까? 또한이 연구를위한 또 다른 키워드 인 "Connected-component labeling"을 발견했습니다. – Link

+0

연결된 구성 요소는 작동하지 않습니다. 모든 사람들이 어떻게 든 연결되어 있다면이 방법이 효과적입니다. 그러나 y 값과 k = 3을 가진 k-means를 사용할 수 있습니다. 그러면 y 값에 따라 3 개의 문자 클러스터가 생깁니다. kmeans가 opencv에서 구현되었습니다 – api55

답변

3

이미 정팔 포체 - OCR 구글의 page segmentation method(psm)에서이 기능이 있습니다. 당신은 더 나은 파이썬 래퍼를 사용해야합니다. pytesseract보다 많은 tesseract의 기능을 노출합니다. 더 좋은 것들 중 하나는 tesserocr입니다. 귀하의 이미지와

간단한 예 :

import cv2 
    import numpy as np 
    import tesserocr as tr 
    from PIL import Image 

    cv_img = cv2.imread('text.png', cv2.IMREAD_UNCHANGED) 

    # since tesserocr accepts PIL images, converting opencv image to pil 
    pil_img = Image.fromarray(cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)) 

    #initialize api 
    api = tr.PyTessBaseAPI() 
    try: 
    # set pil image for ocr 
    api.SetImage(pil_img) 
    # Google tesseract-ocr has a page segmentation methos(psm) option for specifying ocr types 
    # psm values can be: block of text, single text line, single word, single character etc. 
    # api.GetComponentImages method exposes this functionality 
    # function returns: 
    # image (:class:`PIL.Image`): Image object. 
    # bounding box (dict): dict with x, y, w, h keys. 
    # block id (int): textline block id (if blockids is ``True``). ``None`` otherwise. 
    # paragraph id (int): textline paragraph id within its block (if paraids is True). 
    # ``None`` otherwise. 
    boxes = api.GetComponentImages(tr.RIL.TEXTLINE,True) 
    # get text 
    text = api.GetUTF8Text() 
    # iterate over returned list, draw rectangles 
    for (im,box,_,_) in boxes: 
     x,y,w,h = box['x'],box['y'],box['w'],box['h'] 
     cv2.rectangle(cv_img, (x,y), (x+w,y+h), color=(0,0,255)) 
    finally: 
    api.End() 

    cv2.imshow('output', cv_img) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows() 

result

+1

그건 내가 제안했던 것보다 훨씬 나아 보인다. :) – api55

+0

그래,하지만 tesserocr을 설치하는 동안 나에게 오류가 발생한다. 사실 나는 pyocr을 래퍼 (wrapper)로 사용하고 있습니다. 이걸로 끝낼 수 없습니까? 감사합니다. . 필자가 지금하고 싶은 일에 최선을 다하겠습니다. Error : 'python setup.py egg_info'가 오류 코드 1로 실패했습니다 .. 솔루션 검색 중 .. – Link

+0

@ api55 opencv에 이미 Google의 * text * 모듈이 있습니다. tesseract-ocr, 불행히도 파이썬 API는 * psm * 기능을 드러내지 않습니다. – zindarod

0

나는 다른 무언가를 찾고, 늦게 여기입니다. 저는 테서 래퍼를 사용한 적이 없습니다. 그들은 단지 실질적인 이익을 얻지 못하는 것 같습니다. 그들이하는 일은 부 프로세스에 대한 호출을 추상화하는 것뿐입니다.

이것은 서브 프로세스에 전달 된 args를 통해 psm 구성에 액세스하는 방법입니다. oem, pdf 및 hocr 매개 변수는 완전성을 위해 포함되어 있지만 필요하지는 않습니다. psm 매개 변수를 전달하면됩니다. 13 psm 옵션이 있고 oem에 4가 있기 때문에 터미널에서 도움 요청을하십시오. 당신이하고있는 것에 따라 품질은 psm에 크게 의존 할 수 있습니다.

subprocess.Popen()을 사용하여 파이프 인 및 아웃하는 것이 가능합니다. 또는 같은 방법으로 asyncio.create_subprocess_exec()를 비동기 적으로 수행 할 수 있습니다.

import subprocess 

# args 
# 'tesseract' - the executable name 
# path to the image file 
# output file name - no extension tesser will add .txt .pdf .hocr etc etc 
# optional params 
# -psm x to set the page segmentation mode see more with tesseract --help-psm at the cli 
# -oem x to set ocr engine mode see more with tesseract --help-osm 
# can add a mode parameter to the end of the args list to get output in : 
# searchable pdf - just add a parameter 'pdf' as below 
# hOCR output (html) - just add 'hocr' as below 

args = ['tesseract', 'Im1.tiff', 'Im1', '-psm 1', '-oem 2'] 

# args = ['tesseract', 'Im1.tiff', 'Im1', '-psm 1', '-oem 2', 'pdf'] 
# args = ['tesseract', 'Im1.tiff', 'Im1', '-psm 1', '-oem 2', 'hocr'] 

try: 
    proc = subprocess.check_call(args) 
    print('subprocess retcode {r}'.format(r=proc)) 
except subprocess.CalledProcessError as exp: 
    print('subprocess.CalledProcessError : ', exp)