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 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
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:
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:
dạ em muốn xin source code ạ
Trả lờiXóa