2017-07-10 11 views
15

मेरे पास कुछ हजारों पीडीएफ फाइलें हैं जिनमें बी & डब्ल्यू छवियों (1 बिट) डिजिटलकृत पेपर फॉर्म से हैं। मैं कुछ क्षेत्रों ओसीआर करने के लिए कोशिश कर रहा हूँ, लेकिन कुछ समय लेखन भी बेहोश है:खराब स्कैन किए गए हस्तलिखित अंकों को प्रीप्रोकैसिंग

enter image description here

मैं सिर्फ रूपात्मक रूपांतरण के बारे में सीखा है। वे वास्तव में शांत हैं !!! मुझे लगता है कि मैं उनका दुरुपयोग कर रहा हूं (जैसे मैंने नियमित अभिव्यक्तियों के साथ किया था जब मैंने पर्ल सीखा था)।

मैं केवल तारीख में दिलचस्पी रखता हूँ, 2017/07/06:

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

इस फार्म भरने लोगों के लिए कुछ उपेक्षा करने के लिए लगता है ग्रिड, तो मैंने इसे से छुटकारा पाने की कोशिश की। मैं इस के साथ क्षैतिज रेखा को अलग करने को बदलने में सक्षम हूं:

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

enter image description here

मैं भी खड़ी लाइनों प्राप्त कर सकते हैं:

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

अब मैं प्राप्त कर सकते हैं ग्रिड से छुटकारा:

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

enter image description here

सबसे अच्छा मुझे मिल गया यह था, लेकिन 4 अभी भी 2 भागों में विभाजित है: शायद इस बिंदु यह cv2.findContours और कुछ अनुमानी उपयोग करने के लिए बेहतर है पर

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

enter image description here

प्रत्येक अंक का पता लगाने के लिए, लेकिन मैं सोच रहा था:

  1. मुझे देना चाहिए ग्रेस्केल में सभी दस्तावेजों को रद्द करने की मांग करें और मांग करें?
  2. बेहोश अंकों को अलग करने और ढूंढने के लिए बेहतर तरीके हैं?
  3. क्या आप "4" जैसे मामलों में शामिल होने के लिए कोई मोर्फोलॉजिकल ट्रांसफॉर्म जानते हैं?

[अद्यतन]

दस्तावेज भी rescanning की मांग कर रहा है? यदि यह कोई बड़ा मुसीबत है मेरा मानना ​​है कि यह प्रशिक्षण की तुलना में अधिक गुणवत्ता आदानों प्राप्त करने के लिए बेहतर है और अपने मॉडल को परिष्कृत करने के शोर और असामान्य डेटा

संदर्भ के बारे में थोड़ी सामना करने के लिए कोशिश कर रहा है: मैं एक कोई भी नहीं पर काम कर रहा हूँ ब्राजील में एक सार्वजनिक एजेंसी। आईसीआर समाधान के लिए कीमत 6 अंकों में शुरू होती है, इसलिए कोई भी मानता है कि एक भी व्यक्ति घर में आईसीआर समाधान लिख सकता है।मैं विश्वास करने के लिए पर्याप्त मूर्ख हूं कि मैं उन्हें गलत साबित कर सकता हूं। वे पीडीएफ दस्तावेज़ एक एफ़टीपी सर्वर (लगभग 100 के फाइल) पर बैठे थे और मृत पेड़ संस्करण से छुटकारा पाने के लिए स्कैन किए गए थे। शायद मैं मूल रूप प्राप्त कर सकता हूं और खुद को फिर से स्कैन कर सकता हूं लेकिन मुझे कुछ आधिकारिक समर्थन मांगना होगा - क्योंकि यह सार्वजनिक क्षेत्र है क्योंकि मैं इस परियोजना को जितना संभव हो उतना भूमिगत रखना चाहता हूं। मेरे पास अब 50% की त्रुटि दर है, लेकिन यदि यह दृष्टिकोण एक मृत अंत है तो इसमें सुधार करने की कोई बात नहीं है।

+1

दस्तावेजों को भी मांगना बाकी है? अगर यह कोई बड़ी परेशानी नहीं है तो मेरा मानना ​​है कि प्रशिक्षण से उच्च गुणवत्ता वाले इनपुट प्राप्त करना बेहतर है और शोर और अटैचिकल डेटा – DarkCygnus

+0

@GrayCygnus का सामना करने के लिए अपने मॉडल को परिष्कृत करने का प्रयास करना बेहतर है: मुझे नौकरशाही और जड़ता के महासागर को पार करना होगा, लेकिन यह संभव है । मुझे शायद मैन्युअल रूप से सभी मैन्युअल काम करना होगा। –

+0

मई मैं यह भी सुझाव देता हूं कि आप इस [ट्यूटोरियल] पर एक नज़र डालें (http://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/) (उसी स्रोत से जो मैंने लिंक किया है आपके पिछले प्रश्न के उत्तर पर), जहां वे ओसीआर करने के लिए एक महान उपकरण के रूप में टेसेरैक्ट (गूगल्स ओसीआर इंजन का एक रैपर) पेश करते हैं। इसके अलावा, मुझे [यह पेपर] मिला है (http://worldcomp-proceedings.com/proc/p2016/ICA3674.pdf) जो बताता है कि यू -क्लिडियन दूरी मीट्रिक के साथ के-निकटतम पड़ोसियों का उपयोग करके चरित्र पहचान में सुधार कैसे किया जाए। शुभकामनाएँ कि महासागर की ओर बढ़ रहा है :) – DarkCygnus

उत्तर

7

शायद किसी प्रकार के Active contour model के साथ? https://github.com/pmneila/morphsnakes

अपने अंतिम "4" नंबर लिया: उदाहरण के लिए, मैं इस पुस्तकालय पाया

enter image description here

कुछ त्वरित फेरबदल के बाद (वास्तव में मानकों को समझे बिना, इसलिए यह एक पाने के लिए संभव हो सकता है बेहतर परिणाम) मैं यह मिल गया:

enter image description here

निम्न कोड के साथ

(मैं भी morphsnakes.py एक छोटे से टी काट दिया o छवियों को सहेजें):

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) 
संबंधित मुद्दे