छवि प्रसंस्करण Tesseract OCR सटीकता में सुधार करने के लिए


145

मैं डॉक्युमेंट्स को टेक्स्ट में बदलने के लिए टेसरेक्ट का उपयोग कर रहा हूं। दस्तावेजों की गुणवत्ता में बेतहाशा वृद्धि होती है, और मैं इस बात पर सुझाव दे रहा हूं कि किस प्रकार की छवि प्रसंस्करण के परिणाम बेहतर हो सकते हैं। मैंने देखा है कि वह पाठ जो अत्यधिक पिक्सेलेटेड है - उदाहरण के लिए जो फैक्स मशीनों द्वारा उत्पन्न होता है - विशेष रूप से टेसेरैक्ट के लिए प्रक्रिया करना मुश्किल है - संभवतः उन सभी दांतेदार किनारों को अक्षर-आकृति एल्गोरिदम को भ्रमित करते हैं।

किस प्रकार की छवि प्रसंस्करण तकनीक सटीकता में सुधार करेगी? मैं पिक्सलेटेड चित्रों को बाहर निकालने के लिए गॉसियन कलंक का उपयोग कर रहा हूं और कुछ छोटे सुधार देखे हैं, लेकिन मैं उम्मीद कर रहा हूं कि एक अधिक विशिष्ट तकनीक है जो बेहतर परिणाम देगी। एक ऐसा फ़िल्टर कहें, जो काले और सफेद चित्रों के लिए तैयार किया गया हो, जो अनियमित किनारों को चिकना कर देगा, इसके बाद एक फ़िल्टर होगा जो वर्णों को अधिक विशिष्ट बनाने के लिए इसके विपरीत को बढ़ाएगा।

किसी के लिए कोई सामान्य सुझाव जो छवि प्रसंस्करण में एक नौसिखिया है?

जवाबों:


103
  1. तय DPI (यदि आवश्यक हो) 300 DPI न्यूनतम है
  2. पाठ का आकार ठीक करें (जैसे 12 pt ठीक होना चाहिए)
  3. पाठ लाइनों को ठीक करने का प्रयास करें (डेस्क और डावरप टेक्स्ट)
  4. छवि की रोशनी को ठीक करने की कोशिश करें (जैसे छवि का कोई अंधेरा हिस्सा नहीं)
  5. द्वैरीकरण और डी-शोर छवि

कोई सार्वभौमिक कमांड लाइन नहीं है जो सभी मामलों में फिट होगी (कभी-कभी आपको छवि को धुंधला और तेज करने की आवश्यकता होती है)। लेकिन आप फ्रेड की इमेजमैजिक स्क्रिप्ट्स से TEXTCLEANER को आजमा सकते हैं ।

यदि आप कमांड लाइन के प्रशंसक नहीं हैं, तो हो सकता है कि आप ओपनसोर्स scantailor.sourceforge.net या कमर्शियल बुकराइज़र का उपयोग करने का प्रयास कर सकते हैं ।


6
और ऐसा करने के बारे में सचित्र मार्गदर्शिका है: code.google.com/p/tesseract-ocr/wiki/ImproveQuality
iljau

2
ध्यान दें, लिंक की गई लिपि केवल-मात्र प्रतीत होती है।
ज़ोरान पावलोविच

1
यह सच नहीं है - यह एक बैश स्क्रिप्ट है। अगर आपने bash और ImageMagick लगाया है तो यह विंडोज़ पर भी चलेगा। बैश अन्य उपयोगी सॉफ्टवेयर के भाग के रूप में स्थापित किया जा सकता है जैसे git या msys2 ...
user898678

6
@iljau जब से जीतूब में चले गए। विकी पेज यहाँ है: github.com/tesseract-ocr/tesseract/wiki/ImproveQuality
hometoast

2
Tesseract डॉक्स फिर से चले गए, tesseract-ocr.github.io/tessdoc/ImproveQuality
कोई नहीं

73

