He estado intentando durante los últimos días obtener una cuadrícula de sudoku de una imagen, y he estado luchando por obtener los cuadrados más pequeños de la cuadrícula. Estoy trabajando en la imagen de abajo. Pensé que procesar la imagen con un filtro canny funcionaría bien, pero no funcionó y no pude obtener cada contorno de cada cuadrado. Luego puse a prueba el umbral adaptativo, otsu y un umbral clásico, pero cada vez, parecía que no podía capturar cada cuadrado pequeño.
El objetivo final es obtener las celdas que contienen un número y reconocer los números con pytorch, por lo que realmente me gustaría tener algunas imágenes limpias de los números, para que el reconocimiento no se arruine :)
¿Alguien tendría una idea sobre cómo lograr esto? ¡Muchas gracias por adelantado! :RE
Respuestas:
Aquí hay una posible solución:
Obtener imagen binaria. Convertir imagen a escala de grises y umbral adaptativo
Filtre todos los números y el ruido para aislar solo las cajas. Filtramos usando el área de contorno para eliminar los números, ya que solo queremos cada celda individual
imutils.contours.sort_contours()
el parámetrotop-to-bottom
yleft-to-right
Aquí está la imagen binaria inicial (izquierda) y los números filtrados + líneas de cuadrícula reparadas + imagen invertida (derecha)
Aquí hay una visualización de la iteración de cada celda
Los números detectados en cada celda
Código
Nota: La idea de clasificación se adaptó de una respuesta anterior anterior en la extracción de color del solucionador de cubos Rubrik .
fuente
Si la imagen contiene solo la cuadrícula de sudoku ajustada, una forma cruda de lograrlo sería dividir la imagen en una cuadrícula de 9X9 igual y luego tratar de extraer el número en cada una de esa cuadrícula.
fuente
Pasos:
Código:
deformado:
th3:
deformado2:
resultado de sudoku:
Todos los dígitos extraídos:
Referencias
puntos de cuadrícula
obtener características (de dígitos)
Imágenes de muestra
fuente