Przez ostatnie kilka dni starałem się uzyskać siatkę sudoku ze zdjęcia i starałem się uzyskać mniejsze kwadraty siatki. Pracuję nad obrazem poniżej. Myślałem, że przetwarzanie obrazu za pomocą filtru canny będzie działało dobrze, ale nie zadziałało i nie mogłem uzyskać każdego konturu każdego kwadratu. Następnie poddałem testowi próg adaptacyjny, otsu i klasyczny próg, ale za każdym razem wydawało się, że nie można uchwycić każdego małego kwadratu.
Ostatecznym celem jest uzyskanie komórek zawierających liczbę i rozpoznanie liczb za pomocą pytorcha, więc naprawdę chciałbym mieć jakieś czyste obrazy liczb, więc rozpoznawanie się nie psuje :)
Czy ktoś miałby pomysł, jak to osiągnąć? Z góry dziękuję! :RE
Odpowiedzi:
Oto potencjalne rozwiązanie:
Uzyskaj obraz binarny. Konwertuj obraz na skalę szarości i próg adaptacyjny
Odfiltruj wszystkie liczby i szumy, aby wyodrębnić tylko pola. Filtrujemy za pomocą obszaru konturu, aby usunąć liczby, ponieważ chcemy tylko każdej pojedynczej komórki
imutils.contours.sort_contours()
pomocą parametrutop-to-bottom
ileft-to-right
Oto początkowy obraz binarny (po lewej) i odfiltrowane liczby + naprawione linie siatki + obraz odwrócony (po prawej)
Oto wizualizacja iteracji każdej komórki
Wykryte liczby w każdej komórce
Kod
Uwaga: Pomysł sortowania został zaadaptowany ze starej poprzedniej odpowiedzi w ekstrakcji kolorów solvera Rubrika .
źródło
Jeśli obraz zawiera tylko ściśle dopasowaną siatkę sudoku, jednym prostym sposobem na osiągnięcie tego byłoby podzielenie obrazu na równą siatkę 9X9, a następnie próba wyodrębnienia liczby w każdej z tych siatek.
źródło
Kroki:
Kod:
wichrowaty:
th3:
warped2:
wynik sudoku:
Wszystkie wyodrębnione cyfry:
Bibliografia:
punkty siatki
uzyskaj funkcje (cyfr)
Próbki obrazów
źródło