পরীক্ষামূলক ওসিআর যথার্থতা উন্নত করতে চিত্র প্রক্রিয়াকরণ


145

আমি নথিগুলিকে পাঠ্যে রূপান্তর করতে টেসারেক্ট ব্যবহার করছি। দস্তাবেজগুলির গুণমানটি বর্বরতার সাথে বিস্তৃত এবং আমি কী ধরণের চিত্র প্রক্রিয়াকরণের ফলাফলগুলিতে উন্নতি করতে পারে তার টিপস সন্ধান করছি। আমি লক্ষ্য করেছি যে পাঠ্যটি অত্যন্ত পিক্সেললেটেড - উদাহরণস্বরূপ যে ফ্যাক্স মেশিনগুলির দ্বারা উত্পাদিত হয়েছিল - এটি পরীক্ষার পক্ষে প্রক্রিয়াজাতকরণের পক্ষে বিশেষত কঠিন - সম্ভবত অক্ষরগুলিতে এই সমস্ত দাগযুক্ত প্রান্তটি আকৃতি-স্বীকৃতি অ্যালগরিদমগুলিকে বিভ্রান্ত করে।

কোন ধরণের চিত্র প্রক্রিয়াকরণের কৌশলগুলি নির্ভুলতার উন্নতি করবে? আমি পিক্সেলটেড চিত্রগুলি মসৃণ করতে একটি গাউসিয়ান ব্লার ব্যবহার করছি এবং কিছুটা ছোট উন্নতি দেখেছি, তবে আমি আশা করছি যে আরও একটি নির্দিষ্ট কৌশল রয়েছে যাতে আরও ভাল ফলাফল পাওয়া যাবে। এমন একটি ফিল্টার বলুন যা কালো এবং সাদা চিত্রগুলিতে সুরযুক্ত ছিল, যা অনিয়মিত প্রান্তগুলি মসৃণ করবে, এর পরে একটি ফিল্টারটি অক্ষরকে আরও স্বতন্ত্র করার জন্য বৈসাদৃশ্যকে বাড়িয়ে তুলবে।

ইমেজ প্রসেসিংয়ে একজন শিক্ষানবিশদের জন্য কোনও সাধারণ টিপস?

উত্তর:


103
  1. ডিপিআই ঠিক করুন (প্রয়োজনে) 300 ডিপিআই সর্বনিম্ন
  2. পাঠ্য আকার ঠিক করুন (উদাহরণস্বরূপ 12 পিটি ঠিক হওয়া উচিত)
  3. পাঠ্য রেখাগুলি ঠিক করার চেষ্টা করুন (পাঠ্যকে ছদ্মবেশ এবং অদৃশ্য করুন)
  4. চিত্রের আলোকসজ্জা ঠিক করার চেষ্টা করুন (উদাহরণস্বরূপ চিত্রের অন্ধকার অংশ নেই)
  5. বাইনারি এবং ডি-শব্দের চিত্র

এমন কোনও সার্বজনীন কমান্ড লাইন নেই যা সমস্ত ক্ষেত্রে খাপ খায় (কখনও কখনও আপনার চিত্রটি অস্পষ্ট এবং তীক্ষ্ণ করা প্রয়োজন)। তবে আপনি ফ্রেডের ইমেজম্যাগিক স্ক্রিপ্টগুলি থেকে টেক্সট্লেয়ারে চেষ্টা করতে পারেন ।

আপনি যদি কমান্ড লাইনের অনুরাগী না হন, তবে আপনি ওপেনসোর্স স্ক্যান্টাইলার.সোর্সফোর্জন . नेट বা বাণিজ্যিক বুকরেস্টার ব্যবহার করার চেষ্টা করতে পারেন ।


6
And there's illustrated guide on how to do this: code.google.com/p/tesseract-ocr/wiki/ImproveQuality
iljau

2
Note, the linked script appears to be linux-only.
Zoran Pavlovic

1
এটি সত্য নয় - এটি একটি বাশ স্ক্রিপ্ট। আপনি যদি ব্যাশ এবং ইমেজম্যাগিক ইনস্টল করে থাকেন তবে এটি উইন্ডোতেও চলবে। বাশ অন্যান্য ব্যবহারযোগ্য সফ্টওয়্যারগুলির অংশ হিসাবে ইনস্টল করতে পারে যেমন গিট বা এমএসএস 2 ...
ব্যবহারকারী 898678

