afilar la imagen para detectar bordes / líneas en un objeto “X” estampado en el papel

Estoy usando python y opencv. Mi objective es detectar piezas con forma de “X” en una imagen tomada con una cámara raspberry pi. El proyecto es que tenemos tablas de tic-tac-toe preimpresas, y debemos visualizar la tabla cada vez que se coloca una nueva pieza en la tabla (con sellos de tinta). Luego, la salida indica qué tipo de pieza, si existe, está en qué sección de la tabla de tres en raya.

Aquí, tengo las líneas que he detectado en la imagen en verde:

Como puede ver, las piezas en forma de “X” parecen no ser detectadas fácilmente. Sólo una línea en algunos de los sellos se “ve”.

Así es como se ve la detección de bordes después de los filtros:

Mi método para detectar la pieza en forma de “X” es verificar en cada sección las líneas con una pendiente no horizontal / vertical. Mi problema es que los sellos con forma de “X” no son líneas perfectas; Por lo tanto, mi código apenas recoge en las líneas.

He intentado aplicar un filtro de desenfoque, utilizando la ecualización de histogtwigs y solo utilizando la escala de grises para la detección de bordes. Ninguno de estos ha detectado más de 1 línea en cualquier pieza en forma de “X”.

Aproximadamente lo que estoy haciendo:

#sharpen image using blur and unsharp method gaussian_1 = cv2.GaussianBlur(image, (9,9), 10.0) unsharp_image = cv2.addWeighted(image, 1.5, gaussian_1, -0.5, 0, image) #apply filter to find stamp pieces, histogram equalization on greyscale hist_eq = cv2.equalizeHist(unsharp_image) #edge detection (input,threshold1,threshold2,size_for_sobel_operator) edges = cv2.Canny(hist_eq,50,150,apertureSize = 3) #find lines (edges,min_pixels,min_degrees,min_intersections,lineLength,LineGap) lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength,maxLineGap) 

Solo estoy aplicando esto a cada una de las 9 secciones del tablero individualmente, pero eso no es realmente importante.

TLDR: ¿Cómo puedo hacer mi imagen para que mis líneas sean “nítidas” y nítidas? Me gustaría saber qué puedo usar para hacer que una “X” estampada tenga el aspecto de unas pocas líneas.

Puede probar el detector de bordes Canny con el método robusto de Otsu para determinar el valor de umbral dual .

 im = cv2.imread('9WJTNaZ.jpg', 0) th, bw = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) edges = cv2.Canny(im, th/2, th) 

Entonces puedes usar

  • Defectos de convexidad de los contornos.

o

  • el área del contorno relleno al área del cuadro delimitador del contorno

Para diferenciar las cruces de los círculos.

Esto es lo que obtengo cuando aplico Canny a tu imagen.

bordes

Ya que estás usando sellos de tinta, implementar un método de detección de bordes y luego algún tipo de método de reconocimiento de caracteres (?) Es una forma difícil de lograr.

¿Has intentado usar un algoritmo de componentes conectados simple? Incluso con la variación de iluminación que se ve en su imagen, un poco de retoques con algunas técnicas de binarización estándar debería producir resultados razonables.

http://docs.opencv.org/master/d3/dc0/group__imgproc__shape.html#gsc.tab=0

Una vez que tenga sus componentes, tendrá datos sobre los momentos, la longitud del perímetro, etc., que lo llevarán rápidamente a un cálculo para distinguir los dos tipos de marcas.

Cualquiera que sea la técnica que utilice, considere reducir primero el tamaño de la imagen para que tenga menos píxeles para procesar. Puede notar algunos otros beneficios al crear una imagen más pequeña.

Y si puedes, agrega una pequeña luz difusa a tu cámara. Esto debería hacer su tarea de progtwigción más fácil y la detección más robusta.