मैं किसी भी तरह से एक ओसीआर विशेषज्ञ नहीं हूं। लेकिन मुझे इस सप्ताह एक jpg से पाठ को बदलने की आवश्यकता थी।

मैंने एक रंगीन, RGB 445x747 पिक्सेल jpg के साथ शुरुआत की। मैंने तुरंत इस पर टेसरैक्ट की कोशिश की, और कार्यक्रम ने लगभग कुछ भी नहीं बदला। मैंने तब GIMP में जाकर निम्न कार्य किया। छवि> मोड> स्केल इमेज> स्केल इमेज> 1191x2000 पिक्सल फिल्टर> एनहांसप मास्क को त्रिज्या के मान = 6.8, राशि = 2.69, थ्रेशोल्ड = 0 के साथ बढ़ाएँ = 0 फिर मैंने 100% गुणवत्ता पर नए jpg के रूप में सहेजा।

Tesseract तब एक .txt फ़ाइल में सभी पाठ निकालने में सक्षम था

जिम्प आपका दोस्त है।


11
+1 मैंने आपके चरणों का पालन किया और मुझे बहुत सुधार मिला। धन्यवाद
onof

1
मुझे यह भी आभास होता है कि यदि आप TIFF फ़ाइल में इनपुट परिवर्तित करते हैं और Tesseract को TIFF देते हैं (बजाय आपके लिए रूपांतरण करने के लिए Tesseract पूछने के बजाय) तो Tesseract बेहतर काम करता है। ImageMagick आपके लिए रूपांतरण कर सकता है। यह मेरी वास्तविक धारणा है, लेकिन मैंने इसे ध्यान से नहीं देखा है, इसलिए यह गलत हो सकता है।
डीडब्ल्यू

+1 "अनसेफ मास्क" फ़िल्टर ने वास्तव में मेरा दिन बना दिया। एक और कदम जिसने मुझे मदद की: "फ़ज़ी सिलेक्शन" टूल का उपयोग करके पृष्ठभूमि का चयन करें फिर डेल को इसे बाहर निकालने के लिए दबाएं
डेविड

मैं tesseract मान्यता stackoverflow.com/questions/32473095/… से पहले इस छवि प्रसंस्करण के मुद्दे पर फंस गया हूँ क्या आप मुझे यहाँ मदद कर सकते हैं?
हुसैन

नहीं। मैं इसे बड़ा आकार बनाने की कोशिश की, और इसे greyscale में सेट किया लगता है कि कुछ भी मुझे सकारात्मक परिणाम नहीं देता है। आह :( इस लक्ष्य की जाँच करें: freesms4us.com/…
gumuruh

30

छवि की पठनीयता में सुधार के लिए तीन बिंदु: 1) चर ऊंचाई और चौड़ाई के साथ छवि का आकार बदलें (छवि 0.5 और चौड़ाई के साथ 0.5 और 1 और 2 गुणा करें)। 2) छवि को ग्रे स्केल प्रारूप में परिवर्तित करें (ब्लैक एंड व्हाइट)। 3) शोर पिक्सल निकालें और अधिक स्पष्ट करें (छवि को फ़िल्टर करें)।

कोड के नीचे देखें:

