Top Ad unit 728 × 90


Giải sudoku vẽ tay bằng xử lý ảnh dùng OpenCV


Để giải sudoku vẽ tay, cần phải thực hiện các bước sau:

– Bước 1: crop ô sudoku ra khỏi ảnh bằng cách tìm các đường thẳng ngang và dọc
– Bước 2: tìm các chữ số và nhận diện bằng thư viện chữ viết tay
– Bước 3: giải ô số sudoku theo phương pháp vét cạn

Bước 1: crop ô sudoku ra khỏi ảnh bằng cách tìm các đường thẳng ngang và dọc

Ảnh được đem ra làm ví dụ là ảnh vẽ bằng viết chì trên giấy A4. Đầu tiên là load ảnh

Chuyển ảnh thành ảnh trắng đen rồi ngịch đảo màu ảnh, vì thuật toán Houghline chỉ tìm với các pixel có giá trị 1 (màu trắng)
Làm đậm các đường kẻ vì có thể 1 số đường mỏng quá
Tìm blob lớn nhất và tô màu 255 cho nó, các blob còn lại tô màu 64 (blob là tập hợp những pixel có cùng giá trị nằm kề nhau). Như vậy lưới sudoku là blob lớn nhất
Xóa những blob có giá trị 64, chỉ chừa lại blob có giá trị 255
Tìm tất cả những đường thẳng trong hình
Giữ lại đường kẻ ngang nhất hoặc thẳng đứng nhất, như vậy đòi hỏi ảnh input không được xiêu vẹo, biến dạng. Nếu ảnh bị biến dạng nhiều thì sẽ có cách xử lý khác.
Sau đó crop ảnh dựa vào giao điểm giữa các đường, như vậy là xong bước 1

Bước 2: tìm các chữ số và nhận diện bằng thư viện chữ viết tay

Crop ảnh thành 81 ô vuông, chia đều ra rồi crop
Sử dụng SVM để nhận diện ký tự. Cuối bài có source chứa bộ data SVM huấn luyện sẵn.

Bước 3: giải ô số sudoku theo phương pháp vét cạn

Bước này mình không cần giải thích vì trên mạng có nhiều, với lại không liên quan tới xử lý ảnh.

Kết luận

Đây là phương pháp xử lý đơn giản với hình ảnh ít bị biến dạng, ít nhiễu. Đối với những ô sudoku phức tạp sẽ có phương pháp xử lý khác.

Source Code: 
Giải sudoku vẽ tay bằng xử lý ảnh dùng OpenCV Reviewed by Jacky on tháng 12 10, 2017 Rating: 5

1 nhận xét:

All Rights Reserved by Cộng Đồng OpenCV © 2017
Edit bởi: Jacky Le | Youtube Channel: JACKY LE

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.