xử lý hình ảnh để cải thiện độ chính xác OCR tesseract


145

Tôi đã sử dụng tesseract để chuyển đổi tài liệu thành văn bản. Chất lượng của các tài liệu rất khác nhau và tôi đang tìm kiếm các mẹo về cách xử lý hình ảnh nào có thể cải thiện kết quả. Tôi đã nhận thấy rằng văn bản được thể hiện rất rõ ràng - ví dụ như được tạo bởi các máy fax - đặc biệt khó xử lý - có lẽ tất cả các cạnh lởm chởm đó đối với các ký tự làm nhiễu các thuật toán nhận dạng hình dạng.

Những loại kỹ thuật xử lý hình ảnh sẽ cải thiện độ chính xác? Tôi đã sử dụng hiệu ứng làm mờ Gaussian để làm mịn các hình ảnh được tạo ra và thấy một số cải tiến nhỏ, nhưng tôi hy vọng rằng có một kỹ thuật cụ thể hơn sẽ mang lại kết quả tốt hơn. Giả sử một bộ lọc được điều chỉnh thành hình ảnh đen trắng, sẽ làm mịn các cạnh không đều, theo sau là bộ lọc sẽ tăng độ tương phản để làm cho các ký tự khác biệt hơn.

Bất kỳ lời khuyên chung cho một người mới làm quen với xử lý hình ảnh?

Câu trả lời:


103
  1. sửa DPI (nếu cần) 300 DPI là tối thiểu
  2. sửa kích thước văn bản (ví dụ 12 pt sẽ ổn)
  3. cố gắng sửa các dòng văn bản (văn bản deskew và dewarp)
  4. cố gắng khắc phục sự chiếu sáng của hình ảnh (ví dụ: không có phần tối của hình ảnh)
  5. hình ảnh nhị phân và khử nhiễu

Không có dòng lệnh phổ quát nào phù hợp với mọi trường hợp (đôi khi bạn cần làm mờ và làm sắc nét hình ảnh). Nhưng bạn có thể dùng thử TEXTCLEANER từ Tập lệnh ImageMagick của Fred .

Nếu bạn không phải là fan hâm mộ của dòng lệnh, có thể bạn có thể thử sử dụng mã nguồn mở scantailor.sourceforge.net hoặc thương mại bookrestorer .


6
Và có hướng dẫn minh họa về cách thực hiện việc này: code.google.com/p/tesseract-oc/wiki/ImproveQuality
iljau

2
Lưu ý, tập lệnh được liên kết dường như chỉ dành cho linux.
Zoran Pavlovic

1
Điều này không đúng - đây là một kịch bản bash. Nếu bạn đã cài đặt bash và ImageMagick, nó cũng sẽ chạy trên windows. Bash có thể cài đặt như một phần của phần mềm hữu ích khác, ví dụ như git hoặc msys2 ...
user898678 19/07/15

6
@iljau Kể từ khi chuyển sang github. trang wiki có tại: github.com/tesseract-oc/tesseract/wiki/ImproveQuality
hometoast

2
Các tài liệu Tesseract đã di chuyển một lần nữa, đến tesseract-oc.github.io/tessdoc/ImproveQuality
Không ai là

73

Tôi không có nghĩa là một chuyên gia OCR. Nhưng tôi tuần này đã cần phải chuyển đổi văn bản ra khỏi jpg.

Tôi đã bắt đầu với một jpg RGB, màu 440x747 pixel được tô màu. Tôi đã ngay lập tức thử tesseract về điều này, và chương trình chuyển đổi gần như không có gì. Sau đó tôi đã đi vào GIMP và làm như sau. hình ảnh> chế độ> hình ảnh thang độ xám> tỷ lệ hình ảnh> 1191x2000 pixel bộ lọc> nâng cao> mặt nạ unsharp với các giá trị bán kính = 6,8, lượng = 2,69, ngưỡng = 0 Sau đó tôi đã lưu dưới dạng jpg mới với chất lượng 100%.

Tesseract sau đó đã có thể trích xuất tất cả văn bản thành tệp .txt

Gimp là bạn của bạn.


11
+1 Tôi đã làm theo các bước của bạn và tôi đã có một sự cải thiện tuyệt vời. Cảm ơn
onof

