मैं एक छवि से पाठ निकालने के लिए देख रहा हूं, मुझे जो आउटपुट मिल रहा है वह बहुत सटीक नहीं है। मुझे आश्चर्य है कि इस ओसीआर की सटीकता को बढ़ाने के लिए छवि को और अधिक संसाधित करने के लिए मैं कोई अतिरिक्त कदम उठा सकता हूं।

मैंने छवि को संसाधित करने और ओसीआर परिणामों में सुधार करने के कुछ अलग-अलग तरीकों पर ध्यान दिया है। छवि काफी छोटी है और मैं इसे थोड़ा ऊपर उड़ाने में सक्षम हूं, लेकिन कोई फायदा नहीं हुआ।

छवि हमेशा क्षैतिज रहेगी, संख्याओं के अलावा कोई अन्य पाठ मौजूद नहीं होगा। अधिकतम संख्या 55000 तक जाएगी।

विचाराधीन छवि का एक उदाहरण:

छवि प्रसंस्करण के बाद, मेरी छवि को एक्स और वाई अक्ष पर 4 तक बढ़ाया जाता है। और कुछ संतृप्ति हटा दी जाती है, हालांकि इससे सटीकता में बिल्कुल भी सुधार नहीं होता है।

image = self._process(scale=6, iterations=2)
text = pytesseract.image_to_string(image, config="--psm 7")

मेरी प्रक्रिया विधि निम्नलिखित कर रही है:

# Resize and desaturate.
image = cv2.resize(image, None, fx=scale, fy=scale, 
interpolation=cv2.INTER_CUBIC)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply dilation and erosion.
kernel = np.ones((1, 1), np.uint8)
image = cv2.dilate(image, kernel, iterations=iterations)
image = cv2.erode(image, kernel, iterations=iterations)

return image

अपेक्षित: "10411"

वास्तविक मान भिन्न होता है, आमतौर पर एक अपरिचित स्ट्रिंग, या कुछ संख्याओं को पार्स किया जाता है लेकिन सटीकता दर प्रयोग करने योग्य होने के लिए बहुत कम है।

4
Brett C 5 फरवरी 2019, 20:34

1 उत्तर

सबसे बढ़िया उत्तर

मेरे पास ओसीआर के साथ अनुभव नहीं है, लेकिन मुझे लगता है कि आप सही रास्ते पर हैं: छवि का आकार बढ़ाना ताकि एल्गोरिदम में काम करने के लिए और संख्याओं और पृष्ठभूमि के बीच अंतर को बढ़ाने के लिए और अधिक पिक्सेल हों।

मेरे द्वारा जोड़ी गई ट्रिक्स: थ्रेसहोल्डिंग छवि, जो एक मुखौटा बनाता है जहां केवल सफेद पिक्सेल रहते हैं। कुछ सफेद बूँदें थीं जो संख्याएँ नहीं थीं, इसलिए मैंने findContours

नतीजा:

enter image description here

कोड:

import numpy as np 
import cv2
# load image
image = cv2.imread('number.png')
# resize image
image = cv2.resize(image,None,fx=5, fy=5, interpolation = cv2.INTER_CUBIC)
# create grayscale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# perform threshold
retr, mask = cv2.threshold(gray_image, 230, 255, cv2.THRESH_BINARY)
# find contours
ret, contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# draw black over the contours smaller than 200 - remove unwanted blobs
for cnt in contours:
    # print contoursize to detemine threshold
    print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt) < 200:
         cv2.drawContours(mask, [cnt], 0, (0), -1)

#show image
cv2.imshow("Result", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()
3
J.D. 6 फरवरी 2019, 00:10