Đọc số từ thẻ cào

How to read the digits from a scratchcard
Đọc số từ thẻ cào

digit

In this tutorial I will show you a possible solution for OCR-ing the digits from a scratchcard, as asked on the OpenCV Q&A. Actually it asked a different question: how to segment the LCD/LED display in an image. But the poster attached a scratchcard image which I found challenging to be ORC-ed.
Trong bài này tôi sẽ trình bày một giải pháp để lấy chữ số từ thẻ cào, như câu hỏi trong OpenCV Q&A. Thực tế thì câu hỏi khác 1 chút: làm thế nào để tách màn hình LCD/LED trong ảnh. Nhưng ảnh đính kèm lại là một thẻ cào.

Here is the problem: Given the scratchcard shown in Figure 1, how to extract the digits on the yellow-colored part?
Có một vấn đề: từ ảnh thẻ cào làm sao lấy ra chữ số từ phần màu vàng?

scratchcard

Figure 1. The original image – ảnh gốc

We can see that there are yellow and black component from the digits we want to segment. Using CMYK colorspace seems like a good idea. Theoritically in the CMYK colorspace, the yellow-colored part should have high values in the Y channel, and the black-colored digits should have high values in the K channel.
Chúng tôi thấy phần màu vàng và đen từ chữ số muốn tách. Sử dụng không gian màu CMYK là một ý tưởng hay. 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.

And guess what, CMYK colorspace is not supported in OpenCV! We’ll have to write our custom method for the conversion. See the code below.
Nhưng CMYK không được OpenCV hỗ trợ. Chúng tôi sẽ viết code để chuyển đổi, xem code bên dưới

The code above load the source image and convert it to CMYK colorspace using a custom conversion helper. The result is 4 matrices stored in a std::vector container. The C, M, Y, and K channel is shown in Figure 2.
Code trên load ảnh gốc và chuyển sang hệ màu CMYK. Kết quả là 4 ma trận chứa trong std::vector. Kênh màu C, M, Y và K được minh họa trong ảnh 2.

scratchcard_4_channel

Figure 2. The CMYK image. (a) C channel. (b) M channel. (c) Y channel. (d) K channel.

Unfortunately in the Y channel, almost all parts have high values so its difficult to segment the targeted part. But take a look at the M and K channel. In the M channel, the targeted part is near black and in the K channel, the digits are near white. If we invert the M channel and multiply it with the K channel, we’ll got good result for the initial mask.
Không may không trong 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
Keep only the largest contour – Chỉ giữ viền lớn nhất

scratchcard_2
Use the image above to extract the digits from the original image
Dùng ảnh trên để lấy ký tự từ ảnh gốc

scratchcard_3
Remove the remaining noise – lọc bỏ nhiễu

scratchcard_4

Now it’s perfect. Passing the image to Tesseract OCR.
Bây giờ nó đã hoàn hảo, chuyển ảnh qua Tesseract OCR.

will give the numbers we want:
sẽ được chữ số chúng ta cần
52931 75003 3794

Here is the complete code. – Dưới đây là code đầy đủ

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

Leave a Reply