2016-11-05 13 views
11

मैं रसीदों के इस खिलौने उदाहरण से ओसीआर करने की कोशिश कर रहा हूं। पायथन 2.7 और ओपनसीवी 3.1 का उपयोग करना।पायथन + ओपनसीवी: ओसीआर छवि सेगमेंटेशन

enter image description here

ग्रेस्केल + धुंधला + बाहरी एज डिटेक्शन + प्राप्तियों में प्रत्येक क्षेत्र के विभाजन (उदाहरण के लिए "श्रेणी" बाद में देखने के लिए जो एक इस मामले नकदी -इन चिह्नित है)।

मुझे जटिल लगता है जब छवि ठीक से बदलने में सक्षम होने के लिए "skewed" होती है और फिर रसीदों के प्रत्येक सेगमेंट को "स्वचालित रूप से" सेगमेंट करती है।

उदाहरण:

enter image description here

कोई भी सुझाव?

नीचे दिया गया कोड किनारे का पता लगाने तक एक उदाहरण है, लेकिन जब रसीद पहली छवि की तरह है। मेरा मुद्दा टेक्स्ट की छवि नहीं है। छवि की पूर्व प्रसंस्करण है।

किसी भी मदद की सराहना की तुलना में अधिक मदद! :)

import os; 
os.chdir() # Put your own directory 

import cv2 
import numpy as np 

image = cv2.imread("Rent-Receipt.jpg", cv2.IMREAD_GRAYSCALE) 

blurred = cv2.GaussianBlur(image, (5, 5), 0) 

#blurred = cv2.bilateralFilter(gray,9,75,75) 

# apply Canny Edge Detection 
edged = cv2.Canny(blurred, 0, 20) 

#Find external contour 

(_,contours, _) = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

उत्तर

9

पहला कदम पर एक महान ट्यूटोरियल आप वर्णित pyimagesearch पर उपलब्ध है (और वे सामान्य रूप में महान ट्यूटोरियल है)

संक्षेप में, के रूप में एला वर्णन करते हैं, आप cv2.CHAIN_APPROX_SIMPLE का उपयोग करना होगा। एक थोड़ा और अधिक मजबूत विधि cv2.RETR_EXTERNAL के बजाय cv2.RETR_LIST उपयोग करना और फिर क्षेत्रों को सॉर्ट, के रूप में यह शालीनता से/सफेद पृष्ठभूमि में भी काम करना चाहिए पृष्ठ पृष्ठभूमि में एक बड़ा आकार inscribes अगर, आदि

दूसरे के लिए आ रहा होगा आपके प्रश्न का एक हिस्सा, पात्रों को विभाजित करने का एक अच्छा तरीका का उपयोग करना होगा, अधिकतम स्थिर चरम क्षेत्र निकालने वाला ओपनसीवी में उपलब्ध है। सीपीपी में एक पूर्ण कार्यान्वयन एक परियोजना में here उपलब्ध है जो मैं हाल ही में मदद कर रहा था। पायथन कार्यान्वयन (ओपनसीवी 3.0+ के लिए काम करता है नीचे कोड) ओपनसीवी 2 के लिए होगा।एक्स वाक्य रचना है, यह जाँच ऑनलाइन)

import cv2 

img = cv2.imread('test.jpg') 
mser = cv2.MSER_create() 

#Resize the image so that MSER can work better 
img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2)) 

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
vis = img.copy() 

regions = mser.detectRegions(gray) 
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]] 
cv2.polylines(vis, hulls, 1, (0,255,0)) 

cv2.namedWindow('img', 0) 
cv2.imshow('img', vis) 
while(cv2.waitKey()!=ord('q')): 
    continue 
cv2.destroyAllWindows() 

यह अब के रूप में

enter image description here

उत्पादन देता है, झूठे सकारात्मक समाप्त करने के लिए, तो आप बस हल्स में बिंदुओं के माध्यम से चक्र, और गणना कर सकते हैं परिधि (हल्स में सभी आसन्न बिंदुओं के बीच की दूरी [i], जहां हल [i] एक उत्तल में सभी बिंदुओं की एक सूची है)। यदि परिधि बहुत बड़ा है, तो इसे एक चरित्र के रूप में वर्गीकृत करें।

