Escribí un pequeño script en python donde trato de extraer o recortar la parte de la tarjeta de juego que representa solo la obra de arte, eliminando todo el resto. He estado probando varios métodos de umbralización pero no pude llegar allí. También tenga en cuenta que no puedo simplemente grabar manualmente la posición de la obra de arte porque no siempre está en la misma posición o tamaño, sino siempre en una forma rectangular donde todo lo demás es solo texto y bordes.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
binary = cv2.bitwise_not(binary)
kernel = np.ones((15, 15), np.uint8)
closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
plt.imshow(closing),plt.show()
La salida actual es lo más parecido que podría obtener. Podría estar en el camino correcto e intentar un poco más de discusión para dibujar un rectángulo alrededor de las partes blancas, pero no creo que sea un método sostenible:
Como última nota, vea las tarjetas a continuación, no todos los marcos son exactamente del mismo tamaño o posición, pero siempre hay una obra de arte con solo texto y bordes a su alrededor. No tiene que cortarse de forma súper precisa, pero claramente el arte es una "región" de la tarjeta, rodeada de otras regiones que contienen texto. Mi objetivo es tratar de capturar la región de la obra de arte lo mejor que pueda.
fuente
Respuestas:
Utilicé la transformación de línea de Hough para detectar partes lineales de la imagen. Los cruces de todas las líneas se usaron para construir todos los rectángulos posibles, que no contienen otros puntos de cruce. Dado que la parte de la tarjeta que está buscando siempre es el más grande de esos rectángulos (al menos en las muestras que proporcionó), simplemente elegí el más grande de esos rectángulos como ganador. El script funciona sin interacción del usuario.
Estos son los resultados con las muestras que proporcionó:
El código para encontrar cruces de línea se puede encontrar aquí: encuentre el punto de intersección de dos líneas dibujadas usando líneas de corte opencv
Puede leer más sobre Hough Lines aquí .
fuente
Sabemos que las tarjetas tienen límites rectos a lo largo de los ejes x e y. Podemos usar esto para extraer partes de la imagen. El siguiente código implementa la detección de líneas horizontales y verticales en la imagen.
Solo necesita hacer clic en dos áreas para incluir. Un área de clic de muestra y el resultado correspondiente son los siguientes:
Resultados de otras imágenes:
fuente
No creo que sea posible recortar automáticamente el ROI de la obra de arte utilizando técnicas de procesamiento de imágenes tradicionales debido a la naturaleza dinámica de los colores, dimensiones, ubicaciones y texturas para cada tarjeta. Tendría que buscar en la máquina / aprendizaje profundo y entrenar a su propio clasificador si desea hacerlo automáticamente. En cambio, aquí hay un enfoque manual para seleccionar y recortar un ROI estático de una imagen.
La idea es usar
cv2.setMouseCallback()
controladores de eventos para detectar si se ha hecho clic o liberado el mouse. Para esta implementación, puede extraer el ROI de la ilustración manteniendo presionado el botón izquierdo del mouse y arrastrándolo para seleccionar el ROI deseado. Una vez que haya seleccionado el ROI deseado, presionec
para recortar y guardar el ROI. Puede restablecer el ROI con el botón derecho del mouse.ROI de obras de arte guardadas
Código
fuente