1
Tôi cũng có ấn tượng rằng Tesseract hoạt động tốt hơn nếu bạn chuyển đổi đầu vào thành tệp TIFF và cung cấp cho Tesseract TIFF (thay vì yêu cầu Tesseract thực hiện chuyển đổi cho bạn). ImageMagick có thể thực hiện chuyển đổi cho bạn. Đây là ấn tượng giai thoại của tôi, nhưng tôi đã không kiểm tra nó một cách cẩn thận, vì vậy nó có thể sai.
DW

+1 Bộ lọc "mặt nạ unsharp" thực sự làm nên ngày của tôi. Một bước khác giúp tôi: sử dụng công cụ "lựa chọn mờ" chọn nền sau đó nhấn Del để làm sáng tỏ nó
Davide

Tôi bị mắc kẹt trong vấn đề xử lý hình ảnh này trước khi stackoverflow công nhận tesseract.com/questions/32473095/ay Bạn có thể giúp tôi không?
Hussain

không tôi đã cố gắng làm cho nó có kích thước lớn hơn, và đặt nó vào thang độ xám dường như không có gì mang lại cho tôi kết quả tích cực. Thở dài :( Kiểm tra mục tiêu này: freesms4us.com/ từ
gumuruh

30

Ba điểm để cải thiện khả năng đọc của hình ảnh: 1) Thay đổi kích thước hình ảnh với chiều cao và chiều rộng thay đổi (nhân 0,5 và 1 và 2 với chiều cao và chiều rộng của hình ảnh). 2) Chuyển đổi hình ảnh sang định dạng tỷ lệ Xám (Đen và trắng). 3) Xóa các pixel nhiễu và làm rõ hơn (Lọc hình ảnh).

Tham khảo mã dưới đây:

//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;
        }

ẢNH HƯỞNG
ẢNH HƯỞNG

HÌNH ẢNH ĐẦU RA HÌNH ẢNH ĐẦU RA


Có. Chúng tôi phải chuyển tham số bắt buộc cho phương thức Thay đổi kích thước, Nó sẽ thay đổi kích thước thay đổi, hoạt động SetGrayscale và RemoveNiri sau đó trả về hình ảnh đầu ra với khả năng đọc tốt hơn.
Sathyaraj Palanisamy

Đã thử phương pháp này trên một tập hợp các tệp và so sánh với kết quả ban đầu. Trong một số trường hợp hạn chế, nó cho kết quả tốt hơn, chủ yếu là chất lượng văn bản đầu ra giảm nhẹ. Vì vậy, nó không giống như một giải pháp phổ quát.
Bryn

Điều này thực sự làm việc khá tốt cho tôi. Chắc chắn nó mang lại một điểm khởi đầu cho quá trình xử lý trước hình ảnh giúp loại bỏ lượng tiếng nói bạn nhận được từ Tesseract.
vừng

22

Theo nguyên tắc thông thường, tôi thường áp dụng các kỹ thuật xử lý trước hình ảnh sau bằng thư viện OpenCV:

  1. Thay đổi kích thước hình ảnh (được khuyến nghị nếu bạn đang làm việc với hình ảnh có DPI dưới 300 dpi):

    img = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
    
  2. Chuyển đổi hình ảnh sang thang độ xám:

    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
  3. Áp dụng sự giãn nở và xói mòn để loại bỏ nhiễu (bạn có thể phát với kích thước hạt nhân tùy thuộc vào tập dữ liệu của bạn):

    kernel = np.ones((1, 1), np.uint8)
    img = cv2.dilate(img, kernel, iterations=1)
    img = cv2.erode(img, kernel, iterations=1)
    
  4. Áp dụng độ mờ, có thể được thực hiện bằng cách sử dụng một trong các dòng sau (mỗi dòng đều có ưu và nhược điểm, tuy nhiên, độ mờ trung bình và bộ lọc song phương thường hoạt động tốt hơn mờ gaussian.):

    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)
    

Gần đây tôi đã viết một hướng dẫn khá đơn giản cho Tesseract nhưng nó sẽ cho phép bạn viết kịch bản OCR đầu tiên của bạn và xóa một số trở ngại mà tôi gặp phải khi mọi thứ không rõ ràng hơn tôi muốn trong tài liệu.

Trong trường hợp bạn muốn kiểm tra chúng, ở đây tôi đang chia sẻ các liên kết với bạn:


Tại sao chúng ta chuyển đổi hình ảnh sang thang màu xám? Để cụ thể hơn, tôi đã thấy trong quá trình phát hiện hình ảnh, hình ảnh đầu tiên được chuyển đổi sang thang màu xám, sau đó sobel-> MSER -> SWT. bạn có thể vui lòng giải thích nó? Tôi là người mới trong lĩnh vực IP.
OnePunchMan

Theo hiểu biết của tôi, nó phụ thuộc vào thuật toán, một số có thể không cần phải chuyển đổi gì cả. Hãy nghĩ về các pixel như một vài giá trị màu được lưu trữ kỹ thuật số - trong trường hợp RGB, đỏ, xanh lục và xanh lam-. Khi một pixel được chuyển đổi sang thang đo B / W, thì thuật toán của bạn chỉ cần hoạt động trên 2 chiều, thay vì 3. Điều này đi kèm với những lợi thế rõ ràng về tốc độ khi chạy thuật toán của bạn trên từng pixel một. Hơn nữa, một số người cũng có thể nói rằng việc loại bỏ nhiễu sẽ dễ dàng hơn và phát hiện các cạnh trên ảnh khi nó được chuyển thành thang độ xám.
bkaankuguoglu

Cảm ơn bạn đã phản hồi. Và về blog của bạn, bạn có thể vui lòng viết một bài về CÁCH XÂY DỰNG OCR TỪ SCRATCH SỬ DỤNG TESSERACT cho kịch bản không phải là La Mã. Tôi đã tìm kiếm ở khắp mọi nơi, tất cả những gì có sẵn đều không rõ ràng.
OnePunchMan

16

Điều này là hơi trước đây nhưng nó vẫn có thể hữu ích.

Kinh nghiệm của tôi cho thấy rằng thay đổi kích thước hình ảnh trong bộ nhớ trước khi chuyển nó sang tesseract đôi khi có ích.

Hãy thử các chế độ nội suy khác nhau. Bài đăng https://stackoverflow.com/a/4756906/146003 đã giúp tôi rất nhiều.


15

Điều gì đã TUYỆT VỜI GIÚP TÔI với tôi theo cách này là các mã nguồn cho dự án Capture2Text. http://sourceforge.net/projects/capture2text/files/Capture2Text/ .

BTW: Kudos cho tác giả của nó để chia sẻ một thuật toán khó khăn như vậy.

Đặc biệt chú ý đến tệp Capture2Text \ SourceCode \ leptonica_util \ leptonica_util.c - đó là bản chất của tiền xử lý hình ảnh cho tiện ích này.

Nếu bạn sẽ chạy các nhị phân, bạn có thể kiểm tra chuyển đổi hình ảnh trước / sau quá trình trong thư mục Capture2Text \ Output \.

Giải pháp được đề cập PS sử dụng Tesseract cho OCR và Leptonica cho tiền xử lý.


1
Cảm ơn bạn đã sử dụng công cụ Capture2Text. Nó giải quyết hoàn hảo tất cả các vấn đề OCR trong dự án của tôi!
Lê Quang Duy

12

Phiên bản Java cho mã của Sathyaraj ở trên:

// 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;
}

Lớp học của bạn cho Bitmap là gì? Bitmap không được tìm thấy trong Java (Nó có trong Android nguyên bản).
Chúng tôi là Borg

Phương thức này thông qua một ngoại lệ: Nguyên nhân bởi: java.lang.IllegalArgumentException: y phải là <bitmap.height ()
Nativ

9

Tài liệu Tesseract chứa một số chi tiết tốt về cách cải thiện chất lượng OCR thông qua các bước xử lý hình ảnh.

Ở một mức độ nào đó, Tesseract tự động áp dụng chúng. Cũng có thể yêu cầu Tesseract viết một hình ảnh trung gian để kiểm tra, tức là kiểm tra xem quá trình xử lý hình ảnh bên trong hoạt động tốt như thế nào (tìm kiếm tessedit_write_imagestrong tài liệu tham khảo ở trên).

Quan trọng hơn, hệ thống mạng thần kinh mới trong Tesseract 4 mang lại kết quả OCR tốt hơn nhiều - nói chung và đặc biệt đối với hình ảnh có một số nhiễu. Nó được kích hoạt với --oem 1, ví dụ như trong:

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

(ví dụ này chọn ngôn ngữ tiếng Đức)

Do đó, sẽ hợp lý khi kiểm tra trước khi bạn đi được bao xa với chế độ LSTM Tesseract mới trước khi áp dụng một số bước xử lý hình ảnh tiền xử lý tùy chỉnh.