छवि में निदान रेखाएं आ रही हैं क्योंकि छवि की सीमा काला है। कि बस जैसे ही छवि (लाइन 7 से नीचे) पढ़ा जाता है निम्न पंक्ति जोड़कर हटाया जा सकता है

img = img[5:-5,5:-5,:] 

जो उत्पादन

enter image description here

+1

धन्यवाद @ आर। एस निखिल कृष्ण !! अगर मैं रसीद की छवि (स्केव नहीं) के लिए अपना कोड उपयोग करता हूं (प्रश्न में ऊपर देखें)। मुझे अच्छा विभाजन नहीं मिला है। सवाल। मुझे किस पैरामीटर को ट्यून करना चाहिए? उत्तल हलचल? अग्रिम में धन्यवाद! – donpresente

+0

@donpresente मैंने परिवर्तन किए हैं। कारण यह वर्णों का पता नहीं लगा रहा था क्योंकि छवि का आकार बहुत छोटा था। एमएसईआर के पात्रों के बीच महत्वपूर्ण अंतर की आवश्यकता है। यह छवियों का आकार बदलकर –

+1

निखिल कृष्ण का आकार बदल सकता है। मुझे लगता है कि हमारे पास एक विजेता है! :) विभाजन पर कोई अन्य सलाह? क्योंकि "हाथ से बने" मॉडल को प्रत्येक चरित्र को व्यक्तिगत रूप से सही तरीके से विभाजित करने की आवश्यकता हो सकती है? क्या मुझे पाठ पर ग्रिड मजबूर करना चाहिए? – donpresente

4

मेरे सिर के शीर्ष पर विकल्प को तिरछे छवि के 4 कोनों के निष्कर्षों की आवश्यकता होती है। यह समरूपता खोजने के दौरान cv2.CHAIN_APPROX_NONE के बजाय cv2.CHAIN_APPROX_SIMPLE का उपयोग करके किया जाता है। इसके बाद, आप cv2.approxPolyDP का उपयोग कर सकते हैं और उम्मीद है कि रसीद के 4 कोनों के साथ रहें (यदि आपकी सभी छवियां इस तरह हैं तो ऐसा कोई कारण नहीं है कि इसे काम नहीं करना चाहिए)।

अब cv2.findHomography और cv2.wardPerspective का उपयोग स्रोत बिंदुओं के अनुसार छवि को सुधारने के लिए करें, जो कि एक आयताकार छवि बनाने वाले गंतव्य बिंदुओं और गंतव्य बिंदुओं से निकाले गए 4 अंक हैं, उदाहरण के लिए पूर्ण छवि आयाम। OpenCV-Geometric Transformations of Images

इसके अलावा इस जवाब उपयोगी हो सकता है - SO - Detect and fix text skew

संपादित करें:

यहाँ आप कोड नमूने और अधिक जानकारी प्राप्त कर सकता है cv2.CHAIN_APPROX_NONE से पीछे श्रृंखला लगभग सही किया।

+0

धन्यवाद देता! और फिर आप सुधार छवि में पाठ को कैसे विभाजित कर सकते हैं? (यह प्रश्न का हिस्सा है) – donpresente

+1

@donpresente आपने लिखा "मेरी समस्या पाठ की छवि नहीं है। छवि की पूर्व प्रसंस्करण है।" वैसे भी, मैं ओसीआर भाग में ज्यादा योगदान करने में सक्षम नहीं हूं। – Elia

+0

मेरे लिए प्री-प्रोसेसिंग में छवि विभाजन शामिल होगा। मुझे लगता है कि अगर कोई अतिरिक्त जवाब नहीं है तो सिस्टम आपको 50 अंक भेज देगा। प्रश्न, यदि आपके पास समोच्च नहीं है, तो आपका समाधान कैसे काम करता है? – donpresente

संबंधित मुद्दे