मुझे विभिन्न प्रकार के कैप्चा को पहचानने के लिए एक स्कूल प्रोजेक्ट दिया गया था, और मुझे इसके कार्यान्वयन में कुछ कठिनाइयाँ थीं।

इस प्रकार की छवियों को इनपुट में फीड किया जाएगा यहां छवि विवरण दर्ज करें,यहां छवि विवरण दर्ज करें,यहां छवि विवरण दर्ज करें .

मैं उन्हें निम्नलिखित कोड से संभालता हूं:

import cv2 
import pytesseract 

# load image 
fname = 'picture.png' 
im = cv2.imread(fname,cv2.COLOR_RGB2GRAY) 

pytesseract.pytesseract.tesseract_cmd = r'C:\Tesseract-OCR\tesseract.exe'

im = im[0:90, 35:150]

im = cv2.blur(im,(3,3)) 

im = cv2.threshold(im, 223 , 250, cv2.THRESH_BINARY) 
im = im[1] 

cv2.imshow('',im) 
cv2.waitKey(0) 

पूरी प्रक्रिया के बाद, छवि इस तरह दिखती है:यहां छवि विवरण दर्ज करें और इस बिंदु पर, मुझे एक समस्या है, मैं कंप्यूटर द्वारा छवि को अच्छी पठनीयता में कैसे संशोधित कर सकता हूं, ताकि इसके बजाय गलत TAREQ. वह प्रदर्शित करेगा 7TXB6Q

मैं pytesseract लाइब्रेरी के साथ एक छवि से टेक्स्ट प्रदर्शित करने का प्रयास कर रहा हूं:

data = pytesseract.image_to_string(im, lang='eng', config='--psm 6 --oem 3 -c tessedit_char_whitelist= ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
print(data)

मैं मूल्यवान सलाह प्राप्त करने की उम्मीद में यहां लिख रहा हूं (शायद आप किसी चित्र से टेक्स्ट प्राप्त करने या ऊपर पिन की गई छवि को संसाधित करने का सबसे उपयुक्त तरीका जानते हैं)। सभी के लिए शांति)


अधिक छवियां

enter image description here enter image description here enter image description here enter image description here

-1
shalor1k 30 पद 2020, 00:27
1
यदि आप छवि को ग्रेस्केल के रूप में पढ़ना चाहते हैं, तो ध्वज cv.IMREAD_GRAYSCALE होना चाहिए। रंग से शुरू होने वाले झंडे cvtColor फ़ंक्शन के लिए हैं।
 – 
Burak
31 पद 2020, 15:18
1
साथ ही, कृपया स्पष्टता के लिए _, im = cv2.threshold(im, 223, 255, cv2.THRESH_BINARY) का प्रयोग करें। ध्यान दें कि अधिकतम मान 255 है, न कि 250। आप ग्रीन चैनल को अगली पंक्ति में नहीं ले रहे हैं (im = im[1])।
 – 
Burak
31 पद 2020, 15:35
आपके सुधारों के लिए बहुत-बहुत धन्यवाद, लेकिन कृपया अपने उत्तर के नीचे छोड़ी गई टिप्पणियों पर ध्यान दें, क्या आप जानते हैं कि मैं क्या कर सकता हूं?
 – 
shalor1k
31 पद 2020, 15:44
1
हां, जब मैं इस पर काम कर रहा होता हूं तो सुधार आते हैं। कृपया धैर्य रखें।
 – 
Burak
31 पद 2020, 15:45
मैं शायद आपसे पहले ही थक चुका हूं, लेकिन नीचे मैंने प्रश्न में और तस्वीरें जोड़ीं, यह कोड उनके साथ अजीब तरह से काम करता है, आधे अक्षर पूरी तरह से फोटो से हटा दिए जाते हैं, यह क्या हो सकता है?
 – 
shalor1k
1 जिंदा 2021, 18:18

1 उत्तर

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

आप काउंटरों को खोजने और छोटे क्षेत्रों वाले काउंटरों को समाप्त करने का प्रयास कर सकते हैं। इस प्रीप्रोसेसिंग ऑपरेशन को ओसीआर परिणाम की सफलता में वृद्धि करनी चाहिए।

पहले: before

import cv2 as cv
import numpy as np

# your thresholded image im
bw = cv.imread('bw.png', cv.IMREAD_GRAYSCALE)

