Đọc mã thẻ cào điện thoại

Bài viết này dịch lại 1 bài viết hướng dẫn cách đọc mã thẻ cào điện thoại ở nước ngoài. Bài viết sử dụng các phương pháp xử lý cơ bản với text rõ ràng và độ tương phản cao.

Bài toán cần giải quyết là: từ ảnh thẻ cào làm sao lấy ra chữ số từ phần màu vàng? Và ký tự không rõ ràng như các ký tự trên máy tính, vậy làm sao để nhận dạng?

digit


Ảnh gốc
scratchcard

Nhìn vào hình thấy chữ số muốn tác có background màu vàng và chữ màu đen. Sử dụng không gian màu CMYK là một ý tưởng hay, ngoài ra cũng có thể sử dụng HSV. Trong lý thuyết về hệ màu CMYK, phần màu vàng có giá trị cao trong kênh Y, và màu đen có giá trị cao trong kênh K.

Tuy nhiên OpenCV không hỗ trợ CMYK nên chúng tôi sẽ viết code để chuyển đổi, xem code bên dưới:

Đoạn code trên load ảnh gốc từ BGR rồi chuyển sang hệ màu CMYK. Kết quả là được 4 ma trận chứa trong std::vector. Mỗi kênh màu C, M, Y và K chứa các giá trị pixel như ảnh bên dưới:

scratchcard_4_channel

4 khung ảnh a,b,c,d theo thứ tự từ trái qua phải, từ trên xuống dưới. (a) C channel. (b) M channel. (c) Y channel. (d) K channel.

Không may trong kênh màu Y, hầu hết đều có giá trị cao nên khó mà tách phần cần thiết. Nhưng hãy nhìn kênh M và K. Trong kênh M, phần cần thiết gần giống màu đen và kênh K, chữ số gần giống màu trắng. Nếu đảo kênh M và nhân với kênh K, chúng ta sẽ được kết quả tốt cho ảnh mask ban đầu.

scratchcard_1

Đoạn code bên dưới chỉ giữ lại contour lớn nhất

scratchcard_2

Dùng ảnh trên để lấy ký tự từ ảnh gốc

scratchcard_3

Tiếp theo là lọc bỏ nhiễu

scratchcard_4

Bây giờ nó đã hoàn hảo, các ký tự đã được tách ra khỏi background. Tiếp theo là chuyển ảnh qua Tesseract OCR để nhận dạng ký tự sẽ được chữ số chúng ta cần: 52931 75003 3794

Dưới đây là code đầy đủ

Nguồn: http://opencv-code.com/tutorials/how-to-read-the-digits-from-a-scratchcard/

3 thoughts on “Đọc mã thẻ cào điện thoại

Leave a Reply