Tôi đang viết một ứng dụng OCR để đọc các ký tự từ ảnh chụp màn hình. Hiện tại, tôi chỉ tập trung vào các chữ số. Tôi là một phần dựa trên cách tiếp cận của tôi trên bài đăng trên blog này: http://blog.damiles.com/2008/11/basic-ocr-in-opencv/.OCR của văn bản có độ phân giải thấp từ ảnh chụp màn hình
Tôi có thể trích xuất thành công từng ký tự riêng lẻ bằng cách sử dụng một số thao tác thông minh. Trường hợp những thứ có được một chút khôn lanh là phù hợp với các nhân vật. Ngay cả với khuôn mặt và kích thước phông chữ cố định, có một số biến như màu nền và kerning gây ra cùng một chữ số xuất hiện ở các hình dạng hơi khác nhau. Ví dụ, hình ảnh dưới đây được tách ra thành 3 phần:
- chính: một chữ số mục tiêu mà tôi được chiết xuất thành công từ một ảnh chụp màn hình
- Trung: mẫu: một chữ số từ những bài tập của tôi thiết lập
- Bottom: các lỗi (khác biệt tuyệt đối) giữa hình ảnh trên cùng và giữa
Các phần đã được thu nhỏ (khoảng cách giữa hai đường ngang màu xanh lá cây đại diện cho một pixel).
Bạn có thể thấy rằng mặc dù cả hai phía trên và hình ảnh giữa đại diện một cách rõ ràng 2, sai số giữa chúng là khá cao. Điều này gây ra các kết quả sai khi so khớp các chữ số khác - ví dụ, không khó để thấy cách 7 được đặt đúng có thể khớp với chữ số đích trong hình ảnh ở trên tốt hơn so với hình ảnh ở giữa có thể.
Hiện tại, tôi đang xử lý điều này bằng cách có một đống hình ảnh đào tạo cho mỗi chữ số và khớp với số mục tiêu so với những hình ảnh đó, từng cái một. Tôi đã thử lấy hình ảnh trung bình của tập huấn luyện, nhưng điều đó không giải quyết được vấn đề (dương tính giả trên các chữ số khác).
Tôi hơi lưỡng lự khi thực hiện đối sánh bằng cách sử dụng mẫu được dịch chuyển (về bản chất nó giống như những gì tôi đang làm bây giờ). Có cách nào tốt hơn để so sánh hai hình ảnh hơn là sự khác biệt tuyệt đối đơn giản không? Tôi đã nghĩ về một cái gì đó giống như EMD (khoảng cách động đất), về cơ bản, tôi cần một phương pháp so sánh không nhạy cảm với chuyển dịch toàn cục và thay đổi cục bộ nhỏ (pixel bên cạnh một điểm ảnh trắng trở thành màu trắng hoặc pixel bên cạnh một pixel màu đen trở thành màu đen), nhưng rất nhạy cảm với các thay đổi toàn cầu (các pixel đen không có điểm ảnh gần màu trắng trở thành màu đen và ngược lại).
Ai có thể đề xuất phương pháp đối sánh hiệu quả hơn so với sự khác biệt tuyệt đối không?
Tôi đang làm tất cả điều này trong OpenCV bằng cách sử dụng trình bao bọc Python kiểu C (import cv
).
Cảm ơn! Tôi chắc chắn sẽ có một cái nhìn tại thác Haar. Bạn nghĩ nó hiệu quả như thế nào so với phép trừ hình ảnh đơn giản? Tôi hy vọng nó sẽ chậm hơn. Tuy nhiên, nếu nó chậm hơn 5 lần nhưng thay thế 10 hình ảnh kiểm tra cho cùng một hiệu quả, sau đó nó chắc chắn sẽ có giá trị nó. – misha
Bạn sẽ phải tạo ra thác, đó là một quá trình khá tốn thời gian (nhưng cũng ngớ ngẩn song song). Nó cũng đòi hỏi một loạt các dữ liệu đầu vào (tôi sẽ sử dụng các con số trong mỗi phông chữ bạn có trên một máy tính để bàn). – rsaxvc
Chậm hơn phép trừ, nhưng bạn có thể tìm kiếm hình ảnh cho tất cả các trường hợp của một tầng nhất định cùng một lúc. – rsaxvc