//Resize
  public Bitmap Resize(Bitmap bmp, int newWidth, int newHeight)
        {

                Bitmap temp = (Bitmap)bmp;

                Bitmap bmap = new Bitmap(newWidth, newHeight, temp.PixelFormat);

                double nWidthFactor = (double)temp.Width / (double)newWidth;
                double nHeightFactor = (double)temp.Height / (double)newHeight;

                double fx, fy, nx, ny;
                int cx, cy, fr_x, fr_y;
                Color color1 = new Color();
                Color color2 = new Color();
                Color color3 = new Color();
                Color color4 = new Color();
                byte nRed, nGreen, nBlue;

                byte bp1, bp2;

                for (int x = 0; x < bmap.Width; ++x)
                {
                    for (int y = 0; y < bmap.Height; ++y)
                    {

                        fr_x = (int)Math.Floor(x * nWidthFactor);
                        fr_y = (int)Math.Floor(y * nHeightFactor);
                        cx = fr_x + 1;
                        if (cx >= temp.Width) cx = fr_x;
                        cy = fr_y + 1;
                        if (cy >= temp.Height) cy = fr_y;
                        fx = x * nWidthFactor - fr_x;
                        fy = y * nHeightFactor - fr_y;
                        nx = 1.0 - fx;
                        ny = 1.0 - fy;

                        color1 = temp.GetPixel(fr_x, fr_y);
                        color2 = temp.GetPixel(cx, fr_y);
                        color3 = temp.GetPixel(fr_x, cy);
                        color4 = temp.GetPixel(cx, cy);

                        // Blue
                        bp1 = (byte)(nx * color1.B + fx * color2.B);

                        bp2 = (byte)(nx * color3.B + fx * color4.B);

                        nBlue = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

                        // Green
                        bp1 = (byte)(nx * color1.G + fx * color2.G);

                        bp2 = (byte)(nx * color3.G + fx * color4.G);

                        nGreen = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

                        // Red
                        bp1 = (byte)(nx * color1.R + fx * color2.R);

                        bp2 = (byte)(nx * color3.R + fx * color4.R);

                        nRed = (byte)(ny * (double)(bp1) + fy * (double)(bp2));

                        bmap.SetPixel(x, y, System.Drawing.Color.FromArgb
                (255, nRed, nGreen, nBlue));
                    }
                }



                bmap = SetGrayscale(bmap);
                bmap = RemoveNoise(bmap);

                return bmap;

        }


//SetGrayscale
  public Bitmap SetGrayscale(Bitmap img)
        {

            Bitmap temp = (Bitmap)img;
            Bitmap bmap = (Bitmap)temp.Clone();
            Color c;
            for (int i = 0; i < bmap.Width; i++)
            {
                for (int j = 0; j < bmap.Height; j++)
                {
                    c = bmap.GetPixel(i, j);
                    byte gray = (byte)(.299 * c.R + .587 * c.G + .114 * c.B);

                    bmap.SetPixel(i, j, Color.FromArgb(gray, gray, gray));
                }
            }
            return (Bitmap)bmap.Clone();

        }
//RemoveNoise
   public Bitmap RemoveNoise(Bitmap bmap)
        {

            for (var x = 0; x < bmap.Width; x++)
            {
                for (var y = 0; y < bmap.Height; y++)
                {
                    var pixel = bmap.GetPixel(x, y);
                    if (pixel.R < 162 && pixel.G < 162 && pixel.B < 162)
                        bmap.SetPixel(x, y, Color.Black);
                    else if (pixel.R > 162 && pixel.G > 162 && pixel.B > 162)
                        bmap.SetPixel(x, y, Color.White);
                }
            }

            return bmap;
        }

INPUT छवि
INPUT छवि

बाहर छवि बाहर छवि


हाँ.हम आकार विधि करने के लिए आवश्यक पैरामीटर पारित करने के लिए है, यह तो आकार, SetGrayscale और RemoveNoise आपरेशन preocess होगा बेहतर पठनीयता के साथ उत्पादन छवि वापस आ।
सत्यराज पलानीसामी athy

फ़ाइलों के एक सेट पर इस दृष्टिकोण की कोशिश की और प्रारंभिक परिणाम के साथ तुलना की। कुछ सीमित मामलों में यह बेहतर परिणाम देता है, ज्यादातर आउटपुट टेक्स्ट की गुणवत्ता में थोड़ी कमी थी। तो, यह एक सार्वभौमिक समाधान की तरह नहीं दिखता है।
Bryn

यह वास्तव में मेरे लिए बहुत अच्छा काम किया। निश्चित रूप से यह इमेज प्री-प्रोसेसिंग के लिए एक शुरुआती बिंदु देता है जो टिबरेक्ट से वापस मिलने वाली गिबरिश की मात्रा को हटा देता है।
Ses