6

Ngưỡng thích ứng là quan trọng nếu ánh sáng không đồng đều trên hình ảnh. Quá trình tiền xử lý của tôi bằng GraphicsMagic được đề cập trong bài đăng này: https://groups.google.com/forum/#!topic/tesseract-oc/jONGSChLRv4

GraphicsMagic cũng có tính năng -lat cho Ngưỡng thích ứng thời gian tuyến tính mà tôi sẽ thử sớm.

Một phương pháp ngưỡng khác sử dụng OpenCV được mô tả ở đây: http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html


2
Liên kết OpenCV được thay đổi. Trong tài liệu OpenCV, đó là Hướng dẫn OpenCV-Python> Xử lý hình ảnh trong OpenCV> Ngưỡng hình ảnh
richk

2

Tôi đã làm những điều này để có được kết quả tốt từ một hình ảnh không có văn bản rất nhỏ.

  1. Áp dụng mờ cho hình ảnh gốc.
  2. Áp dụng Ngưỡng thích ứng.
  3. Áp dụng hiệu ứng làm sắc nét.

Và nếu vẫn không đạt được kết quả tốt, hãy chia tỷ lệ hình ảnh lên 150% hoặc 200%.


2

Đọc văn bản từ các tài liệu hình ảnh bằng cách sử dụng bất kỳ công cụ OCR nào có nhiều vấn đề để có được độ chính xác tốt. Không có giải pháp cố định cho tất cả các trường hợp nhưng đây là một vài điều cần được xem xét để cải thiện kết quả OCR.

1) Hiện diện nhiễu do chất lượng hình ảnh kém / yếu tố không mong muốn / đốm màu trong vùng nền. Điều này đòi hỏi một số thao tác tiền xử lý như loại bỏ nhiễu có thể dễ dàng thực hiện bằng cách sử dụng bộ lọc gaussian hoặc các phương pháp lọc trung bình bình thường. Đây cũng có sẵn trong OpenCV.

2) Định hướng sai của hình ảnh: Do định hướng sai, động cơ OCR không phân đoạn các dòng và từ trong hình ảnh một cách chính xác, điều này mang lại độ chính xác tồi tệ nhất.

3) Sự hiện diện của các dòng: Trong khi thực hiện phân đoạn từ hoặc dòng, công cụ OCR đôi khi cũng cố gắng hợp nhất các từ và dòng với nhau và do đó xử lý nội dung sai và do đó cho kết quả sai. Cũng có những vấn đề khác nhưng đây là những vấn đề cơ bản.

Ứng dụng OCR bài này là một trường hợp ví dụ trong đó một số hình ảnh tiền xử lý trước và xử lý hậu kỳ trên kết quả OCR có thể được áp dụng để có độ chính xác OCR tốt hơn.


1

Nhận dạng văn bản phụ thuộc vào nhiều yếu tố khác nhau để tạo ra chất lượng tốt. Đầu ra OCR phụ thuộc nhiều vào chất lượng của hình ảnh đầu vào. Đây là lý do tại sao mọi công cụ OCR cung cấp các hướng dẫn liên quan đến chất lượng hình ảnh đầu vào và kích thước của nó. Những hướng dẫn này giúp động cơ OCR tạo ra kết quả chính xác.

Tôi đã viết một bài viết chi tiết về xử lý hình ảnh trong python. Vui lòng theo liên kết dưới đây để giải thích thêm. Cũng đã thêm mã nguồn python để thực hiện các quy trình đó.

Hãy viết bình luận nếu bạn có một gợi ý hoặc ý tưởng tốt hơn về chủ đề này để cải thiện nó.

https://medium.com/cashify-engineering/improve-accuracy-of-oc-USE-image-pre Processing-8df29ec3a033


2
Vui lòng thêm một câu trả lời ở đây như một bản tóm tắt của blog của bạn. Vì vậy, ngay cả khi liên kết đã chết, câu trả lời sẽ không được hiển thị.
Nithin

0

bạn có thể thực hiện giảm nhiễu và sau đó áp dụng ngưỡng, nhưng bạn có thể chơi xung quanh với cấu hình của OCR bằng cách thay đổi các giá trị --psm và --oem

thử: --psm 5 - như 2

bạn cũng có thể nhìn vào liên kết sau để biết thêm chi tiết tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.