6
@ ইলজাউ যেহেতু গিথুব এ চলে গেছে। উইকির পৃষ্ঠাটি এখানে রয়েছে: github.com/tesseract-ocr/tesseract/wiki/ImproveQuality
টোস্ট

2
পরীক্ষামূলক দস্তাবেজগুলি আবার tesseract-ocr.github.io/tessdoc/ ইমপ্রোভকুয়ালিটিতে
কেউ নেই

73

আমি কোনওভাবেই ওসিআর বিশেষজ্ঞ নই। তবে আমার এই সপ্তাহে একটি জেপিজির বাইরে পাঠ্য রূপান্তর করা দরকার ছিল।

I started with a colorized, RGB 445x747 pixel jpg. I immediately tried tesseract on this, and the program converted almost nothing. I then went into GIMP and did the following. image>mode>grayscale image>scale image>1191x2000 pixels filters>enhance>unsharp mask with values of radius = 6.8, amount = 2.69, threshold = 0 I then saved as a new jpg at 100% quality.

Tesseract then was able to extract all the text into a .txt file

Gimp is your friend.


11
+1 I followed your steps and I got a great improvement. Thanks
onof

1
I also have the impression that Tesseract works better if you convert the input to a TIFF file and give Tesseract the TIFF (rather than asking Tesseract to do the conversion for you). ImageMagick can do the conversion for you. This is my anecdotal impression, but I haven't tested it carefully, so it could be wrong.
D.W.

+1 The "unsharp mask" filter really made my day. Another step that helped me: using the "fuzzy selection" tool select the background then press Del for wightening it out
Davide

আমি এই ইমেজ প্রসেসিং ইস্যুতে আটকে আছি আগে tesseract স্বীকৃতি stackoverflow.com/questions/32473095/… আপনি কি আমাকে এখানে সাহায্য করতে পারেন?
হুসেন

নাঃ। আমি এটিকে আরও বড় আকারের করার চেষ্টা করেছি, এবং এটিকে গ্রেস্কেলে সেট করেছি বলে মনে হচ্ছে কিছুই আমাকে ইতিবাচক ফলাফল দেয় না। দীর্ঘশ্বাস :( এই লক্ষ্যটি পরীক্ষা করুন: freesms4us.com/…
gumuruh

30

চিত্রের পঠনযোগ্যতার উন্নতি করার জন্য তিনটি পয়েন্ট: 1) পরিবর্তনশীল উচ্চতা এবং প্রস্থের সাথে চিত্রের আকার পরিবর্তন করুন (চিত্রের উচ্চতা এবং প্রস্থের সাথে 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;
        }

ইনপুট চিত্র
ইনপুট চিত্র

ছবিটি ছাড়ুন ছবিটি ছাড়ুন


হ্যাঁ.আমাকে পুনরায় আকার দেওয়ার পদ্ধতির জন্য প্রয়োজনীয় প্যারামিটারটি পাস করতে হবে, এটি আকার পরিবর্তন, সেটগ্রাইস্কেল এবং রিমোটনয়েস ক্রিয়াকলাপটি প্রেরণ করবে তারপরে আরও ভাল পঠনযোগ্যতার সাথে আউটপুট চিত্র ফিরে আসবে।
সত্যরাজ পলানিসামি

ফাইলগুলির সেটগুলিতে এই পদ্ধতির চেষ্টা করে এবং প্রাথমিক ফলাফলের সাথে তুলনা করে। কিছু সীমিত ক্ষেত্রে এটি আরও ভাল ফলাফল দেয়, বেশিরভাগ ক্ষেত্রে আউটপুট পাঠ্যের মানটিতে কিছুটা হ্রাস ছিল। সুতরাং, এটি সর্বজনীন সমাধানের মতো দেখায় না।
ব্রায়ান

এটি আসলে আমার জন্য বেশ ভাল কাজ করেছে। অবশ্যই এটি ইমেজ প্রাক-প্রসেসিংয়ের জন্য একটি সূচনা পয়েন্ট দেয় যা পরীক্ষার থেকে আপনি ফিরে আসা জিব্বের পরিমাণ সরিয়ে দেয়।
ses

22