22

अंगूठे के एक नियम के रूप में, मैं आमतौर पर OpenCV लाइब्रेरी का उपयोग करके निम्नलिखित छवि पूर्व-प्रसंस्करण तकनीकों को लागू करता हूं:

  1. छवि को बदलना (यदि आप उन छवियों के साथ काम कर रहे हैं जिनकी 300 डीपीआई से कम डीपीआई है):

    img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
    
  2. छवि को ग्रेस्केल में बदलना:

    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
  3. शोर को हटाने के लिए फैलाव और कटाव को लागू करना (आप अपने डेटा सेट के आधार पर कर्नेल आकार के साथ खेल सकते हैं):

    kernel = np.ones((1, 1), np.uint8)
    img = cv2.dilate(img, kernel, iterations=1)
    img = cv2.erode(img, kernel, iterations=1)
    
  4. धुंधला लागू करना, जो निम्नलिखित पंक्तियों में से एक का उपयोग करके किया जा सकता है (जिनमें से प्रत्येक के पास इसके पेशेवरों और विपक्ष हैं, हालांकि, मध्ययुगीन कलंक और द्विपक्षीय फिल्टर आमतौर पर गाऊसी धब्बा की तुलना में बेहतर प्रदर्शन करते हैं।)

    cv2.threshold(cv2.GaussianBlur(img, (5, 5), 0), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    cv2.threshold(cv2.bilateralFilter(img, 5, 75, 75), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    cv2.threshold(cv2.medianBlur(img, 3), 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    
    cv2.adaptiveThreshold(cv2.GaussianBlur(img, (5, 5), 0), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
    
    cv2.adaptiveThreshold(cv2.bilateralFilter(img, 9, 75, 75), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
    
    cv2.adaptiveThreshold(cv2.medianBlur(img, 3), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)
    

मैं हाल ही में Tesseract करने के लिए एक बहुत सरल गाइड लिखा है लेकिन यह आपकी पहली ओसीआर स्क्रिप्ट लिखने और कुछ बाधाओं है कि मैं अनुभव है जब चीजें कम स्पष्ट की तुलना में मैं दस्तावेज में इसे पसंद किया है | थे स्पष्ट करने के लिए आप सक्षम होना चाहिए।

यदि आप उन्हें जाँचना चाहते हैं, तो यहाँ मैं आपके साथ लिंक साझा कर रहा हूँ:


हम छवि को ग्रे-स्केल में क्यों बदलते हैं? अधिक विशिष्ट होने के लिए, मैंने छवि पहचान प्रक्रिया में देखा है, छवि को पहले ग्रे स्केल में परिवर्तित किया गया, फिर sobel-> MSER -> SWT। क्या आप इसे विस्तृत कर सकते हैं? मैं आईपी क्षेत्र में नया हूं।
वनपंचमन

मेरी समझ के अनुसार, यह एल्गोरिथ्म पर निर्भर करता है, कुछ को बिल्कुल बदलने की आवश्यकता नहीं हो सकती है। पिक्सेल को कुछ रंग मानों के रूप में डिजिटल रूप से संग्रहीत करें, आरजीबी, लाल, हरे और नीले रंग के मामले में सोचें। जब एक पिक्सेल को बी / डब्ल्यू पैमाने पर परिवर्तित किया जाता है, तो आपके एल्गोरिथ्म को 3 के बजाय केवल 2 आयामों पर काम करने की आवश्यकता होती है। यह आपके एल्गोरिदम को एक-एक करके पिक्सेल पर चलाते समय गति में स्पष्ट लाभ के साथ आता है। इसके अलावा, कुछ लोग यह भी कह सकते हैं कि शोर को निकालना आसान है और किसी चित्र पर किनारों का पता लगाना जब इसे ग्रेस्केल में बदला जाता है।
बांकुगुगोग्लू

जवाब देने के लिए धन्यवाद। और अपने ब्लॉग के बारे में, क्या आप गैर-रोमन लिपि के लिए SCRATCH USING TESSERACT से HOW TO BUILD OCR FCR SCRATCH USING TESSERACT पर लिख सकते हैं। मुझे हर जगह खोज है, जो सब उपलब्ध है वह स्पष्ट नहीं है।
वनपंचमैन

16

यह कुछ समय पहले है, लेकिन यह अभी भी उपयोगी हो सकता है।

मेरा अनुभव बताता है कि छवि को मेमोरी में बदलने से पहले इसे कभी-कभी टेसरेक्ट करने में मदद मिलती है।

प्रक्षेप के विभिन्न तरीकों की कोशिश करो। The post https://stackoverflow.com/a/4756906/146003 ने मेरी बहुत मदद की।


15

इस तरह से मेरे लिए बेहद मददगार थी जो कैप्चर 2 टेक्स्ट प्रोजेक्ट के लिए सोर्स कोड हैं। http://sourceforge.net/projects/capture2text/files/Capture2Text/

BTW: Kudos यह लेखक के लिए इस तरह के एक श्रमसाध्य एल्गोरिथ्म साझा करने के लिए है।

कैप्चर 2Text \ SourceCode \ leptonica_util \ leptonica_util.c फ़ाइल पर विशेष ध्यान दें - यह इस उपयोगिता के लिए छवि पूर्वप्रकरण का सार है।

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

PS वर्णित समाधान प्रीप्रोसेसिंग के लिए OCR और Leptonica के लिए Tesseract का उपयोग करता है।


1
Capture2Text टूल के लिए धन्यवाद। यह पूरी तरह से मेरी परियोजना में सभी ओसीआर मुद्दों को हल करता है!
Lê Quang Duy

12

सत्यराज के ऊपर दिए गए कोड के लिए जावा संस्करण:

// Resize
public Bitmap resize(Bitmap img, int newWidth, int newHeight) {
    Bitmap bmap = img.copy(img.getConfig(), true);

    double nWidthFactor = (double) img.getWidth() / (double) newWidth;
    double nHeightFactor = (double) img.getHeight() / (double) newHeight;

    double fx, fy, nx, ny;
    int cx, cy, fr_x, fr_y;
    int color1;
    int color2;
    int color3;
    int color4;
    byte nRed, nGreen, nBlue;

    byte bp1, bp2;

    for (int x = 0; x < bmap.getWidth(); ++x) {
        for (int y = 0; y < bmap.getHeight(); ++y) {

            fr_x = (int) Math.floor(x * nWidthFactor);
            fr_y = (int) Math.floor(y * nHeightFactor);
            cx = fr_x + 1;
            if (cx >= img.getWidth())
                cx = fr_x;
            cy = fr_y + 1;
            if (cy >= img.getHeight())
                cy = fr_y;
            fx = x * nWidthFactor - fr_x;
            fy = y * nHeightFactor - fr_y;
            nx = 1.0 - fx;
            ny = 1.0 - fy;

            color1 = img.getPixel(fr_x, fr_y);
            color2 = img.getPixel(cx, fr_y);
            color3 = img.getPixel(fr_x, cy);
            color4 = img.getPixel(cx, cy);

            // Blue
            bp1 = (byte) (nx * Color.blue(color1) + fx * Color.blue(color2));
            bp2 = (byte) (nx * Color.blue(color3) + fx * Color.blue(color4));
            nBlue = (byte) (ny * (double) (bp1) + fy * (double) (bp2));

            // Green
            bp1 = (byte) (nx * Color.green(color1) + fx * Color.green(color2));
            bp2 = (byte) (nx * Color.green(color3) + fx * Color.green(color4));
            nGreen = (byte) (ny * (double) (bp1) + fy * (double) (bp2));

            // Red
            bp1 = (byte) (nx * Color.red(color1) + fx * Color.red(color2));
            bp2 = (byte) (nx * Color.red(color3) + fx * Color.red(color4));
            nRed = (byte) (ny * (double) (bp1) + fy * (double) (bp2));

            bmap.setPixel(x, y, Color.argb(255, nRed, nGreen, nBlue));
        }
    }

    bmap = setGrayscale(bmap);
    bmap = removeNoise(bmap);

    return bmap;
}

// SetGrayscale
private Bitmap setGrayscale(Bitmap img) {
    Bitmap bmap = img.copy(img.getConfig(), true);
    int c;
    for (int i = 0; i < bmap.getWidth(); i++) {
        for (int j = 0; j < bmap.getHeight(); j++) {
            c = bmap.getPixel(i, j);
            byte gray = (byte) (.299 * Color.red(c) + .587 * Color.green(c)
                    + .114 * Color.blue(c));

            bmap.setPixel(i, j, Color.argb(255, gray, gray, gray));
        }
    }
    return bmap;
}

// RemoveNoise
private Bitmap removeNoise(Bitmap bmap) {
    for (int x = 0; x < bmap.getWidth(); x++) {
        for (int y = 0; y < bmap.getHeight(); y++) {
            int pixel = bmap.getPixel(x, y);
            if (Color.red(pixel) < 162 && Color.green(pixel) < 162 && Color.blue(pixel) < 162) {
                bmap.setPixel(x, y, Color.BLACK);
            }
        }
    }
    for (int x = 0; x < bmap.getWidth(); x++) {
        for (int y = 0; y < bmap.getHeight(); y++) {
            int pixel = bmap.getPixel(x, y);
            if (Color.red(pixel) > 162 && Color.green(pixel) > 162 && Color.blue(pixel) > 162) {
                bmap.setPixel(x, y, Color.WHITE);
            }
        }
    }
    return bmap;
}

बिटमैप के लिए आपकी कक्षा क्या है? बिटमैप जावा में नहीं मिला है (यह एंड्रॉइड में मूल रूप से है)।
हम

यह विधि एक अपवाद के माध्यम से होती है: इसके कारण: java.lang.IllegalArgumentException: y का होना आवश्यक है <bitmap.height ()
Nativ

9

Tesseract प्रलेखन में OCR गुणवत्ता को बेहतर बनाने के बारे में कुछ अच्छे विवरण हैं छवि प्रसंस्करण चरणों के माध्यम से ।

कुछ हद तक, Tesseract स्वचालित रूप से उन्हें लागू करता है। निरीक्षण के लिए एक मध्यवर्ती छवि लिखने के लिए टेसरैक्ट को बताना संभव है, अर्थात आंतरिक छवि प्रसंस्करण कार्यों ( tessedit_write_imagesउपरोक्त संदर्भ में खोज ) कितनी अच्छी तरह से जांचती है ।

अधिक महत्वपूर्ण बात, टेसरैक्ट 4 में नया तंत्रिका नेटवर्क सिस्टम सामान्य रूप से और विशेष रूप से कुछ शोर के साथ छवियों के लिए - ओसीआर परिणाम बहुत बेहतर देता है। इसे --oem 1निम्न के साथ सक्षम किया जाता है , जैसे:

$ tesseract --oem 1 -l deu page.png result pdf

(यह उदाहरण जर्मन भाषा का चयन करता है)

इस प्रकार, कुछ कस्टम प्री-प्रोसेसिंग इमेज इमेज स्टेप्स को लागू करने से पहले आपको नए टेसरैक्ट LSTM मोड के साथ कितनी दूर तक परीक्षण करना है, यह समझ में आता है।


6

यदि छवि में प्रकाश असमान है तो अनुकूली थ्रेसहोल्डिंग महत्वपूर्ण है। इस पोस्ट में ग्राफिक्समैजिक का उपयोग करते हुए मेरी प्रीप्रोसेसिंग का उल्लेख किया गया है: https://groups.google.com/forum/# .topic/tesseract-ocr/jongSChLRv4

ग्राफिक्समैजिक में लीनियर टाइम अडैप्टिव थ्रेशोल्ड के लिए -lat फीचर भी है जिसे मैं जल्द ही आजमाऊंगा।

OpenCV का उपयोग करके थ्रेसहोल्ड करने का एक और तरीका यहां वर्णित है: http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html


2
OpenCV लिंक को बदल दिया गया है। OpenCV प्रलेखन में यह
OpenCV-

2

मैंने ऐसा एक छवि से अच्छे परिणाम प्राप्त करने के लिए किया है जिसमें बहुत छोटा पाठ नहीं है।

  1. मूल छवि पर धुंधला लागू करें।
  2. अनुकूली थ्रेसहोल्ड लागू करें।
  3. तीव्र प्रभाव लागू करें।

और अगर अभी भी अच्छे परिणाम नहीं मिल रहे हैं, तो छवि को 150% या 200% पर स्केल करें।


2

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

1) पृष्ठभूमि क्षेत्र में खराब छवि गुणवत्ता / अवांछित तत्वों / बूँदें के कारण शोर की उपस्थिति। इसके लिए कुछ पूर्व-प्रसंस्करण कार्यों की आवश्यकता होती है जैसे कि शोर निकालना जो आसानी से गाऊसी फ़िल्टर या सामान्य माध्य फ़िल्टर विधियों का उपयोग करके किया जा सकता है। ये भी OpenCV में उपलब्ध हैं।

2) छवि का गलत अभिविन्यास: गलत अभिविन्यास के कारण ओसीआर इंजन छवि में लाइनों और शब्दों को सही ढंग से खंडित करने में विफल रहता है जो सबसे खराब सटीकता देता है।

3) लाइनों की उपस्थिति: शब्द या लाइन सेगमेंटेशन करते समय ओसीआर इंजन कभी-कभी शब्दों और लाइनों को एक साथ मिलाने की कोशिश करता है और इस प्रकार गलत सामग्री को संसाधित करता है और इसलिए गलत परिणाम देता है। अन्य मुद्दे भी हैं, लेकिन ये मूल हैं।

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


1

एक अच्छी गुणवत्ता का उत्पादन करने के लिए टेक्स्ट रिकग्निशन कई प्रकार के कारकों पर निर्भर करता है। ओसीआर आउटपुट अत्यधिक इनपुट छवि की गुणवत्ता पर निर्भर करता है। यही कारण है कि प्रत्येक ओसीआर इंजन इनपुट छवि की गुणवत्ता और इसके आकार के बारे में दिशा-निर्देश प्रदान करता है। ये दिशानिर्देश OCR इंजन को सटीक परिणाम देने में मदद करते हैं।

मैंने अजगर में छवि प्रसंस्करण पर एक विस्तृत लेख लिखा है। कृपया अधिक स्पष्टीकरण के लिए नीचे दिए गए लिंक का अनुसरण करें। उन प्रक्रिया को लागू करने के लिए अजगर स्रोत कोड भी जोड़ा।

कृपया एक टिप्पणी लिखें यदि आपके पास इस सुधार के लिए इस विषय पर कोई सुझाव या बेहतर विचार है।

https://medium.com/cashify-engineering/improve-accuracy-of-ocr-using-image-preprocessing-8df29ec3a033


2
कृपया अपने ब्लॉग के सारांश के रूप में यहां एक उत्तर जोड़ें। इतना है कि भले ही लिंक मर गया है उत्तर अभ्यस्त बेकार प्रदान किया जाएगा।
नितिन

0

आप शोर में कमी कर सकते हैं और फिर थ्रेसहोल्ड लागू कर सकते हैं, लेकिन आप - Ops और --oem मानों को बदलकर OCR के कॉन्फ़िगरेशन के साथ खेल सकते हैं

कोशिश करें: --psm 5 --oem 2

आप आगे के विवरण के लिए नीचे दिए गए लिंक पर भी देख सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.