2012-01-02 30 views
8

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:

  1. 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
  2. Trung: mẫu: một chữ số từ những bài tập của tôi thiết lập
  3. 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).

topbottommiddle

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).

Trả lời

6

Tôi sẽ xem xét việc sử dụng thác Haar. Tôi đã sử dụng chúng để dò tìm khuôn mặt/theo dõi đầu và có vẻ như bạn có thể xây dựng một loạt các thác tuyệt vời với đủ '2,' 3, '4', v.v.

http://alereimondo.no-ip.org/OpenCV/34

http://en.wikipedia.org/wiki/Haar-like_features

+0

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

+0

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

+0

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

3

OCR trên hình ảnh ồn ào là không dễ dàng - phương pháp đơn giản như vậy không không làm việc tốt.

Vì vậy, tôi khuyên bạn nên sử dụng HOG để trích xuất các tính năng và SVM để phân loại. HOG có vẻ là một trong những cách mạnh nhất để mô tả hình dạng.

Toàn bộ đường ống xử lý được triển khai trong OpenCV, tuy nhiên tôi không biết tên hàm trong trình bao bọc python. Bạn sẽ có thể đào tạo với haartraining.cpp mới nhất - nó thực sự hỗ trợ nhiều hơn haar - HOG và LBP.

Và tôi nghĩ rằng mã mới nhất (từ thân cây) được cải thiện nhiều so với bản phát hành chính thức (2.3.1).

HOG thường chỉ cần một phần nhỏ dữ liệu đào tạo được sử dụng bởi các phương pháp nhận dạng khác, nếu bạn muốn phân loại các hình dạng được ocludded một phần (hoặc thiếu), bạn nên đảm bảo bạn bao gồm một số hình dạng như vậy trong đào tạo.

+0

Tôi sẽ không gọi những hình ảnh * ồn ào * mỗi lần, nhưng tôi thấy bạn đến từ đâu. Tôi sẽ xem HOG. Cảm ơn. – misha

3

Tôi có thể cho bạn biết từ kinh nghiệm của tôi và đọc một số giấy tờ về phân loại nhân vật, cách tốt nhất để bắt đầu là đọc về Phân tích thành phần chính (PCA), Phân tích phân biệt đối xử tuyến tính của Fisher (LDA) và Hỗ trợ máy Vector (SVM). Đây là những phương pháp phân loại cực kỳ hữu ích cho OCR và hóa ra OpenCV đã bao gồm các triển khai tuyệt vời trên PCAsSVMs. Tôi chưa thấy bất kỳ ví dụ mã OpenCV nào cho OCR, nhưng bạn có thể sử dụng một số phiên bản phân loại khuôn mặt đã sửa đổi để thực hiện phân loại ký tự. Một nguồn tài nguyên tuyệt vời cho mã nhận dạng khuôn mặt cho OpenCV là this website.

Một thư viện khác cho Python mà tôi khuyên bạn là "scikits.learn". Nó rất dễ dàng để gửi cvArrays để scikits.learn và chạy thuật toán học máy trên dữ liệu của bạn. Một ví dụ cơ bản cho OCR sử dụng SVM là here.

Một ví dụ phức tạp hơn khi sử dụng tính năng đa tạp để nhận dạng ký tự viết tay là here.

Các vấn đề liên quan