থাম্বের নিয়ম হিসাবে, আমি সাধারণত ওপেনসিভি লাইব্রেরি ব্যবহার করে নিম্নলিখিত চিত্র প্রাক প্রসেসিং কৌশল প্রয়োগ করি:

  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. অস্পষ্ট প্রয়োগ করা, যা নিম্নোক্ত একটি লাইন ব্যবহার করে করা যেতে পারে (যার প্রতিটিটির পক্ষে মতামত রয়েছে) তবে মিডিয়ান ব্লার এবং দ্বিপক্ষীয় ফিল্টার সাধারণত গাউসিয়ান ব্লারের চেয়ে ভাল পারফর্ম করে perform

    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)
    

আমি সম্প্রতি টেসেরাক্টের জন্য একটি সহজ সরল গাইড লিখেছি তবে এটি আপনাকে প্রথম ওসিআর স্ক্রিপ্ট লিখতে এবং এমন কিছু প্রতিবন্ধকতাগুলি সাফ করার জন্য সক্ষম করতে হবে যা আমি ডকুমেন্টেশনে পছন্দ না করার চেয়ে কম স্পষ্ট ছিলাম experienced

আপনি যদি সেগুলি পরীক্ষা করে দেখতে চান তবে আমি এখানে আপনার সাথে লিঙ্কগুলি ভাগ করছি:


কেন আমরা চিত্রটি ধূসর আকারে রূপান্তর করব? আরও সুনির্দিষ্টভাবে বলতে গেলে, আমি চিত্রটি সনাক্তকরণের প্রক্রিয়ায় দেখেছি, ছবিটি প্রথমে ধূসর স্কেলে রূপান্তরিত হয়, তারপরে sobel-> MSER -> SWT। আপনি দয়া করে এটি বিস্তারিত বলতে পারেন? আইপি ক্ষেত্রে আমি নতুন।
ওয়ানপঞ্চমান

আমার বোঝার হিসাবে, এটি অ্যালগরিদমের উপর নির্ভর করে, কারও কারও কাছে রূপান্তর করার প্রয়োজন নেই। ডিজিটালি সংরক্ষণিত কয়েকটি রঙের মান হিসাবে পিক্সেলগুলির কথা ভাবেন -আরজিবি, লাল, সবুজ এবং নীল- এর ক্ষেত্রে। যখন কোনও পিক্সেল বি / ডব্লিউ স্কেলে রূপান্তরিত হয়, তখন আপনার অ্যালগরিদমকে ৩ এর পরিবর্তে মাত্র ২ মাত্রা নিয়ে কাজ করা দরকার your আরও, কেউ কেউ আরও বলতে পারেন যে কোনও শব্দকে গ্রেস্কেল রূপান্তরিত করার সময় শব্দটি সরিয়ে ফেলা এবং প্রান্তগুলি সনাক্ত করা সহজ।
বিকাঙ্কুগুগলু

প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ. এবং আপনার ব্লগ সম্পর্কে, আপনি দয়া করে রোমানহীন স্ক্রিপ্টের জন্য টেস্টার্যাক্ট ব্যবহার করে স্ক্র্যাচ থেকে কীভাবে ওসিআর তৈরি করতে পারেন তার উপর একটি লিখতে পারেন। আমি সর্বত্র অনুসন্ধান করেছি, যা উপলভ্য রয়েছে তা পরিষ্কার নয়।
ওয়ানপঞ্চমান

16

এটি কিছুটা আগে কিন্তু এটি এখনও কার্যকর হতে পারে।

আমার অভিজ্ঞতা থেকে দেখা যায় যে চিত্রটি পরীক্ষার দিকে যাওয়ার আগে মেমরিটিকে মেমরির আকার পরিবর্তন করা কখনও কখনও সহায়তা করে।

ইন্টারপোলেশন বিভিন্ন মোড চেষ্টা করুন। Https://stackoverflow.com/a/4756906/146003 পোস্টটি আমাকে অনেক সহায়তা করেছে।


15

এই পথে আমার কাছে অত্যন্ত সাহায্যকারীটি হ'ল ক্যাপচার 2 টেক্সট প্রকল্পের উত্স কোডগুলি। http://sourceforge.net/projects/capture2text/files/Capture2Text/

বিটিডাব্লু: এরকম শ্রমঘটিত অ্যালগরিদম ভাগ করে নেওয়ার জন্য এর লেখকের কাছে কুদোস।

ক্যাপচার 2 টেক্সট \ সোর্সকোড \ লেপটোনিকা_টিল \ লেপটোনিকা_টিল.সি. ফাইলটিতে বিশেষ মনোযোগ দিন - এটি এই ইউটিলিটির জন্য চিত্র প্রাক প্রসেসিয়েন্সের সংক্ষিপ্তসার।

