Hướng dẫn Tối ưu ảnh chụp sách để OCR.

Thảo luận trong 'Hướng dẫn chung' bắt đầu bởi iamtnl, 8/12/20.

  1. iamtnl

    iamtnl Lớp 4

    TL;DR

    sample.png sample_fine-fs8.png

    OCR

    Bài hướng dẫn viết cho môi trường dòng lệnh (terminal) trên macOS, tuy nhiên các công cụ cần thiết đều có thể chạy được trên Windows.

    Các công cụ sử dụng

    - brew: công cụ quản lý package trên macOS, sử dụng để cài đặt các công cụ khác
    - imagemagick: công cụ chỉnh sửa ảnh
    - textcleaner: công cụ tối ưu ảnh scan
    - unpaper: công cụ tối ưu ảnh scan
    - ABBYY FineReader

    Cài đặt

    brew

    Làm theo hướng dẫn trên trang chủ [Vui lòng đăng nhập hoặc đăng ký để xem link.

    Mở ứng dụng Terminal và chạy dòng lệnh cài đặt

    Mã:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    imagemagick, unpaper

    Vẫn trên Terminal, chạy dòng lệnh

    Mã:
    brew install imagemagick unpaper

    textcleaner

    Đây là 1 script viết trên nền imagemagick, chỉ cần download tại địa chỉ này: Vui lòng đăng nhập hoặc đăng ký để xem link và đặt vào trong thư mục làm việc.

    Trong Terminal, cd đến thư mục làm việc và chạy lệnh cấp quyền cho textcleaner

    Mã:
    chmod +x textcleaner

    Sử dụng

    Dùng textcleaner để chuyển ảnh sang đen/trắng và xử lý cơ bản

    textcleaner là công cụ rất mạnh để làm nét chữ trong file ảnh. Có thể xem thêm demo ở trang cài đặt. Công cụ này cung cấp nhiều tham số để xử lý hình ảnh, tuy nhiên mục đích ở đây là chỉ chuyển ảnh về đen trắng và làm nổi bật vùng chữ nên ta sẽ chỉ quan tâm đến các tham số sau.

    • -g (grayscale): chuyển ảnh về chế độ đen/trắng.
    • -e (enhance): tự động điều chỉnh brightness của ảnh. Có 3 tham số là none (không điều chỉnh), normalizestretch. Có thể lựa chọn 1 trong 3 để ảnh đạt mức tốt nhất. Ở đây mình chọn normalize.
    • -f (filtersize) và -o (offset): các tham số điều chỉnh mức độ khử nhiễu (noise) của ảnh. Ảnh càng lớn thì filtersize càng nên để lớn, còn tham số offset có thể điều chỉnh để ảnh khử nhiễu tốt nhất. Ở đây mình chọn -f 100 -o 10.
    • -s (sharpamt): tăng độ nét của ảnh. Đa phần các camera điện thoại có độ nét khá tốt, nên không cần tham số này. Ở đây mình chọn -s 1.

    Tóm lại, câu lệnh sẽ là như thế này

    Mã:
    ./textcleaner -g -e normalize -f 100 -o 10 -s 1 sample.png sample_textcleaner.png
    Kết quả:
    sample_textcleaner.png

    Sử dụng unpaper để xóa các vùng rìa

    unpaper là công cụ tối ưu cho các file scan, tuy nhiên cũng có thể áp dụng cho file ảnh của chúng ta rất hiệu quả.

    Trước tiên, cần chuyển đổi định dạng file sang .ppm là định dạng mà unpaper sử dụng để làm việc. Ở đây sử dụng lệnh convert trong gói imagemagick. Mình thêm 1 tùy chọn chỉnh level để tăng độ đậm màu của ảnh.

    Mã:
    convert sample_textcleaner.png -level 50%,100%,1 sample_textcleaner.ppm
    Các tham số của unpaper

    • -v: in ra các thông tin trong quá trình chỉnh sửa.
    • --overwrite: ghi đè lên file output nếu file output đã tồn tại.
    • -bs, -bd, -bp, -bt: các thông số liên quan đến blackfilter. Đây là filter sử dụng để xóa các mảng màu đen có trong ảnh. Cách filter này hoạt động có thể xem tại [đây](). Nói đơn giản là sẽ quét 1 hình chữ nhật có kích thước là bs × bd trong ảnh. Nếu tỉ lệ pixel màu đen đạt mức bt trở lên thì sẽ tiến hành xóa vùng màu đen có chứa hình chữ nhật đó. Sau khi xử lý xong, dịch chuyển hình chữ nhật bp pixel và tiếp tục lặp lại quá trình. Do đó các tham số này phải tùy theo kích thước ảnh. Ở đây mình chọn -bs 2 -bd 50 -bp 1 -bt 0.99.
    • -bx: vùng ngoại lệ cho blackfilter. Tham số này áp dụng cho các file scan khi biết chắc chắn vùng text nằm ở khoảng nào để đặt ngoại lệ cho filter không chạy vào vùng đó. Ở đây chúng ta muốn filter chạy toàn bộ ảnh nên sẽ để -bx 0,0,0,0 (không có ngoại lệ).

    unpaper còn có các bộ lọc blurfilter, grayfilterdeskew. Các bộ lọc này có thể để tham số mặc định, không cần khai báo. Riêng deskew sẽ được thực hiện ở bước tiếp theo nên có thể khai báo --no-deskew để unpaper bỏ qua (tăng tốc độ xử lý).

    Câu lệnh cuối cùng

    Mã:
    unpaper -v --overwrite -bs 2 -bd 50 -bp 1 -bt 0.99 -bx 0,0,0,0 --no-deskew sample_textcleaner.ppm sample_unpaper.ppm
    Kết quả
    sample_unpaper.png

    Sử dụng FineReader để deskew và straighten text

    Sau khi thu được kết quả từ unpaper, cần chuyển đổi file lại định dạng png để FineReader có thể đọc được.

    Mã:
    convert sample_unpaper.ppm sample_unpaper.png
    Import file này vào FineReader, chọn Image Editor. Mục deskew. Apply.
    Screen Shot 2020-12-08 at 09.53.56.png

    Tiếp tục với mục Photo Correction, chọn Straighten Curved Text. Apply.

    Đến đây đã thu được file ảnh như mong muốn, lựa chọn của chúng ta là dùng FineReader để OCR hoặc export ra file ảnh để sử dụng trong các tool OCR khác.

    Kết quả OCR ở trên là mình sử dụng Google Drive để OCR.

    Mong các bạn thực hiện thành công.

    Kết luận

    Các tham số của textcleaner và đặc biệt là unpaper cần phải được tùy chỉnh để tối ưu cho file. Theo kinh nghiệm của mình thì bộ tham số của textcleaner dùng khá tốt cho các file khác nhau. Còn unpaper cần phải thay đổi bp, bs, bt.

    Khi tiến hành OCR cả 1 quyển sách, nên chọn tầm 10 file ngẫu nhiên có chất lượng khác nhau để tiến hành tùy chỉnh tham số. Sau khi tùy chỉnh xong thì có thể viết shell script để chạy batch cho toàn bộ.

    Đọc thêm

    - unpaper manual: Vui lòng đăng nhập hoặc đăng ký để xem link
    - unpaper concepts: Vui lòng đăng nhập hoặc đăng ký để xem link
    - textcleaner manual: Vui lòng đăng nhập hoặc đăng ký để xem link
    - fd: công cụ để chạy batch Vui lòng đăng nhập hoặc đăng ký để xem link
    - bash 101: vỡ lòng về dòng lệnh Vui lòng đăng nhập hoặc đăng ký để xem link
     

Chia sẻ trang này