2017-07-10 16 views
15

Dijitalleştirilmiş kağıt formlarından B & W görüntüler (1bit) içeren birkaç binlerce PDF dosyam var. Ben bazı alanları OCR çalışıyorum, ama bazen yazı kadar soluktur: Sadece morfolojik dönüşümler hakkında öğrendiğimÖnceden taranmayan el yazısı basamakları ön işleme

enter image description here

. Onlar gerçekten harika!!! Onları istismar ettiğimi hissediyorum (Perl'i öğrendiğimde normal ifadelerle yaptığım gibi).

Ben 2017/07/06, tarih ilgileniyorum sadece: Bu formu doldurarak

im = cv2.blur(im, (5, 5)) 
plt.imshow(im, 'gray') 

enter image description here

ret, thresh = cv2.threshold(im, 250, 255, 0) 
plt.imshow(~thresh, 'gray') 

enter image description here

İnsanlar için bazı ihmal var gibi görünüyor ızgara, bundan kurtulmaya çalıştım. Ben dönüşümü bununla yatay çizgi izole etmek mümkün değilim:

horizontal = cv2.morphologyEx(
    ~thresh, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (100, 1)), 
) 
plt.imshow(horizontal, 'gray') 

enter image description here

Ben de dikey çizgiler elde edebilirsiniz:

plt.imshow(horizontal^~thresh, 'gray') 

ret, thresh2 = cv2.threshold(roi, 127, 255, 0) 
vertical = cv2.morphologyEx(
    ~thresh2, 
    cv2.MORPH_OPEN, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (2, 15)), 
    iterations=2 
) 
vertical = cv2.morphologyEx(
    ~vertical, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9)) 
) 
horizontal = cv2.morphologyEx(
    ~horizontal, 
    cv2.MORPH_ERODE, 
    cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) 
) 
plt.imshow(vertical & horizontal, 'gray') 

enter image description here

Şimdi alabilirsiniz ızgaradan kurtulmak için:

plt.imshow(horizontal & vertical & ~thresh, 'gray') 

enter image description here

elimdeki en iyi bu oldu ama 4 hala 2 parçaya ayrılır: Muhtemelen cv2.findContours ve bazı sezgisel bir yaklaşım kullanmak daha iyidir bu noktada

plt.imshow(cv2.morphologyEx(im2, cv2.MORPH_CLOSE, 
    cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))), 'gray') 

enter image description here

Her rakamı bulmak için, ama merak ediyorum:

  1. tüm belgelerin gri tonlarında yeniden taranmasını ister misiniz? Soluk basamakları ayırmak ve bulmak için
  2. daha iyi yöntemler var mı?
  3. "4" gibi durumlara katılmak için herhangi bir morfolojik dönüşüm biliyor musunuz?

[güncelleme]

çok belgeleri rescanning talep mi? Ben çalışan bir kimse değilim: o hiçbir büyük sorun ise bunun eğitime daha yüksek kalitede girdi almak daha iyidir ve gürültülü ve atipik verileri

Biraz bağlam dayanacak şekilde modelinizi rafine çalışıyor inanıyoruz Brezilya'da bir kamu ajansı. ICR çözümleri için fiyat 6 basamakta başlıyor, bu sayede hiç kimse tek bir adamın şirket içinde bir ICR çözümü yazabileceğine inanmıyor.Onları yanlış kanıtlayabileceğime inanacak kadar naifim. Bu PDF belgeleri bir FTP sunucusunda (yaklaşık 100K dosya) oturuyordu ve ölü ağaç sürümünden kurtulmak için tarandılar. Muhtemelen orijinal formu alıp tekrar tarayabilirim, ancak bazı resmi destek istemem gerekecek - çünkü kamu sektörü bu projeyi olabildiğince yeraltında tutmak istiyorum. Şimdi sahip olduğum şey% 50'lik bir hata oranıdır, fakat eğer bu yaklaşım bir çıkmazsa, onu geliştirmeye çalışmak için bir nokta yoktur.

+1

Belgeleri yeniden taramak çok mu zorluyor? Eğer büyük bir sorun olmazsa, antrenmandan daha kaliteli girdiler elde etmenin ve gürültülü ve atipik verilere dayanmak için modelinizi düzeltmeye çalışmanın daha iyi olduğuna inanıyorum. – DarkCygnus

+0

@GrayCygnus: Bir bürokrasi ve atalet okyanusu geçmeliydim, ama bu mümkün . Muhtemelen tüm el işlerini kendim yapmak zorunda kalacağım. –

+0

Ayrıca, bu [öğretici] 'ye (http://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/) bir göz atmanızı öneririm. Bir önceki soruya verdiğim yanıt üzerine), Tesseract'ı (Googles OCR Engine'in bir sarıcısı) OCR yapmak için harika bir araç olarak tanıttılar. Ayrıca, [bu yazının] (http://worldcomp-proceedings.com/proc/p2016/ICA3674.pdf), öklid mesafesi metrikli K-en yakın komşuları kullanarak karakter tanımayı nasıl geliştirebileceğini açıklayan buldum. Bu okyanusta geçen iyi şanslar :) – DarkCygnus

cevap

7

Belki bir çeşit Active contour model ile? Bir almak mümkün olabilir böylece, aslında parametreleri anlamadan (bazı hızlı verdiği sonra

enter image description here

: https://github.com/pmneila/morphsnakes

son "4" numarasını aldı: Örneğin , ben bu kitaplığı bulundu daha iyi sonuç) bu var: aşağıdaki kodla

enter image description here

(Ben de morphsnakes.py biraz t hacklendi o görüntüleri saklayın):

import morphsnakes 

import numpy as np 
from scipy.misc import imread 
from matplotlib import pyplot as ppl 

def circle_levelset(shape, center, sqradius, scalerow=1.0): 
    """Build a binary function with a circle as the 0.5-levelset.""" 
    grid = np.mgrid[list(map(slice, shape))].T - center 
    phi = sqradius - np.sqrt(np.sum((grid.T)**2, 0)) 
    u = np.float_(phi > 0) 
    return u 

#img = imread("testimages/mama07ORI.bmp")[...,0]/255.0 
img = imread("four.png")[...,0]/255.0 

# g(I) 
gI = morphsnakes.gborders(img, alpha=900, sigma=3.5) 

# Morphological GAC. Initialization of the level-set. 
mgac = morphsnakes.MorphGAC(gI, smoothing=1, threshold=0.29, balloon=-1) 
mgac.levelset = circle_levelset(img.shape, (39, 39), 39) 

# Visual evolution. 
ppl.figure() 
morphsnakes.evolve_visual(mgac, num_iters=50, background=img)