আপনি যদি বাইনারিগুলি চালনা করেন তবে আপনি ক্যাপচার 2 টেক্সট \ আউটপুট \ ফোল্ডারে প্রক্রিয়াটির আগে / পরে চিত্রের রূপান্তর পরীক্ষা করতে পারেন।

পিএস উল্লিখিত সমাধান প্রিপ্রোসেসিংয়ের জন্য ওসিআর এবং লেপটোনিকার জন্য টেসারেক্ট ব্যবহার করে।


1
ক্যাপচার 2 পাঠ্য সরঞ্জামটির জন্য আপনাকে ধন্যবাদ। এটি আমার প্রকল্পের সমস্ত ওসিআর সমস্যা নিখুঁতভাবে সমাধান করে!
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.IllegalArgumentEception: y অবশ্যই <বিটম্যাপ.হাইট () হতে হবে
নাটিভ

9

ওসিসির মান কীভাবে উন্নত করা যায় সে সম্পর্কে পরীক্ষামূলক ডকুমেন্টেশনে কিছু ভাল বিবরণ রয়েছেইমেজ প্রসেসিং পদক্ষেপের মাধ্যমে ।

কিছুটা ডিগ্রি পর্যন্ত, টেসারেক্ট এগুলি স্বয়ংক্রিয়ভাবে প্রয়োগ করে। পরিদর্শন করার জন্য মধ্যবর্তী চিত্র লিখতে, যেমন অভ্যন্তরীণ চিত্র প্রক্রিয়াকরণটি কতটা ভাল কাজ করে তা পরীক্ষা করে ( tessedit_write_imagesউপরের রেফারেন্সের জন্য অনুসন্ধান করুন ) পরীক্ষা করার জন্য টেস্টারকে বলাও সম্ভব ।

আরও গুরুত্বপূর্ণ বিষয়, টেস্টেরাক্ট 4- এ নতুন নিউরাল নেটওয়ার্ক সিস্টেম আরও ভাল ওসিআর ফলাফল দেয় - সাধারণভাবে এবং বিশেষত কিছু শব্দ সহ চিত্রগুলির জন্য। এটি এতে সক্ষম করা হয়েছে --oem 1, যেমন:

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

(এই উদাহরণটি জার্মান ভাষা নির্বাচন করে)

সুতরাং, কিছু কাস্টম প্রাক-প্রসেসিং ইমেজ প্রসেসিং পদক্ষেপগুলি প্রয়োগ করার আগে আপনি নতুন পরীক্ষামূলক এলএসটিএম মোডের সাথে কতটা পৌঁছান তা প্রথম পরীক্ষা করে নেওয়া বুদ্ধিমান হয়ে যায়।


6

অভিযোজিত প্রান্তিককরণ গুরুত্বপূর্ণ যদি ইমেজ জুড়ে আলো অসম হয়। গ্রাফিকস ম্যাজিক ব্যবহার করে আমার প্রিপ্রোসেসিং এই পোস্টে উল্লেখ করা হয়েছে: https://groups.google.com/forum/#!topic/tesseract-ocr/jONGSChLRv4

গ্রাফিক্স ম্যাজিক-এ লিনিয়ার সময় অ্যাডাপিটিভ থ্রেশহোল্ডের জন্য-ল্যাট বৈশিষ্ট্য রয়েছে যা আমি শীঘ্রই চেষ্টা করব।

OpenCV ব্যবহার থ্রেশহোল্ডিং আরেকটি পদ্ধতি এখানে বর্ণিত হয়: http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html


2
ওপেনসিভি লিঙ্কটি পরিবর্তন করা হয়েছে। ওপেনসিভি ডকুমেন্টেশনে এটি ওপেনসিভি-পাইথন টিউটোরিয়ালস>
ওপেনসিভিতে

2

কোনও চিত্রের খুব ভাল পাঠ্য নেই এমন থেকে ভাল ফলাফল পেতে আমি এগুলি করেছি।

  1. মূল চিত্রটিতে অস্পষ্টতা প্রয়োগ করুন।
  2. অভিযোজিত থ্রেশহোল্ড প্রয়োগ করুন।
  3. ধারালো প্রভাব প্রয়োগ করুন।

এবং যদি এখনও ভাল ফলাফল না পাওয়া যায় তবে চিত্রটি স্কেল করুন 150% বা 200%।