_, cnts, _ = cv.findContours(bw, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
# remove the largest contour which is background
cnts = np.array(cnts[1:], dtype=object)

areas = np.array(list(map(cv.contourArea, cnts)))

thr = 35
thr_cnts = cnts[areas > thr]

disp_img = 255 * np.ones(bw.shape, dtype=np.uint8)
disp_img = cv.drawContours(disp_img, thr_cnts, -1, (0, 0, 0), cv.FILLED)
disp_img = cv.bitwise_or(disp_img, bw)

cv.imshow('result', disp_img)
cv.waitKey()
cv.destroyAllWindows()

cv.imwrite('result.png', disp_img)

परिणाम: result


संपादित करें: ऐसा लगता है कि दो कोडों को मिलाने से समान परिणाम नहीं मिला। यह शुरू से अंत तक का पूरा कोड है।

इनपुट: CAPTCHA

import cv2 as cv
import numpy as np

# load image 
fname = 'im.png'
im = cv.imread(fname, cv.IMREAD_GRAYSCALE)

# crop
im = im[0:90, 35:150]

# blurring is essential for denoising
im = cv.blur(im, (3,3))

thr = 219
# the binary threshold value is very important
# using 220 instead of 219 causes loss of a letter
# because it touches to the bottom edge and gets involved in the background
_, im = cv.threshold(im, thr, 255, cv.THRESH_BINARY)

cv.imshow('', im)
cv.waitKey(0)

दहलीज: threshold

# binary image
bw = np.copy(im)

# find contours and corresponding areas
_, cnts, _ = cv.findContours(bw, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
cnts = np.array(cnts, dtype=object)
areas = np.array(list(map(cv.contourArea, cnts)))

thr = 35
# eliminate contours that are smaller than threshold
# also remove the largest contour which is background
thr_cnts = cnts[np.logical_and(areas > thr, areas != np.max(areas))]

# draw the remaining contours
disp_img = 255 * np.ones(bw.shape, dtype=np.uint8)
disp_img = cv.drawContours(disp_img, thr_cnts, -1, (0, 0, 0), cv.FILLED)
disp_img = cv.bitwise_or(disp_img, bw)

cv.imshow('', disp_img)
cv.waitKey()
cv.destroyAllWindows()

परिणाम: result

1
Burak 31 पद 2020, 15:59
आपके उत्तर के लिए बहुत-बहुत धन्यवाद, हो सकता है कि आप अभी भी pytesseract - image_to_string के अलावा पाठ को पहचानने के अधिक कार्यशील तरीकों के बारे में सलाह दे सकें।
 – 
shalor1k
31 पद 2020, 01:22
1
क्षमा करें, उस क्षेत्र में कोई अनुभव नहीं है।
 – 
Burak
31 पद 2020, 10:09
1
आप जानते हैं कि आपके पास छह अक्षर हैं, इसलिए आप छवि को छह छोटे भागों में विभाजित करके अक्षरों को पहचानने का प्रयास कर सकते हैं। आप loadOCRHMMClassifier फ़ंक्शन पर एक नज़र डाल सकते हैं इसके लिए, लेकिन Tesseract ज्यादातर मामलों में इसे करने का विश्वसनीय तरीका प्रतीत होता है।
 – 
Burak
31 पद 2020, 10:32
हां, वर्णों की संख्या हमेशा छह होती है, लेकिन मेरे पास 350+ ऐसे चित्र हैं और अक्षर हमेशा एक-दो पिक्सेल चलते हैं, इसलिए मुझे इस पद्धति की तर्कसंगतता पर संदेह है
 – 
shalor1k
31 पद 2020, 11:48
1
मुझे लगता है कि ऐसा इसलिए है क्योंकि आपके कोड का परिणाम और आपके द्वारा प्रश्न में डाली गई थ्रेसहोल्ड छवि समान नहीं है। हालांकि यकीन नहीं है। पूर्ण कोड के लिए संपादित किया गया। अक्षरों को विभाजित करने के लिए, आप फिर से आकृति का उपयोग कर सकते हैं। परिणाम में प्रत्येक समोच्च पृष्ठभूमि को छोड़कर एक अक्षर है। बाकी सब आपके ऊपर है।
 – 
Burak
31 पद 2020, 16:05