2

যে কোনও ওসিআর ইঞ্জিন ব্যবহার করে চিত্রের নথিগুলি থেকে পাঠ্য পড়ার ক্ষেত্রে অনেকগুলি সমস্যা রয়েছে যাতে সঠিক নির্ভুলতা পাওয়া যায়। সমস্ত মামলার কোনও স্থির সমাধান নেই তবে এখানে কয়েকটি বিষয় যা ওসিআর ফলাফলের উন্নতির জন্য বিবেচনা করা উচিত।

1) ব্যাকগ্রাউন্ড অঞ্চলে খারাপ চিত্রের গুণমান / অযাচিত উপাদান / ব্লবগুলির কারণে শব্দের উপস্থিতি। এর জন্য কিছু প্রাক-প্রক্রিয়াজাতকরণ অপারেশনগুলির দরকার রয়েছে যেমন শব্দটি সরানো যা গাউসীয় ফিল্টার বা সাধারণ মিডিয়ান ফিল্টার পদ্ধতিগুলি ব্যবহার করে সহজেই করা যায়। এগুলি ওপেনসিভিতেও উপলব্ধ।

2) চিত্রের ভুল দিকনির্দেশনা: ভুল ওরিয়েন্টেশনের কারণে ওসিআর ইঞ্জিনটি চিত্রের লাইন এবং শব্দগুলিকে সঠিকভাবে ভাগ করতে ব্যর্থ হয় যা সবচেয়ে খারাপ নির্ভুলতা দেয়।

3) লাইনের উপস্থিতি: শব্দ বা লাইন বিভাজন করার সময় ওসিআর ইঞ্জিন কখনও কখনও শব্দ এবং লাইনগুলিকে একত্রিত করার চেষ্টা করে এবং এর ফলে ভুল সামগ্রী প্রক্রিয়াকরণ করে এবং এর ফলে ভুল ফলাফল দেয়। এছাড়াও অন্যান্য সমস্যা আছে তবে এগুলি মূল বিষয়গুলি।

এই পোস্টের ওসিআর অ্যাপ্লিকেশনটি একটি উদাহরণস্বরূপ যেখানে ওসিআর ফলাফলের উপর কিছু চিত্র পূর্ব-প্রসেসিং এবং পোস্ট প্রসেসিং আরও ভাল ওসিআর নির্ভুলতা পাওয়ার জন্য প্রয়োগ করা যেতে পারে।


1

পাঠ্য স্বীকৃতি একটি ভাল মানের আউটপুট উত্পাদন করতে বিভিন্ন কারণের উপর নির্ভর করে। ওসিআর আউটপুট অত্যন্ত ইনপুট চিত্রের মানের উপর নির্ভর করে। এই কারণেই প্রতিটি ওসিআর ইঞ্জিন ইনপুট চিত্রের মান এবং এর আকার সম্পর্কিত নির্দেশিকা সরবরাহ করে। এই নির্দেশিকাগুলি ওসিআর ইঞ্জিনকে সঠিক ফলাফল তৈরি করতে সহায়তা করে।

আমি পাইথনে চিত্র প্রক্রিয়াকরণ সম্পর্কে একটি বিশদ নিবন্ধ লিখেছি। দয়া করে আরও ব্যাখ্যার জন্য নীচের লিঙ্কটি অনুসরণ করুন। এই প্রক্রিয়াটি বাস্তবায়নের জন্য অজগর উত্স কোড যুক্ত করেছে।

এটি উন্নত করার জন্য আপনার কাছে এই বিষয়ে কোনও পরামর্শ বা আরও ভাল ধারণা থাকলে দয়া করে একটি মন্তব্য লিখুন।

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


2
আপনার ব্লগের সংক্ষিপ্তসার হিসাবে এখানে একটি উত্তর যুক্ত করুন। যাতে লিঙ্কটি মারা গেলেও উত্তরটি অকেজো হয়ে যায়।
নিতিন

0

আপনি শব্দটি হ্রাস করতে পারেন এবং তারপরে প্রান্তিককরণ প্রয়োগ করতে পারেন তবে আপনি ওপিআর এর কনফিগারেশনের সাথে --psm এবং --oem মান পরিবর্তন করে খেলতে পারবেন

চেষ্টা করুন: --psm 5 - oem 2

আপনি এখানে আরও তথ্যের জন্য নীচের লিঙ্কটি দেখতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.